BUG/MEDIUM: listener: make sure we don't pick stopped threads

Dragan Dosen reported that after the multi-queue changes, appending
"process 1/even" on a bind line can make the process immediately crash
when delivering a first connection. This is due to the fact that I
believed that thread_mask(mask) applied the all_threads_mask value,
but it doesn't. And in case of even/odd the bits cover more than the
available threads, resulting in too high a thread number being selected
and a non-existing task to be woken up.

No backport is needed.
This commit is contained in:
Willy Tarreau 2019-03-13 15:03:53 +01:00
parent b0cef35b09
commit 897e2c58e6
1 changed files with 1 additions and 1 deletions

View File

@ -845,7 +845,7 @@ void listener_accept(int fd)
next_actconn = 0; next_actconn = 0;
#if defined(USE_THREAD) #if defined(USE_THREAD)
mask = thread_mask(l->bind_conf->bind_thread); mask = thread_mask(l->bind_conf->bind_thread) & all_threads_mask;
if (atleast2(mask) && (global.tune.options & GTUNE_LISTENER_MQ)) { if (atleast2(mask) && (global.tune.options & GTUNE_LISTENER_MQ)) {
struct accept_queue_ring *ring; struct accept_queue_ring *ring;
unsigned int t, t0, t1, t2; unsigned int t, t0, t1, t2;