]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: proxy: properly stop backends on soft-stop
authorChristopher Faulet <cfaulet@haproxy.com>
Tue, 14 Mar 2023 13:33:11 +0000 (14:33 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 14 Mar 2023 14:23:55 +0000 (15:23 +0100)
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.

src/proxy.c

index 93c7620a4446b6915edcc18455a666bb252632c1..60f92310a16bd3f72228a4f06dcb81f0e919929a 100644 (file)
@@ -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);
 }