From 595e767030a13136ea9bef4eacb38f7abe6cb211 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Tue, 20 Oct 2020 17:30:08 +0200 Subject: [PATCH] MINOR: server: read-lock the cookie during srv_set_dyncookie() No need to use an exclusive lock on the proxy anymore when reading its setting, a read lock is enough. A few other places continue to use a write-lock when modifying simple flags only in order to let this function see a consistent value all along. This might be changed in the future using barriers and local copies. --- src/server.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/server.c b/src/server.c index cdb5bce68..bcef94f5b 100644 --- a/src/server.c +++ b/src/server.c @@ -103,7 +103,8 @@ int srv_getinter(const struct check *check) /* * Check that we did not get a hash collision. - * Unlikely, but it can happen. + * Unlikely, but it can happen. The server's proxy must be at least + * read-locked. */ static inline void srv_check_for_dup_dyncookie(struct server *s) { @@ -127,7 +128,7 @@ static inline void srv_check_for_dup_dyncookie(struct server *s) } /* - * Must be called with the server lock held, and will grab the proxy lock. + * Must be called with the server lock held, and will read-lock the proxy. */ void srv_set_dyncookie(struct server *s) { @@ -139,7 +140,7 @@ void srv_set_dyncookie(struct server *s) int addr_len; int port; - HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock); + HA_RWLOCK_RDLOCK(PROXY_LOCK, &p->lock); if ((s->flags & SRV_F_COOKIESET) || !(s->proxy->ck_opts & PR_CK_DYNAMIC) || @@ -188,7 +189,7 @@ void srv_set_dyncookie(struct server *s) if (!(s->next_admin & SRV_ADMF_FMAINT)) srv_check_for_dup_dyncookie(s); out: - HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock); + HA_RWLOCK_RDUNLOCK(PROXY_LOCK, &p->lock); } /*