Without this patch, the OnFailure action is triggered, even though there was a normal/successful restart. (e.g. with RestartForceExitStatus and SuccessExitStatus to trigger service restarts with special exit codes)
Signed-off-by: Clemens Gruber <clemens.gru...@pqgruber.com> --- ...er-OnFailure-deps-when-a-unit-is-goi.patch | 244 ++++++++++++++++++ patches/systemd-238/series | 3 +- 2 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 patches/systemd-238/0005-core-don-t-trigger-OnFailure-deps-when-a-unit-is-goi.patch diff --git a/patches/systemd-238/0005-core-don-t-trigger-OnFailure-deps-when-a-unit-is-goi.patch b/patches/systemd-238/0005-core-don-t-trigger-OnFailure-deps-when-a-unit-is-goi.patch new file mode 100644 index 000000000..b783cac3a --- /dev/null +++ b/patches/systemd-238/0005-core-don-t-trigger-OnFailure-deps-when-a-unit-is-goi.patch @@ -0,0 +1,244 @@ +From: Lennart Poettering <lenn...@poettering.net> +Date: Fri, 1 Jun 2018 19:06:19 +0200 +Subject: [PATCH] core: don't trigger OnFailure= deps when a unit is going to + restart + +This adds a flags parameter to unit_notify() which can be used to pass +additional notification information to the function. We the make the old +reload_failure boolean parameter one of these flags, and then add a new +flag that let's unit_notify() if we are configured to restart the +service. + +Note that this adjusts behaviour of systemd to match what the docs say. + +Fixes: #8398 +--- + src/core/automount.c | 2 +- + src/core/device.c | 2 +- + src/core/mount.c | 3 ++- + src/core/path.c | 2 +- + src/core/scope.c | 2 +- + src/core/service.c | 5 ++++- + src/core/slice.c | 2 +- + src/core/socket.c | 2 +- + src/core/swap.c | 2 +- + src/core/target.c | 2 +- + src/core/timer.c | 2 +- + src/core/unit.c | 10 ++++++---- + src/core/unit.h | 7 ++++++- + 13 files changed, 27 insertions(+), 16 deletions(-) + +diff --git a/src/core/automount.c b/src/core/automount.c +index 01a6ff806e16..b66c7baad7e3 100644 +--- a/src/core/automount.c ++++ b/src/core/automount.c +@@ -265,7 +265,7 @@ static void automount_set_state(Automount *a, AutomountState state) { + if (state != old_state) + log_unit_debug(UNIT(a), "Changed %s -> %s", automount_state_to_string(old_state), automount_state_to_string(state)); + +- unit_notify(UNIT(a), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(a), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int automount_coldplug(Unit *u) { +diff --git a/src/core/device.c b/src/core/device.c +index b0dd469fd14b..d92e92bdcc6b 100644 +--- a/src/core/device.c ++++ b/src/core/device.c +@@ -136,7 +136,7 @@ static void device_set_state(Device *d, DeviceState state) { + if (state != old_state) + log_unit_debug(UNIT(d), "Changed %s -> %s", device_state_to_string(old_state), device_state_to_string(state)); + +- unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int device_coldplug(Unit *u) { +diff --git a/src/core/mount.c b/src/core/mount.c +index fb55c71d3c00..46add4d6481e 100644 +--- a/src/core/mount.c ++++ b/src/core/mount.c +@@ -669,7 +669,8 @@ static void mount_set_state(Mount *m, MountState state) { + if (state != old_state) + log_unit_debug(UNIT(m), "Changed %s -> %s", mount_state_to_string(old_state), mount_state_to_string(state)); + +- unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], m->reload_result == MOUNT_SUCCESS); ++ unit_notify(UNIT(m), state_translation_table[old_state], state_translation_table[state], ++ m->reload_result == MOUNT_SUCCESS ? 0 : UNIT_NOTIFY_RELOAD_FAILURE); + } + + static int mount_coldplug(Unit *u) { +diff --git a/src/core/path.c b/src/core/path.c +index 1893d8de4581..e5e60b86e995 100644 +--- a/src/core/path.c ++++ b/src/core/path.c +@@ -438,7 +438,7 @@ static void path_set_state(Path *p, PathState state) { + if (state != old_state) + log_unit_debug(UNIT(p), "Changed %s -> %s", path_state_to_string(old_state), path_state_to_string(state)); + +- unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(p), state_translation_table[old_state], state_translation_table[state], 0); + } + + static void path_enter_waiting(Path *p, bool initial, bool recheck); +diff --git a/src/core/scope.c b/src/core/scope.c +index 5b9c2bb3c4f0..efebb2f11200 100644 +--- a/src/core/scope.c ++++ b/src/core/scope.c +@@ -111,7 +111,7 @@ static void scope_set_state(Scope *s, ScopeState state) { + if (state != old_state) + log_debug("%s changed %s -> %s", UNIT(s)->id, scope_state_to_string(old_state), scope_state_to_string(state)); + +- unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int scope_add_default_dependencies(Scope *s) { +diff --git a/src/core/service.c b/src/core/service.c +index df36019f6238..fc98ab90e9e1 100644 +--- a/src/core/service.c ++++ b/src/core/service.c +@@ -1091,7 +1091,9 @@ static void service_set_state(Service *s, ServiceState state) { + if (old_state != state) + log_unit_debug(UNIT(s), "Changed %s -> %s", service_state_to_string(old_state), service_state_to_string(state)); + +- unit_notify(UNIT(s), table[old_state], table[state], s->reload_result == SERVICE_SUCCESS); ++ unit_notify(UNIT(s), table[old_state], table[state], ++ (s->reload_result == SERVICE_SUCCESS ? 0 : UNIT_NOTIFY_RELOAD_FAILURE) | ++ (s->will_auto_restart ? UNIT_NOTIFY_WILL_AUTO_RESTART : 0)); + } + + static usec_t service_coldplug_timeout(Service *s) { +@@ -1606,6 +1608,7 @@ static bool service_will_restart(Unit *u) { + return false; + if (UNIT(s)->job->type == JOB_START) + return true; ++ + return false; + } + +diff --git a/src/core/slice.c b/src/core/slice.c +index 1c4574b8bb15..ea2dfb78f6e5 100644 +--- a/src/core/slice.c ++++ b/src/core/slice.c +@@ -55,7 +55,7 @@ static void slice_set_state(Slice *t, SliceState state) { + slice_state_to_string(old_state), + slice_state_to_string(state)); + +- unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int slice_add_parent_slice(Slice *s) { +diff --git a/src/core/socket.c b/src/core/socket.c +index 41988788b898..53226ef00694 100644 +--- a/src/core/socket.c ++++ b/src/core/socket.c +@@ -1813,7 +1813,7 @@ static void socket_set_state(Socket *s, SocketState state) { + if (state != old_state) + log_unit_debug(UNIT(s), "Changed %s -> %s", socket_state_to_string(old_state), socket_state_to_string(state)); + +- unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int socket_coldplug(Unit *u) { +diff --git a/src/core/swap.c b/src/core/swap.c +index ed397c4c9e37..96c1ef5a171e 100644 +--- a/src/core/swap.c ++++ b/src/core/swap.c +@@ -508,7 +508,7 @@ static void swap_set_state(Swap *s, SwapState state) { + if (state != old_state) + log_unit_debug(UNIT(s), "Changed %s -> %s", swap_state_to_string(old_state), swap_state_to_string(state)); + +- unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], 0); + + /* If there other units for the same device node have a job + queued it might be worth checking again if it is runnable +diff --git a/src/core/target.c b/src/core/target.c +index 756cbbfb6ce4..916f0dff4394 100644 +--- a/src/core/target.c ++++ b/src/core/target.c +@@ -44,7 +44,7 @@ static void target_set_state(Target *t, TargetState state) { + target_state_to_string(old_state), + target_state_to_string(state)); + +- unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], 0); + } + + static int target_add_default_dependencies(Target *t) { +diff --git a/src/core/timer.c b/src/core/timer.c +index ddb9c82b8715..2cf0836155aa 100644 +--- a/src/core/timer.c ++++ b/src/core/timer.c +@@ -277,7 +277,7 @@ static void timer_set_state(Timer *t, TimerState state) { + if (state != old_state) + log_unit_debug(UNIT(t), "Changed %s -> %s", timer_state_to_string(old_state), timer_state_to_string(state)); + +- unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], true); ++ unit_notify(UNIT(t), state_translation_table[old_state], state_translation_table[state], 0); + } + + static void timer_enter_waiting(Timer *t, bool initial); +diff --git a/src/core/unit.c b/src/core/unit.c +index c3056624ef23..e64ff2b8ade9 100644 +--- a/src/core/unit.c ++++ b/src/core/unit.c +@@ -1959,7 +1959,7 @@ int unit_reload(Unit *u) { + + if (!UNIT_VTABLE(u)->reload) { + /* Unit doesn't have a reload function, but we need to propagate the reload anyway */ +- unit_notify(u, unit_active_state(u), unit_active_state(u), true); ++ unit_notify(u, unit_active_state(u), unit_active_state(u), 0); + return 0; + } + +@@ -2327,7 +2327,7 @@ static void unit_update_on_console(Unit *u) { + + } + +-void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) { ++void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags) { + bool unexpected; + Manager *m; + +@@ -2403,7 +2403,7 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su + + if (u->job->state == JOB_RUNNING) { + if (ns == UNIT_ACTIVE) +- job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true, false); ++ job_finish_and_invalidate(u->job, (flags & UNIT_NOTIFY_RELOAD_FAILURE) ? JOB_FAILED : JOB_DONE, true, false); + else if (!IN_SET(ns, UNIT_ACTIVATING, UNIT_RELOADING)) { + unexpected = true; + +@@ -2456,7 +2456,9 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su + + if (ns != os && ns == UNIT_FAILED) { + log_unit_debug(u, "Unit entered failed state."); +- unit_start_on_failure(u); ++ ++ if (!(flags & UNIT_NOTIFY_WILL_AUTO_RESTART)) ++ unit_start_on_failure(u); + } + } + +diff --git a/src/core/unit.h b/src/core/unit.h +index e903bf8ad7ef..368c6eab82d9 100644 +--- a/src/core/unit.h ++++ b/src/core/unit.h +@@ -666,7 +666,12 @@ int unit_reload(Unit *u); + int unit_kill(Unit *u, KillWho w, int signo, sd_bus_error *error); + int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t control_pid, sd_bus_error *error); + +-void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success); ++typedef enum UnitNotifyFlags { ++ UNIT_NOTIFY_RELOAD_FAILURE = 1U << 0, ++ UNIT_NOTIFY_WILL_AUTO_RESTART = 1U << 1, ++} UnitNotifyFlags; ++ ++void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags); + + int unit_watch_pid(Unit *u, pid_t pid); + void unit_unwatch_pid(Unit *u, pid_t pid); diff --git a/patches/systemd-238/series b/patches/systemd-238/series index c944349f2..e3f9b1905 100644 --- a/patches/systemd-238/series +++ b/patches/systemd-238/series @@ -4,4 +4,5 @@ 0002-core-do-not-free-heap-allocated-strings-8391.patch 0003-units-Fix-SuccessAction-that-belongs-to-Unit-section.patch 0004-add-__nr_statx-defines-for-extra-architectures.patch -# 6b5baff5bd25fe8378e83fcbe60f9d0c - git-ptx-patches magic +0005-core-don-t-trigger-OnFailure-deps-when-a-unit-is-goi.patch +# 1f0962615be22e831b59404c594a352d - git-ptx-patches magic -- 2.17.1 _______________________________________________ ptxdist mailing list ptxdist@pengutronix.de