forked from pool/haproxy
0b429848d7
Update to 1.4.25. Amended SR with missing patch information in .changes OBS-URL: https://build.opensuse.org/request/show/232846 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/haproxy?expand=0&rev=4
158 lines
5.5 KiB
Diff
158 lines
5.5 KiB
Diff
From 44c4c476fac6efccb07c419873bb6c8d12d565a7 Mon Sep 17 00:00:00 2001
|
|
From: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
|
|
Date: Fri, 22 Nov 2013 08:34:52 +0100
|
|
Subject: [PATCH 03/15] MEDIUM: New cli option -Ds for systemd compatibility
|
|
|
|
This patch adds a new option "-Ds" which is exactly like "-D", but instead of
|
|
forking n times to get n jobs running and then exiting, prefers to wait for all the
|
|
children it just created. With this done, haproxy becomes more systemd-compliant,
|
|
without changing anything for other systems.
|
|
|
|
Signed-off-by: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
|
|
---
|
|
doc/haproxy.1 | 4 ++++
|
|
include/types/global.h | 1 +
|
|
src/haproxy.c | 35 +++++++++++++++++++++++------------
|
|
3 files changed, 28 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/doc/haproxy.1 b/doc/haproxy.1
|
|
index 0150aa753475..26e35a21f0e2 100644
|
|
--- a/doc/haproxy.1
|
|
+++ b/doc/haproxy.1
|
|
@@ -57,6 +57,10 @@ starting up.
|
|
Start in daemon mode.
|
|
|
|
.TP
|
|
+\fB\-Ds\fP
|
|
+Start in systemd daemon mode, keeping a process in foreground.
|
|
+
|
|
+.TP
|
|
\fB\-q\fP
|
|
Disable messages on output.
|
|
|
|
diff --git a/include/types/global.h b/include/types/global.h
|
|
index 7c5346b00b2d..d871939db21d 100644
|
|
--- a/include/types/global.h
|
|
+++ b/include/types/global.h
|
|
@@ -38,6 +38,7 @@
|
|
#define MODE_VERBOSE 0x10
|
|
#define MODE_STARTING 0x20
|
|
#define MODE_FOREGROUND 0x40
|
|
+#define MODE_SYSTEMD 0x80
|
|
|
|
/* list of last checks to perform, depending on config options */
|
|
#define LSTCHK_CAP_BIND 0x00000001 /* check that we can bind to any port */
|
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
|
index 748c5535b37d..67e29b8bc8cc 100644
|
|
--- a/src/haproxy.c
|
|
+++ b/src/haproxy.c
|
|
@@ -42,6 +42,7 @@
|
|
#include <signal.h>
|
|
#include <stdarg.h>
|
|
#include <sys/resource.h>
|
|
+#include <sys/wait.h>
|
|
#include <time.h>
|
|
#include <syslog.h>
|
|
#include <grp.h>
|
|
@@ -488,8 +489,11 @@ void init(int argc, char **argv)
|
|
arg_mode |= MODE_DEBUG;
|
|
else if (*flag == 'c')
|
|
arg_mode |= MODE_CHECK;
|
|
- else if (*flag == 'D')
|
|
+ else if (*flag == 'D') {
|
|
arg_mode |= MODE_DAEMON;
|
|
+ if (flag[1] == 's') /* -Ds */
|
|
+ arg_mode |= MODE_SYSTEMD;
|
|
+ }
|
|
else if (*flag == 'q')
|
|
arg_mode |= MODE_QUIET;
|
|
else if (*flag == 's' && (flag[1] == 'f' || flag[1] == 't')) {
|
|
@@ -541,7 +545,7 @@ void init(int argc, char **argv)
|
|
}
|
|
|
|
global.mode = MODE_STARTING | /* during startup, we want most of the alerts */
|
|
- (arg_mode & (MODE_DAEMON | MODE_FOREGROUND | MODE_VERBOSE
|
|
+ (arg_mode & (MODE_DAEMON | MODE_SYSTEMD | MODE_FOREGROUND | MODE_VERBOSE
|
|
| MODE_QUIET | MODE_CHECK | MODE_DEBUG));
|
|
|
|
if (LIST_ISEMPTY(&cfg_cfgfiles))
|
|
@@ -649,24 +653,24 @@ void init(int argc, char **argv)
|
|
|
|
if (arg_mode & (MODE_DEBUG | MODE_FOREGROUND)) {
|
|
/* command line debug mode inhibits configuration mode */
|
|
- global.mode &= ~(MODE_DAEMON | MODE_QUIET);
|
|
+ global.mode &= ~(MODE_DAEMON | MODE_SYSTEMD | MODE_QUIET);
|
|
global.mode |= (arg_mode & (MODE_DEBUG | MODE_FOREGROUND));
|
|
}
|
|
|
|
- if (arg_mode & MODE_DAEMON) {
|
|
+ if (arg_mode & (MODE_DAEMON | MODE_SYSTEMD)) {
|
|
/* command line daemon mode inhibits foreground and debug modes mode */
|
|
global.mode &= ~(MODE_DEBUG | MODE_FOREGROUND);
|
|
- global.mode |= (arg_mode & MODE_DAEMON);
|
|
+ global.mode |= (arg_mode & (MODE_DAEMON | MODE_SYSTEMD));
|
|
}
|
|
|
|
global.mode |= (arg_mode & (MODE_QUIET | MODE_VERBOSE));
|
|
|
|
- if ((global.mode & MODE_DEBUG) && (global.mode & (MODE_DAEMON | MODE_QUIET))) {
|
|
- Warning("<debug> mode incompatible with <quiet> and <daemon>. Keeping <debug> only.\n");
|
|
- global.mode &= ~(MODE_DAEMON | MODE_QUIET);
|
|
+ if ((global.mode & MODE_DEBUG) && (global.mode & (MODE_DAEMON | MODE_SYSTEMD | MODE_QUIET))) {
|
|
+ Warning("<debug> mode incompatible with <quiet>, <daemon> and <systemd>. Keeping <debug> only.\n");
|
|
+ global.mode &= ~(MODE_DAEMON | MODE_SYSTEMD | MODE_QUIET);
|
|
}
|
|
|
|
- if ((global.nbproc > 1) && !(global.mode & MODE_DAEMON)) {
|
|
+ if ((global.nbproc > 1) && !(global.mode & (MODE_DAEMON | MODE_SYSTEMD))) {
|
|
if (!(global.mode & (MODE_FOREGROUND | MODE_DEBUG)))
|
|
Warning("<nbproc> is only meaningful in daemon mode. Setting limit to 1 process.\n");
|
|
global.nbproc = 1;
|
|
@@ -1133,7 +1137,7 @@ int main(int argc, char **argv)
|
|
}
|
|
|
|
/* open log & pid files before the chroot */
|
|
- if (global.mode & MODE_DAEMON && global.pidfile != NULL) {
|
|
+ if (global.mode & (MODE_DAEMON | MODE_SYSTEMD) && global.pidfile != NULL) {
|
|
int pidfd;
|
|
unlink(global.pidfile);
|
|
pidfd = open(global.pidfile, O_CREAT | O_WRONLY | O_TRUNC, 0644);
|
|
@@ -1223,9 +1227,10 @@ int main(int argc, char **argv)
|
|
argv[0], (int)limit.rlim_cur, global.maxconn, global.maxsock, global.maxsock);
|
|
}
|
|
|
|
- if (global.mode & MODE_DAEMON) {
|
|
+ if (global.mode & (MODE_DAEMON | MODE_SYSTEMD)) {
|
|
struct proxy *px;
|
|
int ret = 0;
|
|
+ int *children = calloc(global.nbproc, sizeof(int));
|
|
int proc;
|
|
|
|
/* the father launches the required number of processes */
|
|
@@ -1238,6 +1243,7 @@ int main(int argc, char **argv)
|
|
}
|
|
else if (ret == 0) /* child breaks here */
|
|
break;
|
|
+ children[proc] = ret;
|
|
if (pidfile != NULL) {
|
|
fprintf(pidfile, "%d\n", ret);
|
|
fflush(pidfile);
|
|
@@ -1263,8 +1269,13 @@ int main(int argc, char **argv)
|
|
px = px->next;
|
|
}
|
|
|
|
- if (proc == global.nbproc)
|
|
+ if (proc == global.nbproc) {
|
|
+ if (global.mode & MODE_SYSTEMD) {
|
|
+ for (proc = 0; proc < global.nbproc; proc++)
|
|
+ while (waitpid(children[proc], NULL, 0) == -1 && errno == EINTR);
|
|
+ }
|
|
exit(0); /* parent must leave */
|
|
+ }
|
|
|
|
/* if we're NOT in QUIET mode, we should now close the 3 first FDs to ensure
|
|
* that we can detach from the TTY. We MUST NOT do it in other cases since
|
|
--
|
|
1.8.4.5
|
|
|