From 1f63a539550b3b29a3b335c93e419e9ea683f763 Mon Sep 17 00:00:00 2001 From: Valentine Krasnobaeva Date: Mon, 9 Dec 2024 20:20:40 +0100 Subject: [PATCH] BUG/MINOR: mworker: detach from tty when received READY from worker Some master process' initialization steps are conditioned by receiving the READY message from worker (pidfile creation, forwarding READY message to the launching parent). So, master process can not do these initialization routines before. If the master process fails, while creating pid or forwarding the READY to the parent in daemon mode, he exits with a proper alert message. In daemon mode we no longer see such message, as process is already detached from the tty. To fix this, as these alerts could be very useful, let's detach the master process from the tty after his last initialization steps in _send_status. --- include/haproxy/global.h | 1 + src/cli.c | 12 ++++++++++++ src/haproxy.c | 11 +---------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/haproxy/global.h b/include/haproxy/global.h index a5730bc4b6ba..ba0523cbf911 100644 --- a/include/haproxy/global.h +++ b/include/haproxy/global.h @@ -70,6 +70,7 @@ int split_version(const char *version, unsigned int *value); int compare_current_version(const char *version); void display_version(); int handle_pidfile(void); +void stdio_quiet(int fd); void mworker_accept_wrapper(int fd); diff --git a/src/cli.c b/src/cli.c index 506e5e45c4d9..429a277dc2aa 100644 --- a/src/cli.c +++ b/src/cli.c @@ -2553,6 +2553,18 @@ static int _send_status(char **args, char *payload, struct appctx *appctx, void if (global.tune.options & GTUNE_USE_SYSTEMD) sd_notifyf(0, "READY=1\nMAINPID=%lu\nSTATUS=Ready.\n", (unsigned long)getpid()); + /* master and worker have successfully started, now we can set quiet mode + * if MODE_DAEMON + */ + if ((!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)) && + (global.mode & MODE_DAEMON)) { + /* detach from the tty, this is required to properly daemonize. */ + if ((getenv("HAPROXY_MWORKER_REEXEC") == NULL)) + stdio_quiet(-1); + global.mode &= ~MODE_VERBOSE; + global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ + } + return 1; } diff --git a/src/haproxy.c b/src/haproxy.c index 7b03e9ed8992..0d7f784d2754 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -814,7 +814,7 @@ static void dump(struct sig_handler *sh) * In the case of chrooting, you have to open /dev/null before the chroot, and * pass the to this function */ -static void stdio_quiet(int fd) +void stdio_quiet(int fd) { if (fd < 0) fd = open("/dev/null", O_RDWR, 0); @@ -3533,15 +3533,6 @@ int main(int argc, char **argv) /* Master enters in its polling loop */ if (master) { - /* set quiet mode if MODE_DAEMON */ - if ((!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)) && - (global.mode & MODE_DAEMON)) { - /* detach from the tty, this is required to properly daemonize. */ - if ((getenv("HAPROXY_MWORKER_REEXEC") == NULL)) - stdio_quiet(-1); - global.mode &= ~MODE_VERBOSE; - global.mode |= MODE_QUIET; /* ensure that we won't say anything from now */ - } mworker_run_master(); /* never get there in master context */ }