From c0daa706d329d6cc593949b7d150d4972289ba93 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 24 Feb 2011 03:24:23 +0100 Subject: [PATCH] job: also trigger on-failure dependencies when jobs faile due to dependencies, timeout --- src/job.c | 7 +++++++ src/unit.c | 17 +++++++++++------ src/unit.h | 2 ++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/job.c b/src/job.c index 54c204b65..46577fdf7 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 1ca8e82af..d75a06afc 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 e81cffca3..bd60dcb11 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); -- 2.30.2