On Sat, Nov 30, 2019 at 01:16:30PM -0800, Junio C Hamano wrote: > SZEDER Gábor <szeder.dev@xxxxxxxxx> writes: > > > + ( > > + 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. > > > 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 > > }