core/service: reload fixlets (#39376)

Fixes https://github.com/systemd/systemd/issues/37515
This commit is contained in:
Yu Watanabe
2025-11-05 02:54:38 +09:00
committed by GitHub
17 changed files with 431 additions and 262 deletions
@@ -0,0 +1,4 @@
[Service]
Type=notify-reload
TimeoutStartSec=40
ExecStart=/usr/lib/systemd/tests/testdata/TEST-80-NOTIFYACCESS.units/reload-timeout.sh
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: LGPL-2.1-or-later
# shellcheck disable=SC2016
set -eux
set -o pipefail
COUNTER=0
sync_in() {
read -r x < /tmp/syncfifo2
test "$x" = "$1"
}
wait_for_signal() {
sleep infinity &
wait "$!" || :
}
sighup_handler() {
echo "hup$(( ++COUNTER ))" > /tmp/syncfifo1
}
trap sighup_handler SIGHUP
export SYSTEMD_LOG_LEVEL=debug
systemd-notify --ready
wait_for_signal
systemd-notify --reloading
wait_for_signal
systemd-notify --reloading
sync_in ready
systemd-notify --ready
wait_for_signal
systemd-notify --reloading --ready
exec sleep infinity
+27
View File
@@ -62,6 +62,33 @@ assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "none"
systemctl stop notify.service
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all"
# Timeout of READY=1 for Type=notify-reload services (issue #37515)
systemctl start reload-timeout.service
systemctl reload --no-block reload-timeout.service
timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-signal" ]]; do sleep .5; done'
sync_in hup1
timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-notify" ]]; do sleep .5; done'
timeout 80 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 5; done'
assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "timeout"
systemctl reload --no-block reload-timeout.service
timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-signal" ]]; do sleep .5; done'
assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
sync_in hup2
timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-notify" ]]; do sleep .5; done'
sync_out ready
timeout 40 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 1; done'
assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
systemctl reload --no-block reload-timeout.service
sync_in hup3
timeout 40 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 1; done'
assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
systemctl stop reload-timeout.service
rm /tmp/syncfifo1 /tmp/syncfifo2
# Explicitly test busctl's BUSERROR= reporting and systemctl status should show it