From f8deb0cfa8126e6132f6ff033f785e13da607e8a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sat, 1 Sep 2012 17:59:22 +0200 Subject: [PATCH] MEDIUM: connection: only call tcp_connect_probe when nothing was attempted yet It was observed that after a failed send() on EAGAIN, a second connect() would still be attempted in tcp_connect_probe() because there was no way to know that a send() had failed. By checking the WANT_WR status flag, we know if a previous write attempt failed on EAGAIN, so we don't try to connect again if we know this has already failed. With this simple change, the second connect() has disappeared. --- src/connection.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/connection.c b/src/connection.c index 6ed44080c..15b94856f 100644 --- a/src/connection.c +++ b/src/connection.c @@ -89,9 +89,10 @@ int conn_fd_handler(int fd) if (unlikely(conn->flags & CO_FL_HANDSHAKE)) goto process_handshake; - if (unlikely(conn->flags & CO_FL_WAIT_L4_CONN)) { - /* still waiting for a connection to establish and no data to - * send in order to probe it ? Then let's retry the connect(). + if (unlikely(conn->flags & CO_FL_WAIT_L4_CONN) && !(conn->flags & CO_FL_WAIT_WR)) { + /* still waiting for a connection to establish and nothing was + * attempted yet to probe the connection. Then let's retry the + * connect(). */ if (!tcp_connect_probe(conn)) goto leave;