From: Willy Tarreau Date: Sat, 1 Sep 2012 15:59:22 +0000 (+0200) Subject: MEDIUM: connection: only call tcp_connect_probe when nothing was attempted yet X-Git-Tag: v1.5-dev12~47 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f8deb0cfa8126e6132f6ff033f785e13da607e8a;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/connection.c b/src/connection.c index 6ed44080c9..15b94856ff 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;