From 3bd3e57a9b910c371f88d26d5554ca255ca1eb96 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 20 Jan 2014 11:56:37 +0100 Subject: [PATCH] MEDIUM: tcp: report in tcp_drain() that lingering is already disabled on close When an incoming shutdown or error is detected, we know that we can safely close without disabling lingering. Do it in tcp_drain() so that we don't have to do it from each and every caller. --- src/proto_tcp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/proto_tcp.c b/src/proto_tcp.c index c02409d72..d01be31bd 100644 --- a/src/proto_tcp.c +++ b/src/proto_tcp.c @@ -541,8 +541,11 @@ int tcp_drain(int fd) #endif len = recv(fd, trash.str, trash.size, MSG_DONTWAIT | MSG_NOSIGNAL); - if (len == 0) /* cool, shutdown received */ + if (len == 0) { + /* cool, shutdown received */ + fdtab[fd].linger_risk = 0; return 1; + } if (len < 0) { if (errno == EAGAIN) /* connection not closed yet */ @@ -550,6 +553,7 @@ int tcp_drain(int fd) if (errno == EINTR) /* oops, try again */ continue; /* other errors indicate a dead connection, fine. */ + fdtab[fd].linger_risk = 0; return 1; } /* OK we read some data, let's try again once */ @@ -635,7 +639,7 @@ int tcp_connect_probe(struct connection *conn) /* Write error on the file descriptor. Report it to the connection * and disable polling on this FD. */ - + fdtab[fd].linger_risk = 0; conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH; __conn_sock_stop_both(conn); return 0;