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: > 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. > 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@xxxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html