]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: stream-int: avoid calling rcv_buf() when splicing is still possible
authorWilly Tarreau <w@1wt.eu>
Tue, 3 Dec 2019 17:13:04 +0000 (18:13 +0100)
committerWilly Tarreau <w@1wt.eu>
Wed, 4 Dec 2019 10:55:49 +0000 (11:55 +0100)
In si_cs_recv(), we can end up with a partial splice() call that will be
followed by an attempt to us rcv_buf(). Sometimes this works and places
data into the buffer, which then prevent splicing from being used, and
this causes splice() and recvfrom() calls to alternate. Better simply
refrain from calling rcv_buf() when there are data in the pipe and still
data to be forwarded. Usually this indicates that we've ate everything
available and that we still want to use splice() on subsequent calls.

This should be backported to 2.1 and 2.0.

src/stream_interface.c

index aa9cf203247f9cf35d6e5445fddaf84d90813a11..1d84ca9ad71628a1d7ad619e1e8f18aa68b6851e 100644 (file)
@@ -1327,6 +1327,13 @@ int si_cs_recv(struct conn_stream *cs)
                ic->pipe = NULL;
        }
 
+       if (ic->pipe && ic->to_forward && !(flags & CO_RFL_BUF_FLUSH)) {
+               /* don't break splicing by reading, but still call rcv_buf()
+                * to pass the flag.
+                */
+               goto done_recv;
+       }
+
        /* now we'll need a input buffer for the stream */
        if (!si_alloc_ibuf(si, &(si_strm(si)->buffer_wait)))
                goto end_recv;