MINOR: lb/first: use a read lock in fas_get_next_server()
The "first" algorithm creates a lot of contention because all threads
focus on the same server by definition (the first available one). By
turning the exclusive lock to a read lock in fas_get_next_server(),
the request rate increases by 16% for 8 threads when many servers are
getting close to their maxconn.
diff --git a/src/lb_fas.c b/src/lb_fas.c
index 43ff6a5..e306065 100644
--- a/src/lb_fas.c
+++ b/src/lb_fas.c
@@ -300,7 +300,7 @@
srv = avoided = NULL;
- HA_RWLOCK_WRLOCK(LBPRM_LOCK, &p->lbprm.lock);
+ HA_RWLOCK_RDLOCK(LBPRM_LOCK, &p->lbprm.lock);
if (p->srv_act)
node = eb32_first(&p->lbprm.fas.act);
else if (p->lbprm.fbck) {
@@ -336,7 +336,7 @@
if (!srv)
srv = avoided;
out:
- HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &p->lbprm.lock);
+ HA_RWLOCK_RDUNLOCK(LBPRM_LOCK, &p->lbprm.lock);
return srv;
}