]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: checks: don't create then kill a dummy connection before tcp-checks
authorWilly Tarreau <w@1wt.eu>
Wed, 4 Oct 2017 14:21:19 +0000 (16:21 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 4 Oct 2017 14:29:19 +0000 (16:29 +0200)
When tcp-checks are in use, a connection starts to be created, then it's
destroyed so that tcp-check can recreate its own. Now we directly move
to tcpcheck_main() when it's detected that tcp-check is in use.

src/checks.c

index e6c9a65c6897e9dc110b686c87c6803fcab6b4c1..48b1d8d378b11575eda58a01857ab91a01dd9283 100644 (file)
@@ -1483,12 +1483,15 @@ static int connect_conn_chk(struct task *t)
        struct server *s = check->server;
        struct connection *conn = check->conn;
        struct protocol *proto;
+       struct tcpcheck_rule *tcp_rule = NULL;
        int ret;
        int quickack;
 
        /* tcpcheck send/expect initialisation */
-       if (check->type == PR_O2_TCPCHK_CHK)
+       if (check->type == PR_O2_TCPCHK_CHK) {
                check->current_step = NULL;
+               tcp_rule = get_first_tcpcheck_rule(check->tcpcheck_rules);
+       }
 
        /* prepare the check buffer.
         * This should not be used if check is the secondary agent check
@@ -1522,6 +1525,14 @@ static int connect_conn_chk(struct task *t)
                bo_putblk(check->bo, check->send_string, check->send_string_len);
        }
 
+       /* for tcp-checks, the initial connection setup is handled separately as
+        * it may be sent to a specific port and not to the server's.
+        */
+       if (tcp_rule && tcp_rule->action == TCPCHK_ACT_CONNECT) {
+               tcpcheck_main(check);
+               return SF_ERR_UP;
+       }
+
        /* prepare a new connection */
        conn_init(conn);
 
@@ -1558,19 +1569,8 @@ static int connect_conn_chk(struct task *t)
        /* only plain tcp-check supports quick ACK */
        quickack = check->type == 0 || check->type == PR_O2_TCPCHK_CHK;
 
-       if (check->type == PR_O2_TCPCHK_CHK) {
-               struct tcpcheck_rule *r = get_first_tcpcheck_rule(check->tcpcheck_rules);
-
-               if (r) {
-                       /* if first step is a 'connect', then tcpcheck_main must run it */
-                       if (r->action == TCPCHK_ACT_CONNECT) {
-                               tcpcheck_main(check);
-                               return SF_ERR_UP;
-                       }
-                       if (r->action == TCPCHK_ACT_EXPECT)
-                               quickack = 0;
-               }
-       }
+       if (tcp_rule && tcp_rule->action == TCPCHK_ACT_EXPECT)
+               quickack = 0;
 
        ret = SF_ERR_INTERNAL;
        if (proto && proto->connect)