From: Christopher Faulet Date: Tue, 14 Mar 2023 13:33:11 +0000 (+0100) Subject: BUG/MEDIUM: proxy: properly stop backends on soft-stop X-Git-Tag: v2.8-dev6~65 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=48678e483f4f47e2a212a545399009b87503ea2d;p=thirdparty%2Fhaproxy.git 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 93c7620a44..60f92310a1 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -2198,6 +2198,7 @@ struct task *hard_stop(struct task *t, void *context, unsigned int state) /* 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 @@ static void do_soft_stop_now() 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); }