From f899b94e6341a0e0b1b0e03f56c2f0a326174c26 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 28 Mar 2008 18:09:38 +0100 Subject: [PATCH] [BUG] fix double-decrement of server connections If a client does a sudden dirty close (CL_STCLOSE) during a server connect turn-around, then the number of server connections is decremented twice. This causes huge problems on the affected server because when its connection number becomes negative, it overflows and prevents the server from accepting new connections due to an apparent saturation. The fix consists in not decrementing the counter if the server is in a turn-around state. --- src/proto_http.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index ba79c2b6c..3f8e0ac88 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2568,11 +2568,14 @@ int process_srv(struct session *t) ((t->req->l == 0 && !(req->flags & BF_WRITE_STATUS)) || t->be->options & PR_O_ABRT_CLOSE))) { /* give up */ tv_eternity(&req->cex); - fd_delete(t->srv_fd); - if (t->srv) { - t->srv->cur_sess--; - if (t->srv->proxy->lbprm.server_drop_conn) - t->srv->proxy->lbprm.server_drop_conn(t->srv); + if (!(t->flags & SN_CONN_TAR)) { + /* if we are in turn-around, we have already closed the FD */ + fd_delete(t->srv_fd); + if (t->srv) { + t->srv->cur_sess--; + if (t->srv->proxy->lbprm.server_drop_conn) + t->srv->proxy->lbprm.server_drop_conn(t->srv); + } } /* note that this must not return any error because it would be able to