|
commit f259fcc00a04e633a7a64f894a719f78f3644867
|
|
Author: Willy Tarreau <w@1wt.eu>
|
|
Date: Mon Aug 26 10:37:39 2019 +0200
|
|
|
|
BUG/MINOR: mworker: disable SIGPROF on re-exec
|
|
|
|
If haproxy is built with profiling enabled with -pg, it is possible to
|
|
see the master quit during a reload while it's re-executing itself with
|
|
error code 155 (signal 27) saying "Profile timer expired)". This happens
|
|
if the SIGPROF signal is delivered during the execve() call while the
|
|
handler was already unregistered. The issue itself is not directly inside
|
|
haproxy but it's easy to address. This patch disables this signal before
|
|
calling execvp() during a master reload. A simple test for this consists
|
|
in running this little script with haproxy started in master-worker mode :
|
|
|
|
$ while usleep 50000; do killall -USR2 haproxy; done
|
|
|
|
This fix should be backported to all versions using the master-worker
|
|
model.
|
|
|
|
(cherry picked from commit e0d86e2c1caaaa2141118e3309d479de5f67e855)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
|
index f6f00fc1..c93b0d13 100644
|
|
--- a/src/haproxy.c
|
|
+++ b/src/haproxy.c
|
|
@@ -695,6 +695,7 @@ void mworker_reload()
|
|
}
|
|
|
|
ha_warning("Reexecuting Master process\n");
|
|
+ signal(SIGPROF, SIG_IGN);
|
|
execvp(next_argv[0], next_argv);
|
|
|
|
ha_warning("Failed to reexecute the master process [%d]: %s\n", pid, strerror(errno));
|