Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Cloud:OpenStack:Havana
haproxy
0003-MEDIUM-New-cli-option-Ds-for-systemd-compa...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0003-MEDIUM-New-cli-option-Ds-for-systemd-compatibility.patch of Package haproxy
From 8b79e7c45c86ef57317cbdbf451e49896a8ac239 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 3/5] 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 001de15a2ff9..48717adefab4 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 7a09e3fbfd72..494de5c85c29 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; @@ -1132,7 +1136,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); @@ -1222,9 +1226,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 */ @@ -1237,6 +1242,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); @@ -1262,8 +1268,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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor