1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-08 08:58:27 +03:00

Uphold/StopWhenUnneeded/BindsTo: requeue when job finishes

When a unit is upheld and fails, and there are no state changes in
the upholder, it will not be retried, which is against what the
documentation suggests.

Requeue when the job finishes. Same for the other two queues.
This commit is contained in:
Luca Boccassi 2023-04-12 21:37:45 +01:00
parent 7223d500ac
commit 4c7a0fc8d0
5 changed files with 59 additions and 0 deletions

View File

@ -1051,6 +1051,12 @@ finish:
job_add_to_gc_queue(other->job);
}
/* Ensure that when an upheld/unneeded/bound unit activation job fails we requeue it, if it still
* necessary. If there are no state changes in the triggerer, it would not be retried otherwise. */
unit_submit_to_start_when_upheld_queue(u);
unit_submit_to_stop_when_bound_queue(u);
unit_submit_to_stop_when_unneeded_queue(u);
manager_check_finished(u->manager);
return 0;

View File

@ -0,0 +1,9 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Unit]
Description=Failed Dependency Unit
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c "if [ -f /tmp/testsuite-57-retry-fail ]; then exit 0; else exit 1; fi"
Restart=no

View File

@ -0,0 +1,10 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Unit]
Description=Upheld Unit
Requires=testsuite-57-retry-fail.service
After=testsuite-57-retry-fail.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/echo ok

View File

@ -0,0 +1,7 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Unit]
Description=Upholding Unit
Upholds=testsuite-57-retry-upheld.service
[Service]
ExecStart=/bin/sleep infinity

View File

@ -26,6 +26,33 @@ done
systemctl stop testsuite-57-uphold.service
# Idea is this:
# 1. we start testsuite-57-retry-uphold.service
# 2. which through Uphold= starts testsuite-57-retry-upheld.service
# 3. which through Requires= starts testsuite-57-retry-fail.service
# 4. which fails as /tmp/testsuite-57-retry-fail does not exist, so testsuite-57-retry-upheld.service
# is no longer restarted
# 5. we create /tmp/testsuite-57-retry-fail
# 6. now testsuite-57-retry-upheld.service will be restarted since upheld, and its dependency will
# be satisfied
rm -f /tmp/testsuite-57-retry-fail
systemctl start testsuite-57-retry-uphold.service
while ! systemctl is-failed testsuite-57-retry-fail.service ; do
sleep .5
done
systemctl is-active testsuite-57-retry-upheld.service && { echo 'unexpected success'; exit 1; }
touch /tmp/testsuite-57-retry-fail
while ! systemctl is-active testsuite-57-retry-upheld.service ; do
sleep .5
done
systemctl stop testsuite-57-retry-uphold.service testsuite-57-retry-fail.service testsuite-57-retry-upheld.service
# Idea is this:
# 1. we start testsuite-57-prop-stop-one.service
# 2. which through Wants=/After= pulls in testsuite-57-prop-stop-two.service as well