From: Olivier Doucet Date: Mon, 2 Jan 2017 10:48:57 +0000 (+0100) Subject: BUG/MINOR: option prefer-last-server must be ignored in some case X-Git-Tag: v1.8-dev1~188 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1ca1b6fe3c7bea92bf1844577303eb94fbdeef4c;p=thirdparty%2Fhaproxy.git BUG/MINOR: option prefer-last-server must be ignored in some case when using "option prefer-last-server", we may not always stay on the same backend if option balance told us otherwise. For example, backend may change in the following cases: balance hdr() balance rdp-cookie balance source balance uri balance url_param [wt: backport this to 1.7 and 1.6] --- diff --git a/src/backend.c b/src/backend.c index 3acb1daeb7..bf70ee18b1 100644 --- a/src/backend.c +++ b/src/backend.c @@ -563,12 +563,14 @@ int assign_server(struct stream *s) objt_server(conn->target) && __objt_server(conn->target)->proxy == s->be && ((s->txn && s->txn->flags & TX_PREFER_LAST) || ((s->be->options & PR_O_PREF_LAST) && + (s->be->lbprm.algo & BE_LB_KIND) != BE_LB_KIND_HI && (!s->be->max_ka_queue || server_has_room(__objt_server(conn->target)) || (__objt_server(conn->target)->nbpend + 1) < s->be->max_ka_queue))) && srv_is_usable(__objt_server(conn->target))) { /* This stream was relying on a server in a previous request - * and the proxy has "option prefer-last-server" set, so + * and the proxy has "option prefer-last-server" set + * and balance algorithm dont tell us to do otherwise, so * let's try to reuse the same server. */ srv = __objt_server(conn->target);