From f552350a97f66f062a9acc94e099950b61891193 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 10 Apr 2018 17:58:38 +0200 Subject: [PATCH] Flush after writing pending TLS data. Cuts something like 600 ms away from the initial TLS handshake, as we kept having unflushed data that would require waiting for the 200 ms TCP_CORK timer. --- server.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/server.cpp b/server.cpp index 0e056fb..551679b 100644 --- a/server.cpp +++ b/server.cpp @@ -748,6 +748,22 @@ sending_data_again: } } +namespace { + +void flush_pending_data(int sock) +{ + // Flush pending data, which would otherwise wait for the 200ms TCP_CORK timer + // to elapsed; does not cancel out TCP_CORK (since that still takes priority), + // but does a one-off flush. + int one = 1; + if (setsockopt(sock, SOL_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) { + log_perror("setsockopt(TCP_NODELAY)"); + // Can still continue. + } +} + +} // namespace + bool Server::send_pending_tls_data(Client *client) { // See if there's data from the TLS library to write. @@ -780,9 +796,15 @@ send_data_again: return true; } if (ret > 0 && size_t(ret) == client->tls_data_left_to_send) { - // All data has been sent, so we don't need to go to sleep. + // All data has been sent, so we don't need to go to sleep + // (although we are likely to do so immediately afterwards, + // due to lack of client data). tls_buffer_clear(client->tls_context); client->tls_data_to_send = nullptr; + + // Flush the data we just wrote, since the client probably + // is waiting for it. + flush_pending_data(client->sock); return false; } @@ -1290,13 +1312,7 @@ bool Server::more_requests(Client *client) // Log to access_log. access_log->write(client->get_stats()); - // Flush pending data; does not cancel out TCP_CORK (since that still takes priority), - // but does a one-off flush. - int one = 1; - if (setsockopt(client->sock, SOL_TCP, TCP_NODELAY, &one, sizeof(one)) == -1) { - log_perror("setsockopt(TCP_NODELAY)"); - // Can still continue. - } + flush_pending_data(client->sock); // Switch states and reset the parsers. We don't reset statistics. client->state = Client::READING_REQUEST; -- 2.39.2