BUG/MEDIUM: proxy: properly stop backends on soft-stop
On soft-stop, we must properlu stop backends and not only proxies with at
least a listener. This is mandatory in order to stop the health checks. A
previous fix was provided to do so (ba29687bc1 "BUG/MEDIUM: proxy: properly
stop backends"). However, only stop_proxy() function was fixed. When HAproxy
is stopped, this function is no longer used. So the same kind of fix must be
done on do_soft_stop_now().
This patch partially fixes the issue #1874. It must be backported as far as
2.4.
diff --git a/src/proxy.c b/src/proxy.c
index 93c7620..60f9231 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -2198,6 +2198,7 @@
/* perform the soft-stop right now (i.e. unbind listeners) */
static void do_soft_stop_now()
{
+ struct proxy *p;
struct task *task;
/* disable busy polling to avoid cpu eating for the new process */
@@ -2227,6 +2228,15 @@
thread_release();
+ /* Loop on proxies to stop backends */
+ p = proxies_list;
+ while (p) {
+ HA_RWLOCK_WRLOCK(PROXY_LOCK, &p->lock);
+ proxy_cond_disable(p);
+ HA_RWLOCK_WRUNLOCK(PROXY_LOCK, &p->lock);
+ p = p->next;
+ }
+
/* signal zero is used to broadcast the "stopping" event */
signal_handler(0);
}