BUG/MEDIUM: leastconn: Don't try to reposition if the server is down
It may happen that the server is going down, and fwlc_srv_reposition() is still called, because streams still attached to the server are being terminated. So in fwlc_srv_reposition(), just do nothing if we've been removed from the tree. This should fix github issue #2919. This should not be backported, unless commit 9fe72bba3cf3484577fa1ef00723de08df757996 is also backported. 
This commit is contained in:
parent
4ec5509541
commit
f59297e492
@ -330,6 +330,15 @@ static void fwlc_srv_reposition(struct server *s)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We're not in the tree, the server is probably down, don't
|
||||||
|
* do anything.
|
||||||
|
*/
|
||||||
|
if (unlikely(!s->tree_elt)) {
|
||||||
|
HA_RWLOCK_RDUNLOCK(LBPRM_LOCK, &s->proxy->lbprm.lock);
|
||||||
|
_HA_ATOMIC_STORE(&s->lb_lock, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
node = eb32_lookup(s->lb_tree, new_key);
|
node = eb32_lookup(s->lb_tree, new_key);
|
||||||
if (node)
|
if (node)
|
||||||
tree_elt = container_of(node, struct fwlc_tree_elt, lb_node);
|
tree_elt = container_of(node, struct fwlc_tree_elt, lb_node);
|
||||||
@ -462,8 +471,7 @@ static void fwlc_srv_reposition(struct server *s)
|
|||||||
|
|
||||||
__ha_barrier_store();
|
__ha_barrier_store();
|
||||||
|
|
||||||
if (s->tree_elt)
|
_HA_ATOMIC_DEC(&s->tree_elt->elements);
|
||||||
_HA_ATOMIC_DEC(&s->tree_elt->elements);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now lock the existing element, and its target list.
|
* Now lock the existing element, and its target list.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user