On Tue, Nov 19, 2019 at 04:19:26PM +0100, William Lallemand wrote: > > I then add another bind for port 80, which is in use by squid already > > and try to reload HAProxy. It takes some time until it failes: > > > > Nov 19 14:39:21 894a0f616fec haproxy[2978]: [WARNING] 322/143921 (2978) > > : Reexecuting Master process > > ... > > Nov 19 14:39:28 894a0f616fec haproxy[2978]: [ALERT] 322/143922 (2978) : > > Starting frontend somefrontend: cannot bind socket [0.0.0.0:80] > > ... > > Nov 19 14:39:28 894a0f616fec systemd[1]: haproxy.service: Main process > > exited, code=exited, status=1/FAILURE > > > > The reload itself is still running (systemd) and will timeout after > > about 90s. After that, because of the Restart=always, I guess, it ends > > up in a restart loop. > > > > So I would have expected that the master process will fallback to the > > old process and proceed with the old child until the problem has been > > fixed. > >
The patch in attachment fixes a bug where haproxy could reexecute itself in waitpid mode with -sf -1. I'm not sure this is your bug, but if this is the case you should see haproxy in waitpid mode, then the master exiting with the usage message in your logs. -- William Lallemand
>From 481a3c62a622974587c731b1bdc1478538fd6527 Mon Sep 17 00:00:00 2001 From: William Lallemand <wlallem...@haproxy.org> Date: Tue, 19 Nov 2019 17:04:18 +0100 Subject: [PATCH] BUG/MEDIUM: mworker: don't fill the -sf argument with -1 during the reexec Upon a reexec_on_failure, if the process tried to exit after the initialization of the process structure but before it was filled with a PID, the PID in the mworker_proc structure is set to -1. In this particular case the -sf argument is filled with -1 and haproxy will exit with the usage message because of that argument. Should be backported in 2.0. --- src/haproxy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haproxy.c b/src/haproxy.c index a0e630dfa..1d4771e64 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -673,7 +673,7 @@ void mworker_reload() next_argv[next_argc++] = "-sf"; list_for_each_entry(child, &proc_list, list) { - if (!(child->options & (PROC_O_TYPE_WORKER|PROC_O_TYPE_PROG))) + if (!(child->options & (PROC_O_TYPE_WORKER|PROC_O_TYPE_PROG)) || child->pid <= -1 ) continue; next_argv[next_argc] = memprintf(&msg, "%d", child->pid); if (next_argv[next_argc] == NULL) -- 2.21.0