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.
This commit is contained in:
Willy Tarreau 2012-11-23 16:22:08 +01:00
parent 74fa7fbec9
commit b63b59641e

View File

@ -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 */