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

Reply via email to