From 655d29a0df2dc75431ad8f940de01553029a667c Mon Sep 17 00:00:00 2001 From: Krzysztof Piotr Oledzki Date: Mon, 4 Feb 2008 02:10:09 +0100 Subject: [PATCH] [BUG] Don't increment server connections too much + fix retries Commit 98937b875798e10fac671d109355cde29d2a411a while fixing one bug introduced another one. With "retries 4" and "option redispatch" haproxy tries to connect 4 times to one server server and 1 time to a second one. However logs showed 5 connections to the first server (the last one was counted twice) and 2 to the second. This patch also fixes srv->retries and be->retries increments. Now I get: 3 retries and 1 error in a first server (4 cum_sess) and 1 error in a second server (1 cum_sess) with: retries 4 option redispatch and: 4 retries and 1 error (5 cum_sess) with: retries 4 So, the number of connections effectively served by a server is: srv->cum_sess - srv->failed_conns - srv->retries (cherry picked from commit 626a19b66f769a87e7c995267ccedf14149e03b3) --- src/backend.c | 5 ----- src/proto_http.c | 6 ++++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/backend.c b/src/backend.c index e757acc54..88db58883 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1347,17 +1347,12 @@ int srv_count_retry_down(struct session *t, int conn_err) { /* we are in front of a retryable error */ t->conn_retries--; - if (t->srv) - t->srv->retries++; - t->be->retries++; if (t->conn_retries < 0) { /* if not retryable anymore, let's abort */ tv_eternity(&t->req->cex); srv_close_with_err(t, conn_err, SN_FINST_C, 503, error_message(t, HTTP_ERR_503)); - if (t->srv) - t->srv->cum_sess++; if (t->srv) t->srv->failed_conns++; t->be->failed_conns++; diff --git a/src/proto_http.c b/src/proto_http.c index db37035d7..c01c90aab 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -2507,8 +2507,6 @@ int process_srv(struct session *t) if (may_dequeue_tasks(t->srv, t->be)) task_wakeup(t->srv->queue_mgt); - if (t->srv) - t->srv->cum_sess++; if (t->srv) t->srv->failed_conns++; t->be->redispatches++; @@ -2520,6 +2518,10 @@ int process_srv(struct session *t) /* first, get a connection */ if (srv_redispatch_connect(t)) return t->srv_state != SV_STCONN; + } else { + if (t->srv) + t->srv->retries++; + t->be->retries++; } do {