]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: connection: implement cs_drain_and_close()
authorWilly Tarreau <w@1wt.eu>
Fri, 11 Dec 2020 10:04:51 +0000 (11:04 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 11 Dec 2020 10:04:51 +0000 (11:04 +0100)
We had cs_close() which forces a CS_SHR_RESET mode on the read side,
and due to this there are a few call places in the checks which
perform a manual call to conn_sock_drain() before calling cs_close().
This is absurd by principle, and it can be counter-productive in the
case of a mux where this could even cause the opposite of the desired
effect by deleting pending frames on the socket before closing.

Let's add cs_drain_and_close() which uses the CS_SHR_DRAIN mode to
prepare this.

include/haproxy/connection.h

index 776a4cb5109d96c59a7c4fd4adc4c513d7ffefc0..72ba1796af885d0ec459fe9141631a1f6c0a5eae 100644 (file)
@@ -267,6 +267,14 @@ static inline void cs_close(struct conn_stream *cs)
        cs->flags = CS_FL_NONE;
 }
 
+/* completely close a conn_stream after draining possibly pending data (but do not detach it) */
+static inline void cs_drain_and_close(struct conn_stream *cs)
+{
+       cs_shutw(cs, CS_SHW_SILENT);
+       cs_shutr(cs, CS_SHR_DRAIN);
+       cs->flags = CS_FL_NONE;
+}
+
 /* sets CS_FL_ERROR or CS_FL_ERR_PENDING on the cs */
 static inline void cs_set_error(struct conn_stream *cs)
 {