summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2014-06-13 17:40:15 +0200
committerWilly Tarreau <w@1wt.eu>2014-06-13 17:48:45 +0200
commitdb6d012270be8184a287aabc7f670e209b243aa6 (patch)
tree2a8b07c01d99a5d2fa2fdcf592d4ef57bac4a1eb
parentb02906659b510c0c6c052d8aedff54adee395e95 (diff)
downloadhaproxy-db6d012270be8184a287aabc7f670e209b243aa6.tar.gz
MEDIUM: session: don't apply the retry delay when redispatching
The retry delay is only useful when sticking to a same server. During a redispatch, it's useless and counter-productive if we're sure to switch to another server, which is almost guaranteed when there's more than one server and the balancing algorithm is round robin, so better not pass via the turn-around state in this case. It could be done as well for leastconn, but there's a risk of always killing the delay after the recovery of a server in a farm where it's almost guaranteed to take most incoming traffic. So better only kill the delay when using round robin.
-rw-r--r--src/session.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/session.c b/src/session.c
index 414ff65c6..0ef612dbb 100644
--- a/src/session.c
+++ b/src/session.c
@@ -910,8 +910,13 @@ static int sess_update_st_cer(struct session *s, struct stream_interface *si)
if (!si->err_type)
si->err_type = SI_ET_CONN_ERR;
- si->state = SI_ST_TAR;
- si->exp = tick_add(now_ms, MS_TO_TICKS(delay));
+ /* only wait when we're retrying on the same server */
+ if (si->state == SI_ST_ASS ||
+ (s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_RR ||
+ (s->be->srv_act <= 1)) {
+ si->state = SI_ST_TAR;
+ si->exp = tick_add(now_ms, MS_TO_TICKS(delay));
+ }
return 0;
}
return 0;