From 53e99701c643c18a76c5ae0d9ee80af974e9c7fc Mon Sep 17 00:00:00 2001 From: willy tarreau Date: Sat, 25 Mar 2006 18:53:50 +0100 Subject: [PATCH] * added the -sf/-st command-line arguments which are used to specify a list of pids to send a FINISH or TERMINATE signal upon startup. They will also be asked to release their port if a bind fails. --- haproxy.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/haproxy.c b/haproxy.c index c555e2a89..7083b1c5e 100644 --- a/haproxy.c +++ b/haproxy.c @@ -703,10 +703,11 @@ static int stopping = 0; /* non zero means stopping in progress */ static struct timeval now = {0,0}; /* the current date at any moment */ static struct proxy defproxy; /* fake proxy used to assign default values on all instances */ -/* Here we store informations about the pids of the processes we - * may pause or kill. +/* Here we store informations about the pids of the processes we may pause + * or kill. We will send them a signal every 10 ms until we can bind to all + * our ports. With 200 retries, that's about 2 seconds. */ -#define MAX_START_RETRIES 100 +#define MAX_START_RETRIES 200 static int nb_oldpids = 0; static int *oldpids = NULL; static int oldpids_sig; /* use USR1 or TERM */ @@ -902,6 +903,7 @@ void usage(char *name) { #if defined(ENABLE_POLL) " -dp disables poll() usage even when available\n" #endif + " -sf/-st [pid ]* finishes/terminates old pids. Must be last arguments.\n" "\n", name, DEFAULT_MAXCONN, cfg_maxpconn); exit(1); @@ -8048,6 +8050,26 @@ void init(int argc, char **argv) { else if (*flag == 'l') arg_mode |= MODE_LOG; #endif + else if (*flag == 's' && (flag[1] == 'f' || flag[1] == 't')) { + /* list of pids to finish ('f') or terminate ('t') */ + + if (flag[1] == 'f') + oldpids_sig = SIGUSR1; /* finish then exit */ + else + oldpids_sig = SIGTERM; /* terminate immediately */ + argv++; argc--; + + if (argc > 0) { + oldpids = calloc(argc, sizeof(int)); + while (argc > 0) { + oldpids[nb_oldpids] = atol(*argv); + if (oldpids[nb_oldpids] <= 0) + usage(old_argv); + argc--; argv++; + nb_oldpids++; + } + } + } else { /* >=2 args */ argv++; argc--; if (argc == 0) @@ -8065,7 +8087,7 @@ void init(int argc, char **argv) { } else usage(old_argv); - argv++; argc--; + argv++; argc--; } global.mode = MODE_STARTING | /* during startup, we want most of the alerts */