]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: tcpcheck: Don't rearm the check timeout on each read
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 9 Dec 2020 18:46:38 +0000 (19:46 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 11 Dec 2020 10:48:15 +0000 (11:48 +0100)
The check timeout is used to limit a health-check execution. By default
inter timeout is used. But when defined the check timeout is used. In this
case, the inter timeout (or connect timeout) is used for the connection
establishment only. And the check timeout for the health-check
execution. Thus, it must be set after a successfull connect. It means it is
rearm at the end of each connect rule.

This patch with the previous one (BUG/MINOR: http-check: Use right condition
to consider HTX message as full) should solve the issue #991. It must be
backported as far as 2.2. On the 2.3 and 2.2, there are 2 places were the
connection establishement is handled. The check timeout must be set on both.

src/tcpcheck.c

index 513170ae628cf0b03dc9f6f146d7ce96b79ffc3e..15d4a25291467606be8e43c1723393acb20d01e8 100644 (file)
@@ -1206,6 +1206,10 @@ enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct tcpchec
   out:
        if (conn && check->result == CHK_RES_FAILED)
                conn->flags |= CO_FL_ERROR;
+
+       if (ret == TCPCHK_EVAL_CONTINUE && check->proxy->timeout.check)
+               check->task->expire = tick_add_ifset(now_ms, check->proxy->timeout.check);
+
        return ret;
 }
 
@@ -2040,9 +2044,6 @@ int tcpcheck_main(struct check *check)
                case TCPCHK_ACT_EXPECT:
                        check->current_step = rule;
                        if (must_read) {
-                               if (check->proxy->timeout.check)
-                                       check->task->expire = tick_add_ifset(now_ms, check->proxy->timeout.check);
-
                                eval_ret = tcpcheck_eval_recv(check, rule);
                                if (eval_ret == TCPCHK_EVAL_STOP)
                                        goto out_end_tcpcheck;