1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
Description: Parallelize suite_driver with xargs -P
The vests suite is still sequential since it doesn't seem to go through
suite_driver which is still limiting the speedup.
.
Retrieved from upstream git, where it was added after the 2.0 release. Changed
to not print informational messages on stderr which would cause autopkgtest to
never succeed as all output on stderr is considered failure.
Author: Daniel Gröber <dxld@darkboxed.org>
Origin: upstream, https://github.com/ghdl/ghdl/commit/8d9af3c5b52ba0ac814f2a5f4cda99ea306e813a
Last-Update: 2022-11-27
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/testsuite/suite_driver.sh
+++ b/testsuite/suite_driver.sh
@@ -9,31 +9,35 @@
ANSI_RED="\033[31m"
ANSI_NOCOLOR="\033[0m"
-_suite="$1"
-shift
+parse_cmdline () {
+ _suite="$1"
+ shift
+
+ # This is the only place where test dirs are specified.
+ #Do not duplicate this line
+ dirs="*[0-9]*"
+
+ full=n
+
+ for opt; do
+ case "$opt" in
+ -k | --keep-going) full=y ;;
+ -j*) NPROC=${opt#-j} ;;
+ --dir=*) dirs="$(echo "$opt" | sed -e 's/--dir=//')" ;;
+ --skip=*) d="$(echo "$opt" | sed -e 's/--skip=//')"
+ dirs="$(echo "" "$dirs" | sed -e "s/ $d//")" ;;
+ --start-at=*) d="$(echo "$opt" | sed -e 's/--start-at=//')"
+ dirs="$(echo "" "$dirs" | sed -e "s/^.* $d//")"
+ dirs="$d $dirs" ;;
+ --list-tests) echo "$dirs"; exit 0;;
+ *) echo "Unknown option $opt"
+ exit 2
+ ;;
+ esac
+ done
-# This is the only place where test dirs are specified.
-#Do not duplicate this line
-dirs="*[0-9]*"
-
-failures=""
-full=n
-
-for opt; do
- case "$opt" in
- -k | --keep-going) full=y ;;
- --dir=*) dirs="$(echo "$opt" | sed -e 's/--dir=//')" ;;
- --skip=*) d="$(echo "$opt" | sed -e 's/--skip=//')"
- dirs="$(echo "" "$dirs" | sed -e "s/ $d//")" ;;
- --start-at=*) d="$(echo "$opt" | sed -e 's/--start-at=//')"
- dirs="$(echo "" "$dirs" | sed -e "s/^.* $d//")"
- dirs="$d $dirs" ;;
- --list-tests) echo "$dirs"; exit 0;;
- *) echo "Unknown option $opt"
- exit 2
- ;;
- esac
-done
+ NPROC=${NPROC:-$(nproc || echo 1)}
+}
singlerun() {
cd "$1"
@@ -41,21 +45,49 @@
printf "$_suite $1: ${ANSI_GREEN}ok${ANSI_NOCOLOR}\n"
# Don't disp log
else
- printf "$_suite $1: ${ANSI_RED}failed${ANSI_NOCOLOR}\n"
- cat test.log
- if [ x"$2" = x"y" ]; then
- failures="$failures $1"
- else
+ printf '%s ' "$1" >> ../failures.log
+ if [ x"$2" = x"n" ]; then
exit 1;
fi
fi
cd ..
}
-for i in $dirs; do singlerun "$i" "$full"; done
+allrun () {
+ printf '' > failures.log
+
+ if command -v xargs >/dev/null 2>&1 && [ "$NPROC" != 1 ]; then
+ echo "..Running with $NPROC test workers."
+ ndirs=$(printf '%s\n' $dirs | wc -l)
+ echo $dirs | DO_ALLRUN=0 xargs -P"$NPROC" -n$((1 + ndirs / NPROC)) sh -c \
+ 's=$1; _suite=$2 full=$3; shift 3; . "$s";
+ for i in "$@"; do singlerun "$i" "$full" || true; done' \
+ \
+ sh "$0" "$_suite" "$full" || true
+ else
+ for i in $dirs; do singlerun "$i" "$full"; done
+ fi
+
+ if [ ! -e failures.log ]; then
+ echo "error: Couldn't find test driver generated failures.log!">&2
+ exit 1
+ fi
-if [ x"$failures" = x"" ]; then
+ failures="$(cat failures.log)"
+ if [ x"$failures" = x"" ]; then
echo "$_suite tests are successful" && exit 0
-else
+ else
+ for failed in $failures; do
+ printf "$_suite $failed: ${ANSI_RED}failed${ANSI_NOCOLOR}\n"
+ cat "$failed"/test.log
+ printf '\n\n'
+ done
+
echo "$_suite test failed ($failures)" && exit 1
+ fi
+}
+
+if [ "$DO_ALLRUN" != 0 ]; then
+ parse_cmdline "$@"
+ allrun
fi
|