From: Willy Tarreau Date: Fri, 13 Jun 2014 15:49:40 +0000 (+0200) Subject: MEDIUM: session: redispatch earlier when possible X-Git-Tag: v1.5.0~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=33a14e515bdbb02d8193bd870f3b659243a851f9;p=thirdparty%2Fhaproxy.git MEDIUM: session: redispatch earlier when possible As discussed with Dmitry Sivachenko, is a server farm has more than one active server, uses a guaranteed non-determinist algorithm (round robin), and a connection was initiated from a non-persistent connection, there's no point insisting to reconnect to the same server after a connect failure, better redispatch upon the very first retry instead of insisting on the same server multiple times. --- diff --git a/src/session.c b/src/session.c index 0ef612dbb0..4412125ba4 100644 --- a/src/session.c +++ b/src/session.c @@ -879,8 +879,15 @@ static int sess_update_st_cer(struct session *s, struct stream_interface *si) * we must mark the session unassigned, and eventually clear the DIRECT * bit to ignore any persistence cookie. We won't count a retry nor a * redispatch yet, because this will depend on what server is selected. + * If the connection is not persistent, the balancing algorithm is not + * determinist (round robin) and there is more than one active server, + * we accept to perform an immediate redispatch without waiting since + * we don't care about this particular server. */ - if (objt_server(s->target) && si->conn_retries == 0 && + if (objt_server(s->target) && + (si->conn_retries == 0 || + (!(s->flags & SN_DIRECT) && s->be->srv_act > 1 && + ((s->be->lbprm.algo & BE_LB_KIND) == BE_LB_KIND_RR))) && s->be->options & PR_O_REDISP && !(s->flags & SN_FORCE_PRST)) { sess_change_server(s, NULL); if (may_dequeue_tasks(objt_server(s->target), s->be))