]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
tests/shell: kill running child processes when aborting "run-tests.sh"
authorThomas Haller <thaller@redhat.com>
Tue, 12 Sep 2023 22:44:49 +0000 (00:44 +0200)
committerFlorian Westphal <fw@strlen.de>
Thu, 14 Sep 2023 12:26:44 +0000 (14:26 +0200)
When aborting "run-tests.sh", child processes were left running.  Kill
them. It's surprisingly complicated to get this somewhat right. Do it by
enabling monitor mode for each test call, so that they run in separate
process groups and we can kill the entire group.

Note that we cannot just `kill -- -$$`, because it's not clear who is in
this process group. Also, we don't want to kill the `tee` process which
handles our logging.

Signed-off-by: Thomas Haller <thaller@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
tests/shell/run-tests.sh

index f20a2bec9e9b2223fc0881df4c11e8fa79f152a0..cf17302fdc19c639cd5f000c0519b9c0fdd44605 100755 (executable)
@@ -424,12 +424,29 @@ if [ ! -x "$DIFF" ] ; then
        DIFF=true
 fi
 
+declare -A JOBS_PIDLIST
+
 cleanup_on_exit() {
+       pids_search=''
+       for pid in "${!JOBS_PIDLIST[@]}" ; do
+               kill -- "-$pid" &>/dev/null
+               pids_search="$pids_search\\|\\<$pid\\>"
+       done
+       if [ -n "$pids_search" ] ; then
+               pids_search="${pids_search:2}"
+               for i in {1..100}; do
+                       ps xh -o pgrp | grep -q "$pids_search" || break
+                       sleep 0.01
+               done
+       fi
        if [ "$NFT_TEST_KEEP_LOGS" != y -a -n "$NFT_TEST_TMPDIR" ] ; then
                rm -rf "$NFT_TEST_TMPDIR"
        fi
 }
-trap cleanup_on_exit EXIT
+
+trap 'exit 130' SIGINT
+trap 'exit 143' SIGTERM
+trap 'rc=$?; cleanup_on_exit; exit $rc' EXIT
 
 NFT_TEST_TMPDIR="$(mktemp --tmpdir="$_TMPDIR" -d "nft-test.$(date '+%Y%m%d-%H%M%S.%3N').XXXXXX")" ||
        msg_error "Failure to create temp directory in \"$_TMPDIR\""
@@ -628,7 +645,6 @@ print_test_result() {
 }
 
 declare -A JOBS_TEMPDIR
-declare -A JOBS_PIDLIST
 
 job_start() {
        local testfile="$1"
@@ -656,7 +672,8 @@ job_wait()
        while [ "$JOBS_N_RUNNING" -gt 0 -a "$JOBS_N_RUNNING" -ge "$num_jobs" ] ; do
                wait -n -p JOBCOMPLETED
                local rc_got="$?"
-               testfile2="${JOBS_PIDLIST[$JOBCOMPLETED]}"
+               local testfile2="${JOBS_PIDLIST[$JOBCOMPLETED]}"
+               unset JOBS_PIDLIST[$JOBCOMPLETED]
                print_test_result "${JOBS_TEMPDIR["$testfile2"]}" "$testfile2" "$rc_got"
                ((JOBS_N_RUNNING--))
                check_kmemleak
@@ -677,8 +694,12 @@ for testfile in "${TESTS[@]}" ; do
        chmod 755 "$NFT_TEST_TESTTMPDIR"
        JOBS_TEMPDIR["$testfile"]="$NFT_TEST_TESTTMPDIR"
 
-       job_start "$testfile" "$TESTIDX" &
-       JOBS_PIDLIST[$!]="$testfile"
+       [[ -o monitor ]] && set_old_state='set -m' || set_old_state='set +m'
+       set -m
+       ( job_start "$testfile" "$TESTIDX" ) &
+       pid=$!
+       eval "$set_old_state"
+       JOBS_PIDLIST[$pid]="$testfile"
        ((JOBS_N_RUNNING++))
 done