|
|
- From 62c8565cd5bbda6ac0dd818fa26922eeaef1605c Mon Sep 17 00:00:00 2001
- From: Conrad Hoffmann <conrad@soundcloud.com>
- Date: Mon, 28 Jul 2014 23:52:20 +0200
- Subject: [PATCH 03/13] MEDIUM: Improve signal handling in systemd wrapper.
-
- Move all code out of the signal handlers, since this is potentially
- dangerous. To make sure the signal handlers behave as expected, use
- sigaction() instead of signal(). That also obsoletes messing with
- the signal mask after restart.
-
- Signed-off-by: Conrad Hoffmann <conrad@soundcloud.com>
- (cherry picked from commit 5b5ea9c93384da49eea0f67ebed0966d4167b17a)
- ---
- src/haproxy-systemd-wrapper.c | 37 ++++++++++++++++++++++++-------------
- 1 file changed, 24 insertions(+), 13 deletions(-)
-
- diff --git a/src/haproxy-systemd-wrapper.c b/src/haproxy-systemd-wrapper.c
- index 529b213..90a94ce 100644
- --- a/src/haproxy-systemd-wrapper.c
- +++ b/src/haproxy-systemd-wrapper.c
- @@ -22,6 +22,8 @@
- #define SD_DEBUG "<7>"
- #define SD_NOTICE "<5>"
-
- +static volatile sig_atomic_t caught_signal;
- +
- static char *pid_file = "/run/haproxy.pid";
- static int wrapper_argc;
- static char **wrapper_argv;
- @@ -103,7 +105,12 @@ static int read_pids(char ***pid_strv)
- return read;
- }
-
- -static void sigusr2_handler(int signum __attribute__((unused)))
- +static void signal_handler(int signum)
- +{
- + caught_signal = signum;
- +}
- +
- +static void do_restart(void)
- {
- setenv(REEXEC_FLAG, "1", 1);
- fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-executing\n");
- @@ -111,7 +118,7 @@ static void sigusr2_handler(int signum __attribute__((unused)))
- execv(wrapper_argv[0], wrapper_argv);
- }
-
- -static void sigint_handler(int signum __attribute__((unused)))
- +static void do_shutdown(void)
- {
- int i, pid;
- char **pid_strv = NULL;
- @@ -147,25 +154,21 @@ int main(int argc, char **argv)
- --argc; ++argv;
- init(argc, argv);
-
- - signal(SIGINT, &sigint_handler);
- - signal(SIGUSR2, &sigusr2_handler);
- + struct sigaction sa;
- + memset(&sa, 0, sizeof(struct sigaction));
- + sa.sa_handler = &signal_handler;
- + sigaction(SIGUSR2, &sa, NULL);
- + sigaction(SIGINT, &sa, NULL);
-
- if (getenv(REEXEC_FLAG) != NULL) {
- /* We are being re-executed: restart HAProxy gracefully */
- int i;
- char **pid_strv = NULL;
- int nb_pid = read_pids(&pid_strv);
- - sigset_t sigs;
-
- unsetenv(REEXEC_FLAG);
- spawn_haproxy(pid_strv, nb_pid);
-
- - /* Unblock SIGUSR2 which was blocked by the signal handler
- - * before re-exec */
- - sigprocmask(SIG_BLOCK, NULL, &sigs);
- - sigdelset(&sigs, SIGUSR2);
- - sigprocmask(SIG_SETMASK, &sigs, NULL);
- -
- for (i = 0; i < nb_pid; ++i)
- free(pid_strv[i]);
- free(pid_strv);
- @@ -176,8 +179,16 @@ int main(int argc, char **argv)
- }
-
- status = -1;
- - while (-1 != wait(&status) || errno == EINTR)
- - ;
- + while (-1 != wait(&status) || errno == EINTR) {
- + if (caught_signal == SIGUSR2) {
- + caught_signal = 0;
- + do_restart();
- + }
- + else if (caught_signal == SIGINT) {
- + caught_signal = 0;
- + do_shutdown();
- + }
- + }
-
- fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: exit, haproxy RC=%d\n",
- status);
- --
- 1.8.5.5
-
|