From: Luca Boccassi Date: Tue, 16 Dec 2025 21:44:57 +0000 (+0000) Subject: test: fix race condition in TEST-80-NOTIFYACCESS X-Git-Tag: v259~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8fba2ed2588661c91fb3d0ee6c26b034885ee475;p=thirdparty%2Fsystemd.git test: fix race condition in TEST-80-NOTIFYACCESS In some cases systemd is faster to send the SIGHUP than the script is to start the 'sleep' and background it, so it never gets interrupted later and the test is left hanging waiting for it. [ 5028.410588] systemd[1]: Starting reload-timeout.service... [ 5028.429544] reload-timeout.sh[165]: + set -o pipefail [ 5028.429544] reload-timeout.sh[165]: + COUNTER=0 [ 5028.429841] reload-timeout.sh[165]: + trap sighup_handler SIGHUP [ 5028.429841] reload-timeout.sh[165]: + export SYSTEMD_LOG_LEVEL=debug [ 5028.429841] reload-timeout.sh[165]: + SYSTEMD_LOG_LEVEL=debug [ 5028.429841] reload-timeout.sh[165]: + systemd-notify --ready [ 5028.432891] systemd[1]: reload-timeout.service: Got notification message from PID 165: READY=1 [ 5028.432908] systemd[1]: reload-timeout.service: Changed start -> running [ 5028.432983] systemd[1]: reload-timeout.service: Job 409 reload-timeout.service/start finished, result=done [ 5028.432997] systemd[1]: Started reload-timeout.service. [ 5028.433941] TEST-80-NOTIFYACCESS.sh[164]: Job for reload-timeout.service finished. [ 5028.433941] TEST-80-NOTIFYACCESS.sh[164]: Got result done/Success for job reload-timeout.service. [ 5028.433941] TEST-80-NOTIFYACCESS.sh[164]: Bus n/a: changing state RUNNING → CLOSED [ 5028.436949] TEST-80-NOTIFYACCESS.sh[99]: + systemctl reload --no-block reload-timeout.service [ 5028.444523] TEST-80-NOTIFYACCESS.sh[167]: Bus n/a: changing state UNSET → OPENING [ 5028.444523] TEST-80-NOTIFYACCESS.sh[167]: sd-bus: starting bus by connecting to /run/systemd/private... [ 5028.444523] TEST-80-NOTIFYACCESS.sh[167]: Bus n/a: changing state OPENING → AUTHENTICATING [ 5028.444523] TEST-80-NOTIFYACCESS.sh[167]: Executing dbus call org.freedesktop.systemd1.Manager ReloadUnit(reload-timeout.service, replace) [ 5028.444523] TEST-80-NOTIFYACCESS.sh[167]: Bus n/a: changing state AUTHENTICATING → RUNNING [ 5028.445202] reload-timeout.sh[165]: + wait_for_signal [ 5028.445586] reload-timeout.sh[169]: + sleep infinity [ 5028.447285] reload-timeout.sh[165]: ++ sighup_handler [ 5028.447285] reload-timeout.sh[165]: ++ echo hup1 [ 5028.444886] systemd[1]: reload-timeout.service: Trying to enqueue job reload-timeout.service/reload/replace [ 5028.445228] systemd[1]: reload-timeout.service: Installed new job reload-timeout.service/reload as 491 [ 5028.445240] systemd[1]: reload-timeout.service: Enqueued job reload-timeout.service/reload as 491 [ 5028.446601] systemd[1]: reload-timeout.service: Service has no extensions to reload. [ 5028.446799] systemd[1]: reload-timeout.service: Changed running -> reload-signal [ 5028.446881] systemd[1]: Reloading reload-timeout.service... [ 5028.451343] TEST-80-NOTIFYACCESS.sh[167]: Bus n/a: changing state RUNNING → CLOSED [ 5028.452421] TEST-80-NOTIFYACCESS.sh[99]: + timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-signal" ]]; do sleep .5; done' [ 5028.460676] TEST-80-NOTIFYACCESS.sh[172]: Bus n/a: changing state UNSET → OPENING [ 5028.460676] TEST-80-NOTIFYACCESS.sh[172]: sd-bus: starting bus by connecting to /run/systemd/private... [ 5028.462029] TEST-80-NOTIFYACCESS.sh[172]: Bus n/a: changing state OPENING → AUTHENTICATING [ 5028.462029] TEST-80-NOTIFYACCESS.sh[172]: Showing one /org/freedesktop/systemd1/unit/reload_2dtimeout_2eservice [ 5028.463759] TEST-80-NOTIFYACCESS.sh[172]: Bus n/a: changing state AUTHENTICATING → RUNNING [ 5028.470322] TEST-80-NOTIFYACCESS.sh[172]: Bus n/a: changing state RUNNING → CLOSED [ 5028.472991] TEST-80-NOTIFYACCESS.sh[99]: + sync_in hup1 [ 5028.472991] TEST-80-NOTIFYACCESS.sh[99]: + read -r x [ 5028.473839] reload-timeout.sh[165]: + wait 169 [ 5028.473996] TEST-80-NOTIFYACCESS.sh[99]: + test hup1 = hup1 [ 5028.473996] TEST-80-NOTIFYACCESS.sh[99]: + timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-notify" ]]; do sleep .5; done' [ 5038.477383] systemd[1]: TEST-80-NOTIFYACCESS.service: Failed with result 'exit-code'. (note how the 'wait' is long after SIGHUP has been processed already) Fixes https://github.com/systemd/systemd/issues/39581 Follow-up for ca8658120e1c9993bc05aa08dac2c74e618c2118 --- diff --git a/test/integration-tests/TEST-80-NOTIFYACCESS/TEST-80-NOTIFYACCESS.units/reload-timeout.sh b/test/integration-tests/TEST-80-NOTIFYACCESS/TEST-80-NOTIFYACCESS.units/reload-timeout.sh index ac0f4d27a5d..6ceecb99d41 100755 --- a/test/integration-tests/TEST-80-NOTIFYACCESS/TEST-80-NOTIFYACCESS.units/reload-timeout.sh +++ b/test/integration-tests/TEST-80-NOTIFYACCESS/TEST-80-NOTIFYACCESS.units/reload-timeout.sh @@ -12,8 +12,20 @@ sync_in() { } wait_for_signal() { + local notify="${1:?}" + local p + sleep infinity & - wait "$!" || : + p=$! + + # Notify readiness after 'sleep' is running to avoid race + # condition where the SIGHUP is sent before 'sleep' is ready to + # receive it and we get stuck + if [ "$notify" -eq 1 ]; then + systemd-notify --ready + fi + + wait "$p" || : } sighup_handler() { @@ -24,17 +36,14 @@ trap sighup_handler SIGHUP export SYSTEMD_LOG_LEVEL=debug -systemd-notify --ready - -wait_for_signal +wait_for_signal 1 systemd-notify --reloading -wait_for_signal +wait_for_signal 0 systemd-notify --reloading sync_in ready -systemd-notify --ready -wait_for_signal +wait_for_signal 1 systemd-notify --reloading --ready exec sleep infinity