summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/job.c7
-rw-r--r--src/unit.c17
-rw-r--r--src/unit.h2
3 files changed, 20 insertions, 6 deletions
diff --git a/src/job.c b/src/job.c
index 54c204b650..46577fdf7a 100644
--- a/src/job.c
+++ b/src/job.c
@@ -549,6 +549,13 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
}
}
+ /* Trigger OnFailure dependencies that are not generated by
+ * the unit itself. We don't tread JOB_CANCELED as failure in
+ * this context. And JOB_FAILURE is already handled by the
+ * unit itself. */
+ if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY)
+ unit_trigger_on_failure(u);
+
/* Try to start the next jobs that can be started */
SET_FOREACH(other, u->meta.dependencies[UNIT_AFTER], i)
if (other->meta.job)
diff --git a/src/unit.c b/src/unit.c
index 1ca8e82af7..d75a06afc8 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -1071,6 +1071,16 @@ static void retroactively_stop_dependencies(Unit *u) {
unit_check_unneeded(other);
}
+void unit_trigger_on_failure(Unit *u) {
+ Unit *other;
+ Iterator i;
+
+ assert(u);
+
+ SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i)
+ manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
+}
+
void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_success) {
dual_timestamp ts;
bool unexpected;
@@ -1183,13 +1193,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
}
if (ns != os && ns == UNIT_FAILED) {
- Iterator i;
- Unit *other;
-
- SET_FOREACH(other, u->meta.dependencies[UNIT_ON_FAILURE], i)
- manager_add_job(u->meta.manager, JOB_START, other, JOB_REPLACE, true, NULL, NULL);
-
log_notice("Unit %s entered failed state.", u->meta.id);
+ unit_trigger_on_failure(u);
}
/* Some names are special */
diff --git a/src/unit.h b/src/unit.h
index e81cffca3a..bd60dcb115 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -511,6 +511,8 @@ int unit_following_set(Unit *u, Set **s);
UnitType unit_name_to_type(const char *n);
bool unit_name_is_valid(const char *n, bool template_ok);
+void unit_trigger_on_failure(Unit *u);
+
const char *unit_load_state_to_string(UnitLoadState i);
UnitLoadState unit_load_state_from_string(const char *s);