From 90b8181c0a5a9a08b1fa2e77ebe28896fd2a9237 Mon Sep 17 00:00:00 2001 From: Valentine Krasnobaeva Date: Fri, 28 Jun 2024 18:06:52 +0200 Subject: [PATCH] MEDIUM: startup: move daemonization fork in init Let's move daemonization fork in init(). We need to perform this fork always before forking a worker process, in order to be able to launch master and then its worker in daemon, i.e. background mode, if haproxy was started with '-D' option. This refactoring is a preparation step, needed for replacing then master-worker fork in init() as well. This allows the master process not to read the whole configuration file and not to do re-execution in order to free additional memory, when worker was forked. In the new refactored design only the worker process will read and apply a new configuration, while the master will arrive very fast in its polling loop to wait worker's termination and to handle signals. See more details in the following commits. --- src/haproxy.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/src/haproxy.c b/src/haproxy.c index 50ec6fcb1..c39621eb8 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2115,6 +2115,22 @@ static void init(int argc, char **argv) global.nbthread = 1; } + /* if daemon + mworker: must fork here to let a master process live in + * background before forking children. + */ + if ((getenv("HAPROXY_MWORKER_REEXEC") == NULL) && + (global.mode & MODE_DAEMON)) { + ret = fork(); + if (ret < 0) { + ha_alert("[%s.main()] Cannot fork.\n", argv[0]); + protocol_unbind_all(); + exit(1); /* there has been an error */ + } else if (ret > 0) { /* parent leave to daemonize */ + exit(0); + } else /* change the process group ID in the child (master process) */ + setsid(); + } + if (global.mode & (MODE_MWORKER|MODE_MWORKER_WAIT)) mworker_create_master_cli(); @@ -3528,26 +3544,6 @@ int main(int argc, char **argv) int in_parent = 0; int devnullfd = -1; - /* - * if daemon + mworker: must fork here to let a master - * process live in background before forking children - */ - - if ((getenv("HAPROXY_MWORKER_REEXEC") == NULL) - && (global.mode & MODE_MWORKER) - && (global.mode & MODE_DAEMON)) { - ret = fork(); - if (ret < 0) { - ha_alert("[%s.main()] Cannot fork.\n", argv[0]); - protocol_unbind_all(); - exit(1); /* there has been an error */ - } else if (ret > 0) { /* parent leave to daemonize */ - exit(0); - } else /* change the process group ID in the child (master process) */ - setsid(); - } - - /* if in master-worker mode, write the PID of the father */ if (global.mode & MODE_MWORKER) { char pidstr[100];