Skip to content

Commit

Permalink
BUG/MINOR: mworker: detach from tty when received READY from worker
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
vkssv authored and wtarreau committed Dec 9, 2024
1 parent 97aaf76 commit 1f63a53
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 10 deletions.
1 change: 1 addition & 0 deletions include/haproxy/global.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
12 changes: 12 additions & 0 deletions src/cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
11 changes: 1 addition & 10 deletions src/haproxy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
}
Expand Down

0 comments on commit 1f63a53

Please sign in to comment.