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.
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;