core: Add trigger limit for path units
When conditions fail on a service unit, a path unit can cause PID 1 to busy loop as it keeps trying to activate the service unit. To avoid this from happening, add a trigger limit to the path unit, identical to the trigger limit we have for socket units. Initially, let's start with a high limit and not make it configurable. If needed, we can add properties to configure the rate limit similar to the ones we have for socket units.
This commit is contained in:
@@ -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) {
|
||||
@@ -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.");
|
||||
@@ -836,6 +845,7 @@ static const char* const path_result_table[_PATH_RESULT_MAX] = {
|
||||
[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);
|
||||
|
||||
Reference in New Issue
Block a user