Merge pull request #9158 from poettering/notify-auto-reload
trigger OnFailure= only if Restart= is not in effect
This commit is contained in:
@@ -23,6 +23,14 @@ CHANGES WITH 239 in spe:
|
||||
modified the setting by a drop-in config file, then it may be necessary
|
||||
to update the file.
|
||||
|
||||
* When OnFailure= is used in combination with Restart= on a service
|
||||
unit, then the specified units will no longer be triggered on
|
||||
failures that result in restarting. Previously, the specified units
|
||||
would be activated each time the unit failed, even when the unit was
|
||||
going to be restarted automatically. This behaviour contradicted the
|
||||
documentation. With this release the code is adjusted to match the
|
||||
documentation.
|
||||
|
||||
CHANGES WITH 238:
|
||||
|
||||
* The MemoryAccounting= unit property now defaults to on. After
|
||||
|
||||
@@ -252,7 +252,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) {
|
||||
|
||||
+1
-1
@@ -123,7 +123,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) {
|
||||
|
||||
+2
-1
@@ -657,7 +657,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) {
|
||||
|
||||
+1
-1
@@ -425,7 +425,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);
|
||||
|
||||
+1
-1
@@ -98,7 +98,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) {
|
||||
|
||||
+4
-1
@@ -1080,7 +1080,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) {
|
||||
@@ -1590,6 +1592,7 @@ static bool service_will_restart(Unit *u) {
|
||||
return false;
|
||||
if (UNIT(s)->job->type == JOB_START)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -42,7 +42,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) {
|
||||
|
||||
+1
-1
@@ -1795,7 +1795,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) {
|
||||
|
||||
+1
-1
@@ -496,7 +496,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
|
||||
|
||||
+1
-1
@@ -31,7 +31,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) {
|
||||
|
||||
+1
-1
@@ -264,7 +264,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);
|
||||
|
||||
+10
-7
@@ -1931,7 +1931,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;
|
||||
}
|
||||
|
||||
@@ -2125,6 +2125,7 @@ void unit_start_on_failure(Unit *u) {
|
||||
Unit *other;
|
||||
Iterator i;
|
||||
void *v;
|
||||
int r;
|
||||
|
||||
assert(u);
|
||||
|
||||
@@ -2134,11 +2135,11 @@ void unit_start_on_failure(Unit *u) {
|
||||
log_unit_info(u, "Triggering OnFailure= dependencies.");
|
||||
|
||||
HASHMAP_FOREACH_KEY(v, other, u->dependencies[UNIT_ON_FAILURE], i) {
|
||||
int r;
|
||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||
|
||||
r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, NULL, NULL);
|
||||
r = manager_add_job(u->manager, JOB_START, other, u->on_failure_job_mode, &error, NULL);
|
||||
if (r < 0)
|
||||
log_unit_error_errno(u, r, "Failed to enqueue OnFailure= job: %m");
|
||||
log_unit_warning_errno(u, r, "Failed to enqueue OnFailure= job, ignoring: %s", bus_error_message(&error, r));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2299,7 +2300,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;
|
||||
|
||||
@@ -2375,7 +2376,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;
|
||||
|
||||
@@ -2428,7 +2429,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -639,7 +639,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);
|
||||
|
||||
Reference in New Issue
Block a user