From: Timo Sirainen Date: Wed, 6 Nov 2019 12:39:25 +0000 (+0200) Subject: lib: ostream-file - Set TCP_QUICKACK whenever uncorking X-Git-Tag: 2.3.10~308 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=94ca934518b5ef17755ae47d914a0319c3256476;p=thirdparty%2Fdovecot%2Fcore.git lib: ostream-file - Set TCP_QUICKACK whenever uncorking This reduces latency in some situations. --- diff --git a/src/lib/ostream-file-private.h b/src/lib/ostream-file-private.h index bb0acb25df..2d58933559 100644 --- a/src/lib/ostream-file-private.h +++ b/src/lib/ostream-file-private.h @@ -25,6 +25,7 @@ struct file_ostream { bool socket_cork_set:1; bool no_socket_cork:1; bool no_socket_nodelay:1; + bool no_socket_quickack:1; bool no_sendfile:1; bool autoclose_fd:1; }; diff --git a/src/lib/ostream-file.c b/src/lib/ostream-file.c index 82bf729ac0..e3a85e2b4f 100644 --- a/src/lib/ostream-file.c +++ b/src/lib/ostream-file.c @@ -387,6 +387,12 @@ static void o_stream_file_cork(struct ostream_private *stream, bool set) output is sent outside corking it may get delayed. */ o_stream_tcp_flush_via_nodelay(fstream); } + if (!set && !fstream->no_socket_quickack) { + /* Uncorking - disable delayed ACKs to reduce latency. + Note that this needs to be set repeatedly. */ + if (net_set_tcp_quickack(fstream->fd, TRUE) < 0) + fstream->no_socket_quickack = TRUE; + } stream->corked = set; } } @@ -1026,6 +1032,7 @@ static void fstream_init_file(struct file_ostream *fstream) if (S_ISREG(st.st_mode)) { fstream->no_socket_cork = TRUE; fstream->no_socket_nodelay = TRUE; + fstream->no_socket_quickack = TRUE; fstream->file = TRUE; } } @@ -1056,10 +1063,12 @@ struct ostream * o_stream_create_fd_common(int fd, size_t max_buffer_size, fstream->no_sendfile = TRUE; fstream->no_socket_cork = TRUE; fstream->no_socket_nodelay = TRUE; + fstream->no_socket_quickack = TRUE; } else if (local_ip.family == 0) { /* UNIX domain socket */ fstream->no_socket_cork = TRUE; fstream->no_socket_nodelay = TRUE; + fstream->no_socket_quickack = TRUE; } }