From: Willy Tarreau Date: Fri, 23 Nov 2012 15:22:08 +0000 (+0100) Subject: BUG/MAJOR: checks: close FD on all timeouts X-Git-Tag: v1.5-dev14~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b63b59641e7d5a8dc5cce66611c907e3bda31eb2;p=thirdparty%2Fhaproxy.git BUG/MAJOR: checks: close FD on all timeouts Since last commit, some timeouts were converted into an error to report the status, and as a result, the socket was not closed because it was supposed to have been done during the wake() call. Close the socket as soon as the timeout is detected to fix the issue. Also we now ensure to first initialize the connection flags. --- diff --git a/src/checks.c b/src/checks.c index 352e19f536..b4a937ccbf 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1295,6 +1295,7 @@ static struct task *process_chk(struct task *t) } /* prepare a new connection */ + conn->flags = CO_FL_NONE; conn->target = &s->obj_type; conn_prepare(conn, &check_conn_cb, s->check.proto, s->check.xprt, s); @@ -1382,6 +1383,16 @@ static struct task *process_chk(struct task *t) * which can happen on connect timeout or error. */ if (s->result == SRV_CHK_UNKNOWN) { + if (expired && conn->xprt) { + /* the check expired and the connection was not + * yet closed, start by doing this. + */ + conn_xprt_close(conn); + if (conn->ctrl) + fd_delete(conn->t.sock.fd); + conn->ctrl = NULL; + } + if ((conn->flags & (CO_FL_CONNECTED|CO_FL_WAIT_L4_CONN)) == CO_FL_WAIT_L4_CONN) { /* L4 not established (yet) */ if (conn->flags & CO_FL_ERROR) @@ -1410,10 +1421,6 @@ static struct task *process_chk(struct task *t) else /* HTTP, SMTP, ... */ set_server_check_status(s, HCHK_STATUS_L7TOUT, NULL); - conn_xprt_close(conn); - if (conn->ctrl) - fd_delete(conn->t.sock.fd); - conn->ctrl = NULL; } else goto out_wait; /* timeout not reached, wait again */