From cfd97c6f043fb64980529a0ce26b10fecd0e8fe2 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 23 Nov 2012 17:35:59 +0100 Subject: [PATCH] BUG/MEDIUM: checks: prevent TIME_WAITs from appearing also on timeouts We need to disable lingering before closing on timeout too, otherwise we accumulate TIME_WAITs. --- src/checks.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/checks.c b/src/checks.c index e63d34e8c..7f49547ba 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1160,10 +1160,12 @@ static void event_srv_chk_r(struct connection *conn) */ if (conn->xprt && conn->xprt->shutw) conn->xprt->shutw(conn, 0); - if (!(conn->flags & CO_FL_WAIT_RD)) - recv(conn->t.sock.fd, trash.str, trash.size, MSG_NOSIGNAL|MSG_DONTWAIT); - setsockopt(conn->t.sock.fd, SOL_SOCKET, SO_LINGER, - (struct linger *) &nolinger, sizeof(struct linger)); + if (conn->ctrl) { + if (!(conn->flags & CO_FL_WAIT_RD)) + recv(conn->t.sock.fd, trash.str, trash.size, MSG_NOSIGNAL|MSG_DONTWAIT); + setsockopt(conn->t.sock.fd, SOL_SOCKET, SO_LINGER, + (struct linger *) &nolinger, sizeof(struct linger)); + } __conn_data_stop_both(conn); task_wakeup(t, TASK_WOKEN_IO); return; @@ -1383,6 +1385,9 @@ static struct task *process_chk(struct task *t) /* the check expired and the connection was not * yet closed, start by doing this. */ + if (conn->ctrl) + setsockopt(conn->t.sock.fd, SOL_SOCKET, SO_LINGER, + (struct linger *) &nolinger, sizeof(struct linger)); conn_full_close(conn); }