From 2fabd9d535898a0f9249b199853cf56deee697fa Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Sat, 9 May 2020 14:46:43 +0200 Subject: [PATCH] BUG/MEDIUM: checks: Subscribe to I/O events on an unfinished connect In tcp-check based health check, when a new connection is opened, we must wait it is really established before moving to the next rule. But at this stage, we must also be sure to subscribe to I/O events. Otherwise, depending on the timing, the health check may remains sleepy till the timeout. No backport needed. This patch should fix the issue #622. (cherry picked from commit b2a4c0d473e3c5dcb87f7d16f2ca410bafc62f64) Signed-off-by: Christopher Faulet --- src/checks.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/checks.c b/src/checks.c index 0fefdc531..2e6ffc0b7 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1679,6 +1679,7 @@ static enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct struct connection *conn = NULL; struct protocol *proto; struct xprt_ops *xprt; + struct tcpcheck_rule *next; int status, port; /* For a connect action we'll create a new connection. We may also have @@ -1772,14 +1773,12 @@ static enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct cs_attach(cs, check, &check_conn_cb); status = SF_ERR_INTERNAL; + next = get_next_tcpcheck_rule(check->tcpcheck_rules, rule); if (proto && proto->connect) { - struct tcpcheck_rule *next; int flags = 0; if (check->tcpcheck_rules->flags & TCPCHK_RULES_PROTO_CHK) flags |= CONNECT_HAS_DATA; - - next = get_next_tcpcheck_rule(check->tcpcheck_rules, rule); if (!next || next->action != TCPCHK_ACT_EXPECT) flags |= CONNECT_DELACK_ALWAYS; status = proto->connect(conn, flags); @@ -1892,6 +1891,10 @@ static enum tcpcheck_eval_ret tcpcheck_eval_connect(struct check *check, struct /* don't do anything until the connection is established */ if (conn->flags & CO_FL_WAIT_XPRT) { + if (next && next->action == TCPCHK_ACT_SEND) + conn->mux->subscribe(cs, SUB_RETRY_SEND, &check->wait_list); + else + conn->mux->subscribe(cs, SUB_RETRY_RECV, &check->wait_list); ret = TCPCHK_EVAL_WAIT; goto out; }