The former behavior was to exit() the master process with the latest
status code known, which was the one of the last process to exit.

The problem is that the master process was not exiting with the status
code which provoked the exit-on-failure.
---
 src/haproxy.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/haproxy.c b/src/haproxy.c
index c7ea65d5f..88cdc9df3 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -191,6 +191,8 @@ static char *cur_unixsocket = NULL;
 
 int atexit_flag = 0;
 
+static int exitcode = -1;
+
 int nb_oldpids = 0;
 const int zero = 0;
 const int one = 1;
@@ -825,6 +827,8 @@ restart_wait:
                                if (status != 0 && status != 130 && status != 
143
                                    && !(global.tune.options & 
GTUNE_NOEXIT_ONFAILURE)) {
                                        ha_alert("exit-on-failure: killing 
every workers with SIGTERM\n");
+                                       if (exitcode < 0)
+                                               exitcode = status;
                                        mworker_kill(SIGTERM);
                                }
                        } else {
@@ -841,6 +845,8 @@ restart_wait:
        else if (exitpid == -1 && errno == ECHILD) {
                ha_warning("All workers exited. Exiting... (%d)\n", (exitcode > 
0) ? exitcode : status);
                atexit_flag = 0;
+               if (exitcode > 0)
+                       exit(exitcode);
                exit(status); /* parent must leave using the latest status code 
known */
        }
 
-- 
2.16.4


Reply via email to