]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/service: log the next restart usec only when we're arming timer
authorMike Yuan <me@yhndnzj.com>
Mon, 25 Sep 2023 15:23:29 +0000 (23:23 +0800)
committerMike Yuan <me@yhndnzj.com>
Tue, 26 Sep 2023 04:59:15 +0000 (12:59 +0800)
service_restart_usec_next() is also called when querying
'RestartUSecNext' dbus property. Let's avoid the redundant
logging triggered every time user does a 'systemctl status'.

src/core/service.c

index c87870d8daefdaf349389708c776dbbf61b47c74..edb39c6df6a64f44cb08b2a08463f0d9fb401876 100644 (file)
@@ -306,7 +306,6 @@ static void service_start_watchdog(Service *s) {
 
 usec_t service_restart_usec_next(Service *s) {
         unsigned n_restarts_next;
-        usec_t value;
 
         assert(s);
 
@@ -320,26 +319,23 @@ usec_t service_restart_usec_next(Service *s) {
             s->restart_usec == 0 ||
             s->restart_max_delay_usec == USEC_INFINITY ||
             s->restart_usec >= s->restart_max_delay_usec)
-                value = s->restart_usec;
-        else if (n_restarts_next > s->restart_steps)
-                value = s->restart_max_delay_usec;
-        else {
-                /* Enforced in service_verify() and above */
-                assert(s->restart_max_delay_usec > s->restart_usec);
-
-                /* r_i / r_0 = (r_n / r_0) ^ (i / n)
-                 * where,
-                 *   r_0 : initial restart usec (s->restart_usec),
-                 *   r_i : i-th restart usec (value),
-                 *   r_n : maximum restart usec (s->restart_max_delay_usec),
-                 *   i : index of the next step (n_restarts_next - 1)
-                 *   n : num maximum steps (s->restart_steps) */
-                value = (usec_t) (s->restart_usec * powl((long double) s->restart_max_delay_usec / s->restart_usec,
-                                                         (long double) (n_restarts_next - 1) / s->restart_steps));
-        }
-
-        log_unit_debug(UNIT(s), "Next restart interval calculated as: %s", FORMAT_TIMESPAN(value, 0));
-        return value;
+                return s->restart_usec;
+
+        if (n_restarts_next > s->restart_steps)
+                return s->restart_max_delay_usec;
+
+        /* Enforced in service_verify() and above */
+        assert(s->restart_max_delay_usec > s->restart_usec);
+
+        /* r_i / r_0 = (r_n / r_0) ^ (i / n)
+         * where,
+         *   r_0 : initial restart usec (s->restart_usec),
+         *   r_i : i-th restart usec (value),
+         *   r_n : maximum restart usec (s->restart_max_delay_usec),
+         *   i : index of the next step (n_restarts_next - 1)
+         *   n : num maximum steps (s->restart_steps) */
+        return (usec_t) (s->restart_usec * powl((long double) s->restart_max_delay_usec / s->restart_usec,
+                                                (long double) (n_restarts_next - 1) / s->restart_steps));
 }
 
 static void service_extend_event_source_timeout(Service *s, sd_event_source *source, usec_t extended) {
@@ -2026,6 +2022,8 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
         }
 
         if (allow_restart) {
+                usec_t restart_usec_next;
+
                 /* We make two state changes here: one that maps to the high-level UNIT_INACTIVE/UNIT_FAILED
                  * state (i.e. a state indicating deactivation), and then one that that maps to the
                  * high-level UNIT_STARTING state (i.e. a state indicating activation). We do this so that
@@ -2036,10 +2034,14 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
                 if (s->restart_mode != SERVICE_RESTART_MODE_DIRECT)
                         service_set_state(s, restart_state);
 
-                r = service_arm_timer(s, /* relative= */ true, service_restart_usec_next(s));
+                restart_usec_next = service_restart_usec_next(s);
+
+                r = service_arm_timer(s, /* relative= */ true, restart_usec_next);
                 if (r < 0)
                         goto fail;
 
+                log_unit_debug(UNIT(s), "Next restart interval calculated as: %s", FORMAT_TIMESPAN(restart_usec_next, 0));
+
                 service_set_state(s, SERVICE_AUTO_RESTART);
         } else {
                 service_set_state(s, end_state);