diff options
Diffstat (limited to 'src/core/path.c')
-rw-r--r-- | src/core/path.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/core/path.c b/src/core/path.c index bcd922901b..f89e35a001 100644 --- a/src/core/path.c +++ b/src/core/path.c @@ -265,6 +265,9 @@ static void path_init(Unit *u) { assert(u->load_state == UNIT_STUB); p->directory_mode = 0755; + + p->trigger_limit.interval = 2 * USEC_PER_SEC; + p->trigger_limit.burst = 200; } void path_free_specs(Path *p) { @@ -480,7 +483,7 @@ static void path_enter_dead(Path *p, PathResult f) { p->result = f; unit_log_result(UNIT(p), p->result == PATH_SUCCESS, path_result_to_string(p->result)); - path_set_state(p, p->result == PATH_SUCCESS ? PATH_DEAD : PATH_FAILED); + path_set_state(p, p->result != PATH_SUCCESS ? PATH_FAILED : PATH_DEAD); } static void path_enter_running(Path *p) { @@ -494,6 +497,12 @@ static void path_enter_running(Path *p) { if (unit_stop_pending(UNIT(p))) return; + if (!ratelimit_below(&p->trigger_limit)) { + log_unit_warning(UNIT(p), "Trigger limit hit, refusing further activation."); + path_enter_dead(p, PATH_FAILURE_TRIGGER_LIMIT_HIT); + return; + } + trigger = UNIT_TRIGGER(UNIT(p)); if (!trigger) { log_unit_error(UNIT(p), "Unit to trigger vanished."); @@ -780,11 +789,6 @@ static void path_trigger_notify(Unit *u, Unit *other) { return; } - if (unit_has_failed_condition_or_assert(other)) { - path_enter_dead(p, PATH_FAILURE_UNIT_CONDITION_FAILED); - return; - } - /* Don't propagate anything if there's still a job queued */ if (other->job) return; @@ -837,11 +841,11 @@ static const char* const path_type_table[_PATH_TYPE_MAX] = { DEFINE_STRING_TABLE_LOOKUP(path_type, PathType); static const char* const path_result_table[_PATH_RESULT_MAX] = { - [PATH_SUCCESS] = "success", - [PATH_FAILURE_RESOURCES] = "resources", - [PATH_FAILURE_START_LIMIT_HIT] = "start-limit-hit", - [PATH_FAILURE_UNIT_START_LIMIT_HIT] = "unit-start-limit-hit", - [PATH_FAILURE_UNIT_CONDITION_FAILED] = "unit-condition-failed", + [PATH_SUCCESS] = "success", + [PATH_FAILURE_RESOURCES] = "resources", + [PATH_FAILURE_START_LIMIT_HIT] = "start-limit-hit", + [PATH_FAILURE_UNIT_START_LIMIT_HIT] = "unit-start-limit-hit", + [PATH_FAILURE_TRIGGER_LIMIT_HIT] = "trigger-limit-hit", }; DEFINE_STRING_TABLE_LOOKUP(path_result, PathResult); |