From: Jeff King <peff@peff.net>
To: Wincent Colaiuta <win@wincent.com>
Cc: git@vger.kernel.org
Subject: [PATCH] status: read submodule process output before calling wait()
Date: Sun, 22 Mar 2015 03:44:56 -0400 [thread overview]
Message-ID: <20150322074455.GA1303@peff.net> (raw)
In-Reply-To: <CAPx-p4sKD0Nut3E1jnWfPPx4=--ZOxBgiVdt3RRb5tktw31qDg@mail.gmail.com>
On Sat, Mar 21, 2015 at 10:56:54PM -0700, Wincent Colaiuta wrote:
> I've never seen this hang before despite frequent use of submodules.
> Oddly, I was able to work around the hang by moving the submodule in
> two hops (one from Ansible v1.6.10 to v1.7.0, then from v1.7.0 to
> v1.8.4). I am not sure if this is specific to the Ansible repo, or
> whether the length of the summary is crossing some threshold that
> triggers the bug to manifest. If I run the forked commands manually
> from an interactive shell, they complete just fine.
It's the length of the summary. The fix is below.
-- >8 --
The status code tries to read the output of "git submodule
summary" over a pipe by waiting for the program to finish
and then reading its output, like this:
run_command(&sm_summary);
len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
Besides being a violation of the run-command API (which
makes no promises about the state of the struct after
run_command returns), this can easily lead to deadlock. The
"submodule status" process may fill up the pipe buffer and
block on write(). Meanwhile, the reading side in the parent
process is blocked in wait(), waiting for the child to
finish.
Instead, we should start the process, read everything it
produces, and only then call wait() to finish it off.
Signed-off-by: Jeff King <peff@peff.net>
---
I notice that we also don't detect when the sub-command fails. I don't
know what we would do in that case (abort the status? print a message?)
and it's orthogonal to this issue, so I left it for somebody more
clueful in the area to think about.
wt-status.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/wt-status.c b/wt-status.c
index 7036fa2..96f0033 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -748,9 +748,9 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
fflush(s->fp);
sm_summary.out = -1;
- run_command(&sm_summary);
-
+ start_command(&sm_summary);
len = strbuf_read(&cmd_stdout, sm_summary.out, 1024);
+ finish_command(&sm_summary);
/* prepend header, only if there's an actual output */
if (len) {
--
2.3.3.618.ga041503
next prev parent reply other threads:[~2015-03-22 7:45 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-22 5:56 status hangs trying to get submodule summary Wincent Colaiuta
2015-03-22 7:44 ` Jeff King [this message]
2015-03-22 8:07 ` [PATCH] status: read submodule process output before calling wait() Jeff King
2015-03-22 9:59 ` [PATCH 0/7] introduce strbuf_read_cmd to avoid deadlocks Jeff King
2015-03-22 10:00 ` [PATCH 1/7] wt-status: don't flush before running "submodule status" Jeff King
2015-03-22 10:00 ` [PATCH 2/7] wt_status: fix signedness mismatch in strbuf_read call Jeff King
2015-03-22 10:07 ` [PATCH 3/7] strbuf: introduce strbuf_read_cmd helper Jeff King
2015-03-22 19:36 ` Eric Sunshine
2015-03-22 22:54 ` Junio C Hamano
2015-03-22 23:40 ` Junio C Hamano
2015-03-23 3:53 ` [PATCH v2 0/7] introduce capture_command to avoid deadlocks Jeff King
2015-03-23 3:53 ` [PATCH v2 1/7] wt-status: don't flush before running "submodule status" Jeff King
2015-03-23 3:53 ` [PATCH v2 2/7] wt_status: fix signedness mismatch in strbuf_read call Jeff King
2015-03-23 3:53 ` [PATCH v2 3/7] run-command: introduce capture_command helper Jeff King
2015-03-23 3:53 ` [PATCH v2 4/7] wt-status: use capture_command Jeff King
2015-03-23 3:53 ` [PATCH v2 5/7] submodule: " Jeff King
2015-03-23 3:54 ` [PATCH v2 6/7] trailer: " Jeff King
2015-03-23 3:54 ` [PATCH v2 7/7] run-command: forbid using run_command with piped output Jeff King
2015-03-23 4:40 ` [PATCH v2 0/7] introduce capture_command to avoid deadlocks Junio C Hamano
2015-03-22 23:34 ` [PATCH 3/7] strbuf: introduce strbuf_read_cmd helper Jeff King
2015-03-22 23:22 ` Junio C Hamano
2015-03-22 23:36 ` Jeff King
2015-03-22 10:08 ` [PATCH 4/7] wt-status: use strbuf_read_cmd Jeff King
2015-03-22 10:08 ` [PATCH 5/7] submodule: " Jeff King
2015-03-22 10:09 ` [PATCH 6/7] trailer: " Jeff King
2015-03-22 10:10 ` [PATCH 7/7] run-command: forbid using run_command with piped output Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150322074455.GA1303@peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=win@wincent.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).