]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: check: Requeue healthchecks on I/O events to handle check timeout
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 3 Jun 2025 12:50:38 +0000 (14:50 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 3 Jun 2025 13:03:30 +0000 (15:03 +0200)
When a healthchecks is processed, once the first wakeup passed to start the
check, and as long as the expiration timer is not reached, only I/O events
are able to wake it up. It is an issue when there is a check timeout
defined.  Especially if the connect timeout is high and the check timeout is
low. In that case, the healthcheck's task is never requeue to handle any
timeout update. When the connection is established, the check timeout is set
to replace the connect timeout. It is thus possible to report a success
while a timeout should be reported.

So, now, when an I/O event is handled, the healthcheck is requeue, except if
an success or an abort is reported.

Thanks to Thierry Fournier for report and the reproducer.

This patch must be backported to all stable versions.

src/check.c

index 4473e008fac8c1a571a72640e63c41e556d58fef..33bc7074aa96c766ad126348a676331d6cd6a719 100644 (file)
@@ -1088,6 +1088,11 @@ int wake_srv_chk(struct stconn *sc)
                ret = -1;
                task_wakeup(check->task, TASK_WOKEN_IO);
        }
+       else {
+               /* Check in progress. Queue it to eventually handle timeout
+                * update */
+               task_queue(check->task);
+       }
 
        if (check->server)
                HA_SPIN_UNLOCK(SERVER_LOCK, &check->server->lock);