]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: session: redispatch earlier when possible
authorWilly Tarreau <w@1wt.eu>
Fri, 13 Jun 2014 15:49:40 +0000 (17:49 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 13 Jun 2014 15:53:55 +0000 (17:53 +0200)
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.

src/session.c

index 0ef612dbb0565efcaade1f21ddf0dac8e814f17e..4412125ba4977019a987ca86289f5015a1a1c205 100644 (file)
@@ -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))