|
commit df4822ea169adc5c7c987fa077438f0ded1ac39b
|
|
Author: Emeric Brun <ebrun@haproxy.com>
|
|
Date: Thu Oct 11 15:27:07 2018 +0200
|
|
|
|
BUG/MEDIUM: mworker: segfault receiving SIGUSR1 followed by SIGTERM.
|
|
|
|
This bug appeared only if nbthread > 1. Handling the pipe with the
|
|
master, multiple threads of the same worker could process the deinit().
|
|
|
|
In addition, deinit() was called while some other threads were still
|
|
performing some tasks.
|
|
|
|
This patch assign the handler of the pipe with master to only the first
|
|
thread and removes the call to deinit() before exiting with an error.
|
|
|
|
This patch should be backported in v1.8.
|
|
|
|
(cherry picked from commit c8c0ed91cb4436491efd2ce2c4b4b1694aeeccca)
|
|
[wt: adjusted context]
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
|
index e0186ff9..1959dd0f 100644
|
|
--- a/src/haproxy.c
|
|
+++ b/src/haproxy.c
|
|
@@ -2349,7 +2349,13 @@ void mworker_pipe_handler(int fd)
|
|
break;
|
|
}
|
|
|
|
- deinit();
|
|
+ /* At this step the master is down before
|
|
+ * this worker perform a 'normal' exit.
|
|
+ * So we want to exit with an error but
|
|
+ * other threads could currently process
|
|
+ * some stuff so we can't perform a clean
|
|
+ * deinit().
|
|
+ */
|
|
exit(EXIT_FAILURE);
|
|
return;
|
|
}
|
|
@@ -2364,7 +2370,10 @@ void mworker_pipe_register()
|
|
fcntl(mworker_pipe[0], F_SETFL, O_NONBLOCK);
|
|
fdtab[mworker_pipe[0]].owner = mworker_pipe;
|
|
fdtab[mworker_pipe[0]].iocb = mworker_pipe_handler;
|
|
- fd_insert(mworker_pipe[0], MAX_THREADS_MASK);
|
|
+ /* In multi-tread, we need only one thread to process
|
|
+ * events on the pipe with master
|
|
+ */
|
|
+ fd_insert(mworker_pipe[0], 1);
|
|
fd_want_recv(mworker_pipe[0]);
|
|
}
|
|
|