From 64ba5ebadcd5d98e00989d08dfaa3c94c15196c9 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 17 Feb 2021 15:15:15 +0100 Subject: [PATCH] BUG/MINOR: checks: properly handle wrapping time in __health_adjust() There's an issue when a server state changes, we use an integer comparison to decide whether or not to reschedule a test instead of using a wrapping timer comparison. This will cause some health-checks not to be immediately triggered half of the time, and some unneeded calls to task_queue() to be performed in other cases. This bug has always been there as it was introduced with the commit that added the feature, 97f07b832 ("[MEDIUM] Decrease server health based on http responses / events, version 3"). This may be backported everywhere. --- src/check.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check.c b/src/check.c index d17f747fe..06c86af79 100644 --- a/src/check.c +++ b/src/check.c @@ -481,7 +481,7 @@ void __health_adjust(struct server *s, short status) if (s->check.fastinter) { expire = tick_add(now_ms, MS_TO_TICKS(s->check.fastinter)); - if (s->check.task->expire > expire) { + if (tick_is_lt(expire, s->check.task->expire)) { s->check.task->expire = expire; /* requeue check task with new expire */ task_queue(s->check.task);