From: Jeff King <peff@peff.net>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, David Barr <david.barr@cordelta.com>
Subject: Re: [PATCH] Portability: returning void
Date: Tue, 29 Mar 2011 23:30:17 -0400 [thread overview]
Message-ID: <20110330033017.GA18157@sigill.intra.peff.net> (raw)
In-Reply-To: <20110330002921.GC14578@elie>
On Tue, Mar 29, 2011 at 07:29:21PM -0500, Jonathan Nieder wrote:
> > Did you try my 5>/dev/null patch? With it, I get no hang at all.
>
> Haven't tried it yet but will try.
>
> I really don't like that as a long-term solution. Yes, it gets prove
> to stop hanging, but meanwhile we have no control over the child
> processes we have spawned. I'd rather just drop the tests.
Agreed, it's a horrible fix. I just wanted to make sure it fixed it for
you, too. After thinking on it more, I figured out an elegant fix.
Patch is below.
-- >8 --
Subject: [PATCH] t0081: kill backgrounded processes more robustly
This test creates several background processes that write to
a fifo and then go to sleep for a while (so the reader of
the fifo does not see EOF).
Each background process is made in a curly-braced block in
the shell, and after we are done reading from the fifo, we
use "kill $!" to kill it off.
For a simple, single-command process, this works reliably
and kills the child sleep process. But for more complex
commands like "make_some_output && sleep", the results are
less predictable. When executing under bash, we end up with
a subshell that gets killed by the $! but leaves the sleep
process still alive.
This is bad not only for process hygeine (we are leaving
random sleep processes to expire after a while), but also
interacts badly with the "prove" command. When prove
executes a test, it does not realize the test is done when
it sees SIGCHLD, but rather waits until the test's stdout
pipe is closed. The orphaned sleep process may keep that
pipe open via test-lib's file descriptor 5, causing prove to
hang for 100 seconds.
The solution is to explicitly use a subshell and to exec the
final sleep process, so that when we "kill $!" we get the
process id of the sleep process.
While we're at it, let's make the "kill" process a little
more robust. Specifically:
1. Wrap the "kill" in a test_when_finished, since we want
to clean up the process whether the test succeeds or not.
2. The "kill" is part of our && chain for test success. It
probably won't fail, but it can if the process has
expired before we manage to kill it. So let's mark it
as OK to fail.
Signed-off-by: Jeff King <peff@peff.net>
---
Actually, my (2) above is unlikely to trigger, since the test would have
to hang for 100 seconds first, which probably means it is failing
anyway. But I did run across it when I screwed up my fix.
Also, is it just me, or does it seem weird that test_when_finished
blocks failing can produce test failure? I would think you would be able
to put any old cleanup crap into them and not care whether it worked or
not.
t/t0081-line-buffer.sh | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/t/t0081-line-buffer.sh b/t/t0081-line-buffer.sh
index 1dbe1c9..416ccc1 100755
--- a/t/t0081-line-buffer.sh
+++ b/t/t0081-line-buffer.sh
@@ -47,16 +47,16 @@ long_read_test () {
rm -f input &&
mkfifo input &&
{
- {
+ (
generate_tens_of_lines $tens_of_lines "$line" &&
- sleep 100
- } >input &
+ exec sleep 100
+ ) >input &
} &&
+ test_when_finished "kill $! || true" &&
test-line-buffer input <<-EOF >output &&
binary $readsize
copy $copysize
EOF
- kill $! &&
test_line_count = $lines output &&
tail -n 1 <output >actual &&
test_cmp expect actual
@@ -86,11 +86,11 @@ test_expect_success PIPE '0-length read, no input available' '
{
sleep 100 >input &
} &&
+ test_when_finished "kill $! || true" &&
test-line-buffer input <<-\EOF >actual &&
binary 0
copy 0
EOF
- kill $! &&
test_cmp expect actual
'
@@ -109,17 +109,17 @@ test_expect_success PIPE '1-byte read, no input available' '
rm -f input &&
mkfifo input &&
{
- {
+ (
printf "%s" a &&
printf "%s" b &&
- sleep 100
- } >input &
+ exec sleep 100
+ ) >input &
} &&
+ test_when_finished "kill $! || true" &&
test-line-buffer input <<-\EOF >actual &&
binary 1
copy 1
EOF
- kill $! &&
test_cmp expect actual
'
--
1.7.4.2.7.g9407
next prev parent reply other threads:[~2011-03-30 3:30 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-29 17:31 [PATCH] Portability: returning void Michael Witten
2011-03-29 20:02 ` Jonathan Nieder
2011-03-29 22:16 ` Jeff King
2011-03-29 22:36 ` Jeff King
2011-03-29 23:49 ` Jonathan Nieder
2011-03-30 0:16 ` Jeff King
2011-03-30 0:29 ` Jonathan Nieder
2011-03-30 3:30 ` Jeff King [this message]
2011-03-30 3:57 ` Jonathan Nieder
2011-03-30 4:13 ` Jeff King
2011-03-30 6:54 ` Johannes Sixt
2011-03-30 8:16 ` [PATCH/RFC svn-fe] tests: introduce helper to fill a pipe in the background Jonathan Nieder
2011-03-30 8:41 ` [PATCH] Portability: returning void Jonathan Nieder
2011-03-30 12:40 ` Jeff King
2011-03-30 18:54 ` Jonathan Nieder
2011-03-30 4:41 ` [PULL svn-fe] " Jonathan Nieder
2011-03-30 19:31 ` Junio C Hamano
2011-03-30 0:42 ` [PATCH] " Jonathan Nieder
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=20110330033017.GA18157@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=david.barr@cordelta.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.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).