From: Willy Tarreau Date: Tue, 3 Dec 2019 17:13:04 +0000 (+0100) Subject: BUG/MINOR: stream-int: avoid calling rcv_buf() when splicing is still possible X-Git-Tag: v2.2-dev1~217 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c640ef1a7d;p=thirdparty%2Fhaproxy.git BUG/MINOR: stream-int: avoid calling rcv_buf() when splicing is still possible 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. --- diff --git a/src/stream_interface.c b/src/stream_interface.c index aa9cf20324..1d84ca9ad7 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -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;