]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/service: make restart delay increase more smoothly
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 6 Jul 2023 03:48:49 +0000 (12:48 +0900)
committerLennart Poettering <lennart@poettering.net>
Thu, 6 Jul 2023 09:20:13 +0000 (11:20 +0200)
Suggested in https://github.com/systemd/systemd/pull/26902#issuecomment-1620400583.

src/core/service.c

index 6831b847e8784025e5bee4f9c1f832c0628a99d2..efe6c23f0ce7c8207be1922c0dd9e6a090b250c6 100644 (file)
@@ -294,6 +294,7 @@ usec_t service_restart_usec_next(Service *s) {
 
         if (n_restarts_next <= 1 ||
             s->restart_steps == 0 ||
+            s->restart_usec == 0 ||
             s->restart_max_delay_usec == USEC_INFINITY ||
             s->restart_usec >= s->restart_max_delay_usec)
                 value = s->restart_usec;
@@ -303,10 +304,15 @@ usec_t service_restart_usec_next(Service *s) {
                 /* Enforced in service_verify() and above */
                 assert(s->restart_max_delay_usec > s->restart_usec);
 
-                /* ((restart_max_delay_usec - restart_usec)^(1/restart_steps))^(n_restart_next - 1) */
-                value = usec_add(s->restart_usec,
-                                 (usec_t) powl(s->restart_max_delay_usec - s->restart_usec,
-                                               (long double) (n_restarts_next - 1) / s->restart_steps));
+                /* 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 = 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));