/* 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 fwlc_dequeue_srv(struct server *s)
{
* state is not yet committed. The current value is used to reposition the
* server in the tree. This happens when the server is used.
*
- * The server's lock and the lbprm's lock must be held.
+ * The lbprm's lock must be held.
*/
static inline void fwlc_queue_srv(struct server *s, unsigned int eweight)
{
- unsigned int inflight = s->served + s->nbpend;
+ unsigned int inflight = _HA_ATOMIC_LOAD(&s->served) + _HA_ATOMIC_LOAD(&s->nbpend);
s->lb_node.key = inflight ? (inflight + 1) * SRV_EWGHT_MAX / eweight : 0;
eb32_insert(s->lb_tree, &s->lb_node);
*/
static void fwlc_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) {
fwlc_dequeue_srv(s);
fwlc_queue_srv(s, s->cur_eweight);
}
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