BUG/MINOR: proxy: wake up all threads when sending the hard-stop signal
authorWilly Tarreau <w@1wt.eu>
Wed, 24 Feb 2021 10:13:59 +0000 (11:13 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 26 Feb 2021 15:54:29 +0000 (16:54 +0100)
The hard-stop event didn't wake threads up. In the past it wasn't an issue
as the poll timeout was limited to 1 second, but since commit 4f59d3861
("MINOR: time: increase the minimum wakeup interval to 60s") it has become
a problem because old processes can remain live for up to one minute after
the hard-stop-after delay. Let's just wake them up.

This may be backported to older releases, though before 2.4 the extra
delay was only one second.

(cherry picked from commit 0d03825b93cc59a289e838105f9d83d53ccdfc8b)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 6b08479975a798d9ee929b512bbb0d0ffd0f02be)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 300b2e8ffb4403ee7ecb961115ce05b093521006)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/proxy.c

index 70ef1ca..4bfccfc 100644 (file)
@@ -1075,11 +1075,15 @@ struct task *hard_stop(struct task *t, void *context, unsigned short state)
 {
        struct proxy *p;
        struct stream *s;
+       int thr;
 
        if (killed) {
                ha_warning("Some tasks resisted to hard-stop, exiting now.\n");
                send_log(NULL, LOG_WARNING, "Some tasks resisted to hard-stop, exiting now.\n");
                killed = 2;
+               for (thr = 0; thr < global.nbthread; thr++)
+                       if (((all_threads_mask & ~tid_bit) >> thr) & 1)
+                               wake_thread(thr);
                t->expire = TICK_ETERNITY;
                return t;
        }