]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MAJOR: threads/lb: fix missing unlock on map-based hash LB
authorWilly Tarreau <w@1wt.eu>
Sun, 5 Nov 2017 09:59:12 +0000 (10:59 +0100)
committerWilly Tarreau <w@1wt.eu>
Sun, 5 Nov 2017 09:59:12 +0000 (10:59 +0100)
We often left the function with the lock held on success.

src/lb_map.c

index 028e85ba0b163d892bb32913152c19fdb2583cf3..df0e185181f647e371f13d569af11ec563bcc37b 100644 (file)
@@ -224,13 +224,13 @@ struct server *map_get_server_rr(struct proxy *px, struct server *srvtoavoid)
                srv = px->lbprm.map.srv[newidx++];
                if (!srv->maxconn || (!srv->nbpend && srv->served < srv_dynamic_maxconn(srv))) {
                        /* make sure it is not the server we are try to exclude... */
+                       /* ...but remember that is was selected yet avoided */
+                       avoided = srv;
+                       avoididx = newidx;
                        if (srv != srvtoavoid) {
                                px->lbprm.map.rr_idx = newidx;
-                               return srv;
+                               goto out;
                        }
-
-                       avoided = srv;  /* ...but remember that is was selected yet avoided */
-                       avoididx = newidx;
                }
                if (newidx == px->lbprm.tot_weight)
                        newidx = 0;