From d38b53b896aa5e6682cbd68ecf8df78a11169f02 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 3 Jan 2010 11:18:34 +0100 Subject: [PATCH] [MINOR] stream_sock: enable MSG_MORE when forwarding finite amount of data While it could be dangerous to enable MSG_MORE on infinite data (eg: interactive sessions), it makes sense to enable it when we know the chunk to be sent is just a part of a larger one. --- src/stream_sock.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/stream_sock.c b/src/stream_sock.c index a9bf47aee..7e9dd2c2f 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -603,6 +603,7 @@ static int stream_sock_write_loop(struct stream_interface *si, struct buffer *b) * the ongoing FIN with the last segment. * - we know we can't send everything at once and must get back * here because of unaligned data + * - there is still a finite amount of data to forward * The test is arranged so that the most common case does only 2 * tests. */ @@ -611,8 +612,8 @@ static int stream_sock_write_loop(struct stream_interface *si, struct buffer *b) unsigned int send_flag = MSG_DONTWAIT | MSG_NOSIGNAL; if (MSG_MORE && - (((b->flags & (BF_SHUTW|BF_SHUTW_NOW|BF_HIJACK)) == BF_SHUTW_NOW && - (max == b->send_max)) || + ((b->to_forward && b->to_forward != BUF_INFINITE_FORWARD) || + ((b->flags & (BF_SHUTW|BF_SHUTW_NOW|BF_HIJACK)) == BF_SHUTW_NOW && (max == b->send_max)) || (max != b->l && max != b->send_max)) && (fdtab[si->fd].flags & FD_FL_TCP)) { send_flag |= MSG_MORE;