From: Thomas Haller <thaller@redhat.com>
To: NetFilter <netfilter-devel@vger.kernel.org>
Cc: Thomas Haller <thaller@redhat.com>
Subject: [PATCH nft v5 14/19] tests/shell: support running tests in parallel
Date: Wed, 6 Sep 2023 13:52:17 +0200 [thread overview]
Message-ID: <20230906120109.1773860-15-thaller@redhat.com> (raw)
In-Reply-To: <20230906120109.1773860-1-thaller@redhat.com>
Add option to enable running jobs in parallel. The purpose is to speed
up the run time of the tests.
The global cleanup (removal of kernel modules) interferes with parallel
jobs (or even with, unrelated jobs on the system). By setting
NFT_TEST_JOBS= to a positive number, that cleanup is skipped.
This option is too good to miss. Hence parallel execution is enabled by
default, and you have to opt-out from it.
Signed-off-by: Thomas Haller <thaller@redhat.com>
---
tests/shell/run-tests.sh | 86 ++++++++++++++++++++++++++++++++++------
1 file changed, 73 insertions(+), 13 deletions(-)
diff --git a/tests/shell/run-tests.sh b/tests/shell/run-tests.sh
index b49877fe473e..1af1c0f3013f 100755
--- a/tests/shell/run-tests.sh
+++ b/tests/shell/run-tests.sh
@@ -52,6 +52,7 @@ usage() {
echo " -R|--without-realroot : Sets NFT_TEST_HAS_REALROOT=n."
echo " -U|--no-unshare : Sets NFT_TEST_UNSHARE_CMD=\"\"."
echo " -k|--keep-logs : Sets NFT_TEST_KEEP_LOGS=y."
+ echo " -s|--sequential : Sets NFT_TEST_JOBS=0, which also enables global cleanups."
echo " -- : Separate options from tests."
echo " [TESTS...] : Other options are treated as test names,"
echo " that is, executables that are run by the runner."
@@ -89,6 +90,11 @@ usage() {
echo " Test may consider this."
echo " This is only honored when \$NFT_TEST_UNSHARE_CMD= is set. Otherwise it's detected."
echo " NFT_TEST_KEEP_LOGS=*|y: Keep the temp directory. On success, it will be deleted by default."
+ echo " NFT_TEST_JOBS=<NUM}>: number of jobs for parallel execution. Defaults to \"12\" for parallel run."
+ echo " Setting this to \"0\" or \"1\", means to run jobs sequentially."
+ echo " Setting this to \"0\" means also to perform global cleanups between tests (remove"
+ echo " kernel modules)."
+ echo " Parallel jobs requires unshare and are disabled with NFT_TEST_UNSHARE_CMD=\"\"."
echo " TMPDIR=<PATH> : select a different base directory for the result data."
}
@@ -103,6 +109,7 @@ VALGRIND="$(bool_y "$VALGRIND")"
KMEMLEAK="$(bool_y "$KMEMLEAK")"
NFT_TEST_KEEP_LOGS="$(bool_y "$NFT_TEST_KEEP_LOGS")"
NFT_TEST_HAS_REALROOT="$NFT_TEST_HAS_REALROOT"
+NFT_TEST_JOBS="${NFT_TEST_JOBS:-12}"
DO_LIST_TESTS=
TESTS=()
@@ -139,6 +146,9 @@ while [ $# -gt 0 ] ; do
-U|--no-unshare)
NFT_TEST_UNSHARE_CMD=
;;
+ -s|--sequential)
+ NFT_TEST_JOBS=0
+ ;;
--)
TESTS+=( "$@" )
shift $#
@@ -236,6 +246,14 @@ fi
# If tests wish, they can know whether they are unshared via this variable.
export NFT_TEST_HAS_UNSHARED
+# normalize the jobs number to be an integer.
+case "$NFT_TEST_JOBS" in
+ ''|*[!0-9]*) NFT_TEST_JOBS=12 ;;
+esac
+if [ -z "$NFT_TEST_UNSHARE_CMD" -a "$NFT_TEST_JOBS" -gt 1 ] ; then
+ NFT_TEST_JOBS=1
+fi
+
[ -z "$NFT" ] && NFT="$NFT_TEST_BASEDIR/../../src/nft"
${NFT} > /dev/null 2>&1
ret=$?
@@ -243,9 +261,11 @@ if [ ${ret} -eq 126 ] || [ ${ret} -eq 127 ]; then
msg_error "cannot execute nft command: $NFT"
fi
-MODPROBE="$(which modprobe)"
-if [ ! -x "$MODPROBE" ] ; then
- msg_error "no modprobe binary found"
+if [ "$NFT_TEST_JOBS" -eq 0 ] ; then
+ MODPROBE="$(which modprobe)"
+ if [ ! -x "$MODPROBE" ] ; then
+ msg_error "no modprobe binary found"
+ fi
fi
DIFF="$(which diff)"
@@ -276,6 +296,7 @@ msg_info "conf: NFT_TEST_HAS_REALROOT=$(printf '%q' "$NFT_TEST_HAS_REALROOT")"
msg_info "conf: NFT_TEST_UNSHARE_CMD=$(printf '%q' "$NFT_TEST_UNSHARE_CMD")"
msg_info "conf: NFT_TEST_HAS_UNSHARED=$(printf '%q' "$NFT_TEST_HAS_UNSHARED")"
msg_info "conf: NFT_TEST_KEEP_LOGS=$(printf '%q' "$NFT_TEST_KEEP_LOGS")"
+msg_info "conf: NFT_TEST_JOBS=$NFT_TEST_JOBS"
msg_info "conf: TMPDIR=$(printf '%q' "$_TMPDIR")"
NFT_TEST_LATEST="$_TMPDIR/nft-test.latest.$USER"
@@ -291,6 +312,11 @@ msg_info "info: NFT_TEST_BASEDIR=$(printf '%q' "$NFT_TEST_BASEDIR")"
msg_info "info: NFT_TEST_TMPDIR=$(printf '%q' "$NFT_TEST_TMPDIR")"
kernel_cleanup() {
+ if [ "$NFT_TEST_JOBS" -ne 0 ] ; then
+ # When we run jobs in parallel (even with only one "parallel"
+ # job via `NFT_TEST_JOBS=1`), we skip such global cleanups.
+ return
+ fi
if [ "$NFT_TEST_HAS_UNSHARED" != y ] ; then
$NFT flush ruleset
fi
@@ -428,28 +454,62 @@ print_test_result() {
fi
}
+declare -A JOBS_TEMPDIR
+declare -A JOBS_PIDLIST
+
+job_start() {
+ local testfile="$1"
+
+ if [ "$NFT_TEST_JOBS" -le 1 ] ; then
+ print_test_header I "$testfile" "EXECUTING" ""
+ fi
+
+ NFT_TEST_TESTTMPDIR="${JOBS_TEMPDIR["$testfile"]}" \
+ NFT="$NFT" NFT_REAL="$NFT_REAL" DIFF="$DIFF" DUMPGEN="$DUMPGEN" $NFT_TEST_UNSHARE_CMD "$NFT_TEST_BASEDIR/helpers/test-wrapper.sh" "$testfile"
+ local rc_got=$?
+
+ if [ "$NFT_TEST_JOBS" -le 1 ] ; then
+ echo -en "\033[1A\033[K" # clean the [EXECUTING] foobar line
+ fi
+
+ return "$rc_got"
+}
+
+job_wait()
+{
+ local num_jobs="$1"
+
+ 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]}"
+ print_test_result "${JOBS_TEMPDIR["$testfile2"]}" "$testfile2" "$rc_got"
+ ((JOBS_N_RUNNING--))
+ check_kmemleak
+ done
+}
+
TESTIDX=0
+JOBS_N_RUNNING=0
for testfile in "${TESTS[@]}" ; do
+ job_wait "$NFT_TEST_JOBS"
+
kernel_cleanup
((TESTIDX++))
- # We also create and export a test-specific temporary directory.
NFT_TEST_TESTTMPDIR="$NFT_TEST_TMPDIR/test-${testfile//\//-}.$TESTIDX"
mkdir "$NFT_TEST_TESTTMPDIR"
chmod 755 "$NFT_TEST_TESTTMPDIR"
- export NFT_TEST_TESTTMPDIR
-
- print_test_header I "$testfile" "EXECUTING" ""
- NFT="$NFT" NFT_REAL="$NFT_REAL" DIFF="$DIFF" DUMPGEN="$DUMPGEN" $NFT_TEST_UNSHARE_CMD "$NFT_TEST_BASEDIR/helpers/test-wrapper.sh" "$testfile"
- rc_got=$?
- echo -en "\033[1A\033[K" # clean the [EXECUTING] foobar line
-
- print_test_result "$NFT_TEST_TESTTMPDIR" "$testfile" "$rc_got"
+ JOBS_TEMPDIR["$testfile"]="$NFT_TEST_TESTTMPDIR"
- check_kmemleak
+ job_start "$testfile" &
+ JOBS_PIDLIST[$!]="$testfile"
+ ((JOBS_N_RUNNING++))
done
+job_wait 0
+
echo ""
# kmemleak may report suspected leaks
--
2.41.0
next prev parent reply other threads:[~2023-09-06 12:02 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-06 11:52 [PATCH nft v5 00/19] tests/shell: allow running tests as non-root Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 01/19] tests/shell: rework command line parsing in "run-tests.sh" Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 02/19] tests/shell: rework finding tests and add "--list-tests" option Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 03/19] tests/shell: check test names before start and support directories Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 04/19] tests/shell: export NFT_TEST_BASEDIR and NFT_TEST_TMPDIR for tests Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 05/19] tests/shell: normalize boolean configuration in environment variables Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 06/19] tests/shell: print test configuration Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 07/19] tests/shell: run each test in separate namespace and allow rootless Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 08/19] tests/shell: interpret an exit code of 77 from scripts as "skipped" Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 09/19] tests/shell: support --keep-logs option (NFT_TEST_KEEP_LOGS=y) to preserve test output Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 10/19] tests/shell: move the dump diff handling inside "test-wrapper.sh" Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 11/19] tests/shell: rework printing of test results Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 12/19] tests/shell: move taint check to "test-wrapper.sh" Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 13/19] tests/shell: move valgrind wrapper script to separate script Thomas Haller
2023-09-06 11:52 ` Thomas Haller [this message]
2023-09-06 11:52 ` [PATCH nft v5 15/19] tests/shell: bind mount private /var/run/netns in test container Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 16/19] tests/shell: skip test in rootless that hit socket buffer size limit Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 17/19] tests/shell: record the test duration (wall time) in the result data Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 18/19] tests/shell: fix "0003includepath_0" for different TMPDIR Thomas Haller
2023-09-06 11:52 ` [PATCH nft v5 19/19] tests/shell: set TMPDIR for tests in "test-wrapper.sh" Thomas Haller
2023-09-07 18:36 ` [PATCH nft v5 00/19] tests/shell: allow running tests as non-root Florian Westphal
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=20230906120109.1773860-15-thaller@redhat.com \
--to=thaller@redhat.com \
--cc=netfilter-devel@vger.kernel.org \
/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).