From 2198c08d0786c5cec1b39283831969b2cc1adf40 Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Fri, 18 Feb 2022 10:06:24 +0100 Subject: [PATCH] core: really skip automatic restart when a JOB_STOP job is pending It's not clear why we rescheduled a service auto restart while a stop job for the unit was pending. The comment claims that the unit shouldn't be restarted but the code did reschedule an auto restart meanwhile. In practice that was rarely an issue because the service waited for the next auto restart to be rescheduled, letting the queued stop job to be proceed and service_stop() to be called preventing the next restart to complete. However when RestartSec=0, the timer expired right away making PID1 to reschedule the unit again, making the timer expired right away... and so on. This busy loop prevented PID1 to handle any queued jobs (and hence giving no chance to the start rate limiting to trigger), which made the busy loop last forever. This patch breaks this loop by skipping the reschedule of the unit auto restart and hence not depending on the value of u->restart_usec anymore. Fixes: #13667 (cherry picked from commit c972880640ee19e89ce9265d8eae1b3aae190332) --- src/core/service.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/core/service.c b/src/core/service.c index d17dbb0f07..87f0d34c8c 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -2286,12 +2286,7 @@ static void service_enter_restart(Service *s) { if (unit_has_job_type(UNIT(s), JOB_STOP)) { /* Don't restart things if we are going down anyway */ - log_unit_info(UNIT(s), "Stop job pending for unit, delaying automatic restart."); - - r = service_arm_timer(s, usec_add(now(CLOCK_MONOTONIC), s->restart_usec)); - if (r < 0) - goto fail; - + log_unit_info(UNIT(s), "Stop job pending for unit, skipping automatic restart."); return; } -- 2.25.1