From 997b5e01a4813529ad97beb6f3fcc7234e36d399 Mon Sep 17 00:00:00 2001 From: Steven Fackler Date: Thu, 5 Jul 2018 21:36:50 -0700 Subject: [PATCH] Set TCP_NODELAY for tokio-postgres --- tokio-postgres/src/proto/connect.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/tokio-postgres/src/proto/connect.rs b/tokio-postgres/src/proto/connect.rs index f69d736f..5d7b175f 100644 --- a/tokio-postgres/src/proto/connect.rs +++ b/tokio-postgres/src/proto/connect.rs @@ -144,16 +144,9 @@ impl PollConnect for Connect { fn poll_connecting_tcp<'a>( state: &'a mut RentToOwn<'a, ConnectingTcp>, ) -> Poll { - loop { + let socket = loop { let error = match state.future.poll() { - Ok(Async::Ready(socket)) => { - let state = state.take(); - transition!(PreparingSsl { - socket: Socket::Tcp(socket), - params: state.params, - tls: state.tls, - }) - } + Ok(Async::Ready(socket)) => break socket, Ok(Async::NotReady) => match state.timeout { Some((_, ref mut delay)) => { try_ready!( @@ -177,7 +170,19 @@ impl PollConnect for Connect { if let Some((timeout, ref mut delay)) = state.timeout { delay.reset(Instant::now() + timeout); } - } + }; + + // Our read/write patterns may trigger Nagle's algorithm since we're pipelining which + // we don't want. Each individual write should be a full command we want the backend to + // see immediately. + socket.set_nodelay(true)?; + + let state = state.take(); + transition!(PreparingSsl { + socket: Socket::Tcp(socket), + params: state.params, + tls: state.tls, + }) } #[cfg(unix)]