From: Vsevolod Stakhov Date: Thu, 15 Oct 2015 15:13:27 +0000 (+0100) Subject: Fix termination. X-Git-Tag: 1.0.6~11 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=d4f429d3e398f43361ba00d6d36f022e6e9ab01a;p=rspamd.git Fix termination. --- diff --git a/src/rspamd.c b/src/rspamd.c index fb6e1fcbf..21563bf18 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -75,7 +75,7 @@ #define SOFT_FORK_TIME 2 /* 10 seconds after getting termination signal to terminate all workers with SIGKILL */ -#define TERMINATION_ATTEMPTS 40 +#define TERMINATION_ATTEMPTS 50 static gboolean load_rspamd_config (struct rspamd_main *rspamd_main, struct rspamd_config *cfg, @@ -554,7 +554,6 @@ wait_for_workers (gpointer key, gpointer value, gpointer unused) } else { msg_info_main ("waiting for workers to sync"); - return FALSE; } } @@ -760,7 +759,9 @@ rspamd_final_term_handler (gint signo, short what, gpointer arg) { struct rspamd_main *rspamd_main = arg; - term_attempts --; + if (term_attempts) { + term_attempts--; + } g_hash_table_foreach_remove (rspamd_main->workers, wait_for_workers, NULL); @@ -1041,6 +1042,13 @@ main (gint argc, gchar **argv, gchar **env) } event_base_loop (ev_base, 0); + /* We need to block signals unless children are waited for */ + sigaddset (&signals.sa_mask, SIGTERM); + sigaddset (&signals.sa_mask, SIGINT); + sigaddset (&signals.sa_mask, SIGHUP); + sigaddset (&signals.sa_mask, SIGUSR1); + sigaddset (&signals.sa_mask, SIGUSR2); + sigprocmask (SIG_BLOCK, &signals.sa_mask, NULL); if (control_fd != -1) { event_del (&control_ev);