]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
OPTIM: lb-first: do not take the server lock on take_conn/drop_conn
authorWilly Tarreau <w@1wt.eu>
Wed, 17 Feb 2021 15:15:23 +0000 (16:15 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 18 Feb 2021 09:06:45 +0000 (10:06 +0100)
The operations are only an insert and a delete into the LB tree, which
doesn't require the server's lock at all as the lbprm lock is already
held. Let's drop it.

src/lb_fas.c

index 3debfeceb8ebecf42d4819ddd45705caac94c557..9f6dc24b910fee3785134a111fda24bec129beed 100644 (file)
@@ -36,7 +36,7 @@ static inline void fas_remove_from_tree(struct server *s)
 
 /* simply removes a server from a tree.
  *
- * The server's lock and the lbprm's lock must be held.
+ * The lbprm's lock must be held.
  */
 static inline void fas_dequeue_srv(struct server *s)
 {
@@ -49,7 +49,7 @@ static inline void fas_dequeue_srv(struct server *s)
  * reached. It is important to understand that the server weight is not used
  * here.
  *
- * The server's lock and the lbprm's lock must be held.
+ * The lbprm's lock must be held.
  */
 static inline void fas_queue_srv(struct server *s)
 {
@@ -66,18 +66,12 @@ static inline void fas_queue_srv(struct server *s)
  */
 static void fas_srv_reposition(struct server *s, int locked)
 {
-       if (!locked)
-               HA_SPIN_LOCK(SERVER_LOCK, &s->lock);
-
        HA_RWLOCK_WRLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
        if (s->lb_tree) {
                fas_dequeue_srv(s);
                fas_queue_srv(s);
        }
        HA_RWLOCK_WRUNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
-
-       if (!locked)
-               HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
 }
 
 /* This function updates the server trees according to server <srv>'s new