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:
parent
7223d500ac
commit
4c7a0fc8d0
@ -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;
|
||||
|
9
test/units/testsuite-57-retry-fail.service
Normal file
9
test/units/testsuite-57-retry-fail.service
Normal 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
|
10
test/units/testsuite-57-retry-upheld.service
Normal file
10
test/units/testsuite-57-retry-upheld.service
Normal 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
|
7
test/units/testsuite-57-retry-uphold.service
Normal file
7
test/units/testsuite-57-retry-uphold.service
Normal 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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user