]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: lb/map: use seek lock and read locks where appropriate
authorWilly Tarreau <w@1wt.eu>
Sat, 17 Oct 2020 16:55:18 +0000 (18:55 +0200)
committerWilly Tarreau <w@1wt.eu>
Sat, 17 Oct 2020 17:04:27 +0000 (19:04 +0200)
- map_get_server_hash() doesn't need a write lock since it only
  reads the array, let's only use a read lock here.

- map_get_server_rr() only needs exclusivity to adjust the rr_idx
  while looking for its entry. Since this one is not used by
  map_get_server_hash(), let's turn this lock to a seek lock that
  doesn't block reads.

With 8 threads, no significant performance difference was noticed
given that lookups are usually instant with this LB algo so the
lock contention is rare.

src/lb_map.c

index 14329133167a089a0c6b4b3342173720c02586d2..b735678a8c5faf2b896a7c596569a57b21760298 100644 (file)
@@ -216,7 +216,7 @@ struct server *map_get_server_rr(struct proxy *px, struct server *srvtoavoid)
        int newidx, avoididx;
        struct server *srv, *avoided;
 
-       HA_RWLOCK_WRLOCK(LBPRM_LOCK, &px->lbprm.lock);
+       HA_RWLOCK_SKLOCK(LBPRM_LOCK, &px->lbprm.lock);
        if (px->lbprm.tot_weight == 0) {
                avoided = NULL;
                goto out;
@@ -248,7 +248,7 @@ struct server *map_get_server_rr(struct proxy *px, struct server *srvtoavoid)
                px->lbprm.map.rr_idx = avoididx;
 
   out:
-       HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &px->lbprm.lock);
+       HA_RWLOCK_SKUNLOCK(LBPRM_LOCK, &px->lbprm.lock);
        /* return NULL or srvtoavoid if found */
        return avoided;
 }
@@ -265,10 +265,10 @@ struct server *map_get_server_hash(struct proxy *px, unsigned int hash)
 {
        struct server *srv = NULL;
 
-       HA_RWLOCK_WRLOCK(LBPRM_LOCK, &px->lbprm.lock);
+       HA_RWLOCK_RDLOCK(LBPRM_LOCK, &px->lbprm.lock);
        if (px->lbprm.tot_weight)
                srv = px->lbprm.map.srv[hash % px->lbprm.tot_weight];
-       HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &px->lbprm.lock);
+       HA_RWLOCK_RDUNLOCK(LBPRM_LOCK, &px->lbprm.lock);
        return srv;
 }