[PATCH 1/2] run-parallel: rename set_nonblocking to set_nonblocking_or_die
- From
Stefan Beller <sbeller@google.com>
- Date
- Nov 4, 2015, 22:43 UTC
- Message-ID
- <1446677029-10745-2-git-send-email-sbeller@google.com>
- In-Reply-To
- <1446677029-10745-1-git-send-email-sbeller@google.com>
Discussion turned out a warning is not enough, but we need to die in case of blocking output as we can lockup the child processes.
Junio wrote:
Show 7 quoted lines
> Imagine that we are running two things A and B at the same time. We > ask poll(2) and it says both A and B have some data ready to be > read, and we try to read from A. strbuf_read_once() would try to > read up to 8K, relying on the fact that you earlier set the IO to be > nonblock. It will get stuck reading from A without allowing output > from B to drain. B's write may get stuck because we are not reading > from it, and would cause B to stop making progress.
Show 11 quoted lines
> What if the other sides of the connection from A and B are talking > with each other, and B's non-progress caused the processing for A on > the other side of the connection to block, causing it not to produce > more output to allow us to make progress reading from A (so that > eventually we can give B a chance to drain its output)? Imagine A > and B are pushes to the same remote, B may be pushing a change to a > submodule while A may be pushing a matching change to its > superproject, and the server may be trying to make sure that the > submodule update completes and updates the ref before making the > superproject's tree that binds that updated submodule's commit > availble, for example? Can we make any progress from that point?
Signed-off-by: Stefan Beller <sbeller@google.com> --- run-command.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/run-command.c b/run-command.c index 0a3c24e..86fbe50 100644 --- a/run-command.c +++ b/run-command.c @@ -1006,15 +1006,13 @@ static void pp_cleanup(struct parallel_processes *pp) sigchain_pop_common(); } -static void set_nonblocking(int fd) +static void set_nonblocking_or_die(int fd) { int flags = fcntl(fd, F_GETFL); if (flags < 0) - warning("Could not get file status flags, " - "output will be degraded"); + die("Could not get file status flags"); else if (fcntl(fd, F_SETFL, flags | O_NONBLOCK)) - warning("Could not set file status flags, " - "output will be degraded"); + die("Could not set file status flags"); } /* returns @@ -1052,7 +1050,7 @@ static int pp_start_one(struct parallel_processes *pp) return code ? -1 : 1; } - set_nonblocking(pp->children[i].process.err); + set_nonblocking_or_die(pp->children[i].process.err); pp->nr_processes++; pp->children[i].in_use = 1;
-- 2.6.1.247.ge8f2a41.dirty