diff options
-rw-r--r-- | src/job.c | 7 | ||||
-rw-r--r-- | src/unit.c | 17 | ||||
-rw-r--r-- | src/unit.h | 2 |
3 files changed, 20 insertions, 6 deletions
@@ -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); |