BUG/MAJOR: threads/lb: fix missing unlock on map-based hash LB
We often left the function with the lock held on success.
diff --git a/src/lb_map.c b/src/lb_map.c
index 028e85b..df0e185 100644
--- a/src/lb_map.c
+++ b/src/lb_map.c
@@ -224,13 +224,13 @@
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;