git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] t5401: test SIGPIPE with parallel hooks

From
Jeff King <peff@peff.net>
Date
Apr 8, 2026, 17:30 UTC
Message-ID
<20260408173032.GB2293804@coredump.intra.peff.net>
In-Reply-To
<87v7e11j4q.fsf@collabora.com>
On Wed, Apr 08, 2026 at 08:01:25PM +0300, Adrian Ratiu wrote:
Show 10 quoted lines
> > It sounds sensible, but a standalone fix early before 2.54 final, as
> > the problem and the fix shown by Peff here looked correct, without
> > waiting for NonStop may be simpler to work with.  Then, rebuild
> > parallel series on top of the 'master' that has the fix applied,
> > perhaps?
> 
> Yes, that is the path forward now that Randall also confirmed the fix
> works on NonStop (btw thank you Randall). :)
> 
> Just waiting for Peff to tell me if he wants to send it himself.

I just sent out the fix patch, which should be good for 2.54. Here's the test patch, which I hope you'll include when re-rolling the parallel series (either as-is, or if you prefer it can be moved to another script where we're doing other parallel hook tests).

It would be nice to refer to the fix commit using its id, but we won't know what it is until Junio applies it. :) So once that happens it might be worth tweaking the commit message.

-- >8 --
Subject: t5401: test SIGPIPE with parallel hooks

We recently fixed a bug where a hook that caused us to get SIGPIPE would accidentally trigger the run_processes_parallel() cleanup handler, killing the child processes.

For a single hook, this meant killing the already-exited hook. This case was triggered by our tests, but was only a problem on some platforms.

But if you have multiple hooks running in parallel, this causes a problem everywhere, since one hook failing to read its input would take down all hooks. Now that we have parallel hook support, we can add a test for this case. It should pass already, due to the existing fix.

Signed-off-by: Jeff King <peff@peff.net>
---
 t/t5401-update-hooks.sh | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
diff --git a/t/t5401-update-hooks.sh b/t/t5401-update-hooks.sh
index 44ec875aef..f727b5d545 100755
--- a/t/t5401-update-hooks.sh
+++ b/t/t5401-update-hooks.sh
@@ -139,4 +139,42 @@ test_expect_success 'pre-receive hook that forgets to read its input' '
 	git push ./victim.git "+refs/heads/*:refs/heads/*"
 '
 
+test_expect_success 'hooks in parallel that do not read input' '
+	# Add this to our $PATH to avoid having to write the whole trash
+	# directory into our config options, which would require quoting.
+	mkdir bin &&
+	PATH=$PWD/bin:$PATH &&
+
+	write_script bin/hook-fast <<-\EOF &&
+	# This hook does not read its input, so the parent process
+	# may see SIGPIPE if it is not ignored. It should happen
+	# relatively quickly.
+	exit 0
+	EOF
+
+	write_script bin/hook-slow <<-\EOF &&
+	# This hook is slow, so we expect it to still be running
+	# when the other hook has exited (and the parent has a pipe error
+	# writing to it).
+	#
+	# So we want to be slow enough that we expect this to happen, but not
+	# so slow that the test takes forever. 1 second is probably enough
+	# in practice (and if it is occasionally not on a loaded system, we
+	# will err on the side of having the test pass).
+	sleep 1
+	exit 0
+	EOF
+
+	git init --bare parallel.git &&
+	git -C parallel.git config hook.fast.command "hook-fast" &&
+	git -C parallel.git config hook.fast.event pre-receive &&
+	git -C parallel.git config hook.fast.parallel true &&
+	git -C parallel.git config hook.slow.command "hook-slow" &&
+	git -C parallel.git config hook.slow.event pre-receive &&
+	git -C parallel.git config hook.slow.parallel true &&
+	git -C parallel.git config hook.jobs 2 &&
+
+	git push ./parallel.git "+refs/heads/*:refs/heads/*"
+'
+
 test_done
-- 
2.54.0.rc1.274.g1f8c576c50
Previous: Adrian RatiuNext: Junio C Hamano
Message 11 of 18 in “Help needed on 2.54.0-rc0 t5301.13 looping.”
  1. rsbecker@nexbridge.comApr 7, 2026
  2. Jeff KingApr 8, 2026
  3. Jeff KingApr 8, 2026
  4. Adrian RatiuApr 8, 2026
  5. rsbecker@nexbridge.comApr 8, 2026
  6. rsbecker@nexbridge.comApr 8, 2026
  7. rsbecker@nexbridge.comApr 8, 2026
  8. Junio C HamanoApr 8, 2026
  9. rsbecker@nexbridge.comApr 8, 2026
  10. Adrian RatiuApr 8, 2026
  11. t5401: test SIGPIPE with parallel hooksJeff King, Apr 8, 2026
  12. Junio C HamanoApr 8, 2026
  13. Adrian RatiuApr 8, 2026
  14. run_processes_parallel(): fix order of sigpipe handlingJeff King, Apr 8, 2026
  15. Junio C HamanoApr 8, 2026
  16. Junio C HamanoApr 8, 2026
  17. Jeff KingApr 8, 2026
  18. Junio C HamanoApr 9, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.