Thread (2 messages) 2 messages, 2 authors, 2019-12-01

Re: [PATCH] t9300-fast-import: don't hang if background fast-import exits too early

From: SZEDER Gábor <hidden>
Date: 2019-12-01 09:33:15

On Sat, Nov 30, 2019 at 01:16:30PM -0800, Junio C Hamano wrote:
SZEDER Gábor [off-list ref] writes:
quoted
+	(
+		git fast-import $options <&8 >&9 &
+		echo $! >V.fi.pid
+		wait $!
+		echo >&2 "background fast-import terminated too early with exit code $?"
+		# Un-block the read loop in the main shell process.
+		echo >&9 UNEXPECTED
+	) &
+	echo $! >V.sh.pid
 	# We don't mind if fast-import has already died by the time the test
 	# ends.
-	test_when_finished "
+	test_when_finished '
 		exec 8>&-; exec 9>&-;
-		kill $(cat V.pid) && wait $(cat V.pid)
-		true"
+		kill $(cat V.sh.pid) && wait $(cat V.sh.pid)
+		kill $(cat V.fi.pid) && wait $(cat V.sh.pid)
+		true'
The original interpolates the PID of the fast-import when
"when-finished" program is registered, so it is OK if somebody else
removed V.pid file; the new one interpolates when "when-finished"
program is run, reading from V.??.pid, so somebody needs to make
sure these pid files will stay around.  I do not think it is an
issue as I suspect we've left it to the global clean-up procedure
that removes the trash directory to remove the pid file.
In the original the same shell process starts 'git fast-import',
writes its pidfile, and registers the test_when_finished commands, so
we can be sure that the pid file is already present when the shell
runs the $(cat V.pid) command substitutions.

With this patch that's not the case anymore, because the background
subshell starts 'git fast-import' and writes the pidfile, but the main
shell process registers the test_when_finished commands.  IOW these
two shell processes are racing, and it's possible that the
test_when_finished command is executed before the background subshell
can write the pidfile.  So double quotes around the block of
test_when_finished commands are not good.
By the way, does the second "kill && wait" wait for the right
process?
Ouch, it clearly doesn't.  Copy-paste error I suppose.
Thanks for spotting it.
quoted
 background_import_still_running () {
-	if ! kill -0 "$(cat V.pid)"
+	if ! kill -0 "$(cat V.fi.pid)"
 	then
 		echo >&2 "background fast-import terminated too early"
 		false
 	fi
 }
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help