BUG/MEDIUM: checks: make sure to always apply offsets to now_ms in expiration
authorWilly Tarreau <w@1wt.eu>
Fri, 15 Nov 2024 14:34:46 +0000 (15:34 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 22 Nov 2024 14:34:36 +0000 (15:34 +0100)
Now_ms can be zero nowadays, so it's not suitable for direct assignment to
t->expire, as there's a risk that the timer never wakes up once assigned
(TICK_ETERNITY). Let's use tick_add(now_ms, 0) for an immediate wakeup
instead. The impact here might be health checks suddenly stopping.

This should be backported where it applies.

(cherry picked from commit 2f287f14f355e734e512732e35aebf993d000792)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/check.c
src/extcheck.c

index 64464c4..b499b3b 100644 (file)
@@ -1279,7 +1279,7 @@ struct task *process_chk_conn(struct task *t, void *context, unsigned int state)
                 * was erased during the bounce.
                 */
                if (!tick_isset(t->expire)) {
-                       t->expire = now_ms;
+                       t->expire = tick_add(now_ms, 0);
                        expired = 0;
                }
        }
index c667b16..957a447 100644 (file)
@@ -160,7 +160,7 @@ static void pid_list_expire(pid_t pid, int status)
        HA_SPIN_LOCK(PID_LIST_LOCK, &pid_list_lock);
        list_for_each_entry(elem, &pid_list, list) {
                if (elem->pid == pid) {
-                       elem->t->expire = now_ms;
+                       elem->t->expire = tick_add(now_ms, 0);
                        elem->status = status;
                        elem->exited = 1;
                        task_wakeup(elem->t, TASK_WOKEN_IO);