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.
This commit is contained in:
Valentine Krasnobaeva 2024-12-09 20:20:40 +01:00 committed by Willy Tarreau
parent 97aaf76716
commit 1f63a53955
3 changed files with 14 additions and 10 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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 <fd> 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 */
}