From 94ca934518b5ef17755ae47d914a0319c3256476 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 6 Nov 2019 14:39:25 +0200 Subject: [PATCH] lib: ostream-file - Set TCP_QUICKACK whenever uncorking This reduces latency in some situations. --- src/lib/ostream-file-private.h | 1 + src/lib/ostream-file.c | 9 +++++++++ 2 files changed, 10 insertions(+) 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; } } -- 2.47.3