MAJOR: mworker: exits the master on failure
This patch changes the behavior of the master during the exit of a
worker.
When a worker exits with an error code, for example in the case of a
segfault, all workers are now killed and the master leaves.
If you don't want this behavior you can use the option
"master-worker no-exit-on-failure".
diff --git a/doc/configuration.txt b/doc/configuration.txt
index ea326d1..6fb239a 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -869,19 +869,20 @@
This global directive loads and executes a Lua file. This directive can be
used multiple times.
-master-worker [exit-on-failure]
+master-worker [no-exit-on-failure]
Master-worker mode. It is equivalent to the command line "-W" argument.
This mode will launch a "master" which will monitor the "workers". Using
this mode, you can reload HAProxy directly by sending a SIGUSR2 signal to
the master. The master-worker mode is compatible either with the foreground
or daemon mode. It is recommended to use this mode with multiprocess and
systemd.
- The "exit-on-failure" option allows the master to kill every workers and
- exit when one of the current workers died. It is convenient to combine this
- option with Restart=on-failure in a systemd unit file in order to relaunch
- the whole process.
+ By default, if a worker exits with a bad return code, in the case of a
+ segfault for example, all workers will be killed, and the master will leave.
+ It is convenient to combine this behavior with Restart=on-failure in a
+ systemd unit file in order to relaunch the whole process. If you don't want
+ this behavior, you must use the keyword "no-exit-on-failure".
- See alors "-W" in the management guide.
+ See also "-W" in the management guide.
nbproc <number>
Creates <number> processes when going daemon. This requires the "daemon"
diff --git a/include/types/global.h b/include/types/global.h
index 0f50d45..a3d1e96 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -65,7 +65,7 @@
#define GTUNE_RESOLVE_DONTFAIL (1<<7)
#define GTUNE_SOCKET_TRANSFER (1<<8)
-#define GTUNE_EXIT_ONFAILURE (1<<9)
+#define GTUNE_NOEXIT_ONFAILURE (1<<9)
#define GTUNE_USE_SYSTEMD (1<<10)
/* Access level for a stats socket */
diff --git a/src/cfgparse.c b/src/cfgparse.c
index f70eafb..e7e32cf 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -716,8 +716,8 @@
if (alertif_too_many_args(1, file, linenum, args, &err_code))
goto out;
if (*args[1]) {
- if (!strcmp(args[1], "exit-on-failure")) {
- global.tune.options |= GTUNE_EXIT_ONFAILURE;
+ if (!strcmp(args[1], "no-exit-on-failure")) {
+ global.tune.options |= GTUNE_NOEXIT_ONFAILURE;
} else {
ha_alert("parsing [%s:%d] : '%s' only supports 'exit-on-failure' option.\n", file, linenum, args[0]);
err_code |= ERR_ALERT | ERR_FATAL;
diff --git a/src/haproxy.c b/src/haproxy.c
index faa46e0..891a021 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -759,7 +759,7 @@
if (current_child(exitpid)) {
ha_alert("Current worker %d left with exit code %d\n", exitpid, status);
if (status != 0 && status != 130 && status != 143
- && global.tune.options & GTUNE_EXIT_ONFAILURE) {
+ && !(global.tune.options & GTUNE_NOEXIT_ONFAILURE)) {
ha_alert("exit-on-failure: killing every workers with SIGTERM\n");
mworker_kill(SIGTERM);
}