From: Willy Tarreau Date: Wed, 4 Oct 2017 14:21:19 +0000 (+0200) Subject: MINOR: checks: don't create then kill a dummy connection before tcp-checks X-Git-Tag: v1.8-dev3~55 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f411cce456dabbe3cf6637f2bb11435af0499ae7;p=thirdparty%2Fhaproxy.git MINOR: checks: don't create then kill a dummy connection before tcp-checks 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. --- diff --git a/src/checks.c b/src/checks.c index e6c9a65c68..48b1d8d378 100644 --- a/src/checks.c +++ b/src/checks.c @@ -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)