From: Willy Tarreau Date: Sun, 14 Mar 2010 18:21:34 +0000 (+0100) Subject: [MEDIUM] connect to servers even when the input has already been closed X-Git-Tag: v1.4.2~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=296897f2c6b01c3702487eecf5f413321b23528b;p=thirdparty%2Fhaproxy.git [MEDIUM] connect to servers even when the input has already been closed The BF_AUTO_CLOSE flag prevented a connection from establishing on a server if the other side's input channel was already closed. This is wrong because there may be pending data to be sent. This was causing an issue with stats, as noticed and reported by Cyril Bonté. Since the stats are now handled as a server, sometimes concurrent accesses were causing one of the connections to send the shutdown(write) before the connection to the stats function was established, which aborted it early. This fix causes the BF_AUTO_CLOSE flag to be checked only when the connection on the outgoing stream interface has reached an established state. That way we're still able to connect, send the request then close. --- diff --git a/src/session.c b/src/session.c index 515a275c05..aa7945786f 100644 --- a/src/session.c +++ b/src/session.c @@ -1331,10 +1331,12 @@ resync_stream_interface: /* first, let's check if the request buffer needs to shutdown(write), which may * happen either because the input is closed or because we want to force a close - * once the server has begun to respond. + * once the server has begun to respond. Note that we only apply it once we're + * connected, so that we still support queuing of a request with input already + * closed. */ if (unlikely((s->req->flags & (BF_SHUTW|BF_SHUTW_NOW|BF_HIJACK|BF_AUTO_CLOSE|BF_SHUTR)) == - (BF_AUTO_CLOSE|BF_SHUTR))) + (BF_AUTO_CLOSE|BF_SHUTR) && s->req->cons->state >= SI_ST_EST)) buffer_shutw_now(s->req); /* shutdown(write) pending */