ci: Run meson tests in strace if it's available and can be used
authorMichel Dänzer <mdaenzer@redhat.com>
Thu, 4 Mar 2021 11:58:56 +0000 (12:58 +0100)
committerMarge Bot <eric+marge@anholt.net>
Tue, 16 Mar 2021 15:32:33 +0000 (15:32 +0000)
Keep the strace logs in job artifacts for tests which timed out.

This can be useful for figuring out why a timeout occurred.

strace cannot be used in jobs where ASAN is enabled, because ASAN's
leak checker also uses ptrace(), which isn't possible within strace.

Suggested-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9472>

.gitlab-ci.yml
.gitlab-ci/meson/build.sh
.gitlab-ci/meson/time-strace.sh [new file with mode: 0755]
.gitlab-ci/meson/time.sh [moved from .gitlab-ci/meson/test-wrapper.sh with 100% similarity]

index 45f91b3..ad72c6c 100644 (file)
@@ -197,6 +197,7 @@ success:
       # https://gitlab.com/gitlab-org/gitlab-ce/commit/8788fb925706cad594adf6917a6c5f6587dd1521
       - artifacts
       - _build/meson-logs/*.txt
+      - _build/meson-logs/strace
 
 
 # Docker image tag helper templates
@@ -586,6 +587,7 @@ sanity:
     when: always
     paths:
       - _build/meson-logs/*.txt
+      - _build/meson-logs/strace
       # scons:
       - build/*/config.log
       - shader-db
index bca9e4f..e47dc48 100755 (executable)
@@ -41,9 +41,19 @@ if [ -n "$CROSS" ]; then
 fi
 
 # Only use GNU time if available, not any shell built-in command
-if test -f /usr/bin/time; then
-    MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/test-wrapper.sh
-fi
+case $CI_JOB_NAME in
+    # ASAN leak detection is incompatible with strace
+    *-asan*)
+        if test -f /usr/bin/time; then
+            MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/time.sh
+        fi
+        ;;
+    *)
+        if test -f /usr/bin/time -a -f /usr/bin/strace; then
+            MESON_TEST_ARGS+=--wrapper=$PWD/.gitlab-ci/meson/time-strace.sh
+        fi
+        ;;
+esac
 
 rm -rf _build
 meson _build --native-file=native.file \
diff --git a/.gitlab-ci/meson/time-strace.sh b/.gitlab-ci/meson/time-strace.sh
new file mode 100755 (executable)
index 0000000..d579529
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+STRACEDIR=meson-logs/strace/$(for i in $@; do basename -z -- $i; echo -n _; done)
+
+mkdir -p $STRACEDIR
+
+# If the test times out, meson sends SIGTERM to this process.
+# Simply exec'ing "time" would result in no output from that in this case.
+# Instead, we need to run "time" in the background, catch the signals and
+# propagate them to the actual test process.
+
+/usr/bin/time -v strace -ff -tt -T -o $STRACEDIR/log "$@" &
+TIMEPID=$!
+STRACEPID=$(ps --ppid $TIMEPID -o pid=)
+TESTPID=$(ps --ppid $STRACEPID -o pid=)
+
+if test "x$TESTPID" != x; then
+    trap 'kill -TERM $TESTPID; wait $TIMEPID; exit $?' TERM
+fi
+
+wait $TIMEPID
+EXITCODE=$?
+
+# Only keep strace logs if the test timed out
+rm -rf $STRACEDIR &
+
+exit $EXITCODE