]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: connection: make conn_sock_shutw() aware of lingering
authorWilly Tarreau <w@1wt.eu>
Thu, 5 Oct 2017 15:24:42 +0000 (17:24 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 22 Oct 2017 07:54:16 +0000 (09:54 +0200)
Instead of having to manually handle lingering outside, let's make
conn_sock_shutw() check for it before calling shutdown(). We simply
don't want to emit the FIN if we're going to reset the connection
due to lingering. It's particularly important for silent-drop where
it's absolutely mandatory that no packet leaves the machine.

include/proto/connection.h
src/stream_interface.c

index 17b68dd9e618a1e5c533dfbd06b21f307c4bd8eb..defdefe9618d0472d99915a77bbb4f97bf7fd2a4 100644 (file)
@@ -432,7 +432,8 @@ static inline void conn_sock_shutw(struct connection *c)
 {
        c->flags |= CO_FL_SOCK_WR_SH;
        __conn_sock_stop_send(c);
-       if (conn_ctrl_ready(c))
+       /* don't perform a clean shutdown if we're going to reset */
+       if (conn_ctrl_ready(c) && !fdtab[c->handle.fd].linger_risk)
                shutdown(c->handle.fd, SHUT_WR);
 }
 
index 28af07e876e5774bdd9c61c002169cdd6f89b898..7838372dc345aa4ee5ba93a3a21b13f4d7d290f0 100644 (file)
@@ -861,6 +861,7 @@ static void stream_int_shutw_conn(struct stream_interface *si)
                else {
                        /* clean data-layer shutdown */
                        conn_xprt_shutw(conn);
+                       conn_sock_shutw(conn);
 
                        /* If the stream interface is configured to disable half-open
                         * connections, we'll skip the shutdown(), but only if the
@@ -869,9 +870,6 @@ static void stream_int_shutw_conn(struct stream_interface *si)
                         * waiting for the server).
                         */
                        if (!(si->flags & SI_FL_NOHALF) || !(ic->flags & (CF_SHUTR|CF_DONT_READ))) {
-                               /* We shutdown transport layer */
-                               conn_sock_shutw(conn);
-
                                if (!(ic->flags & (CF_SHUTR|CF_DONT_READ))) {
                                        /* OK just a shutw, but we want the caller
                                         * to disable polling on this FD if exists.