]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Do not refork workers that are intended to die
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 24 Jan 2017 11:28:17 +0000 (11:28 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 24 Jan 2017 11:28:17 +0000 (11:28 +0000)
src/rspamd.c

index 44931dfdabfaf3b5daed71aa5dbc2f34d6ce0838..c00faa056c7a1cdce67740d13b54845a841bb8df 100644 (file)
@@ -656,8 +656,15 @@ kill_old_workers (gpointer key, gpointer value, gpointer unused)
        struct rspamd_main *rspamd_main;
 
        rspamd_main = w->srv;
-       kill (w->pid, SIGUSR2);
-       msg_info_main ("send signal to worker %P", w->pid);
+
+       if (!w->wanna_die) {
+               w->wanna_die = TRUE;
+               kill (w->pid, SIGUSR2);
+               msg_info_main ("send signal to worker %P", w->pid);
+       }
+       else {
+               msg_info_main ("do not send signal to worker %P, already sent", w->pid);
+       }
 }
 
 static gboolean
@@ -942,6 +949,11 @@ rspamd_cld_handler (gint signo, short what, gpointer arg)
                        g_hash_table_remove (rspamd_main->workers, GSIZE_TO_POINTER (
                                        wrk));
 
+                       if (cur->wanna_die) {
+                               /* Do not refork workers that are intended to be terminated */
+                               need_refork = FALSE;
+                       }
+
                        if (WIFEXITED (res) && WEXITSTATUS (res) == 0) {
                                /* Normal worker termination, do not fork one more */
                                msg_info_main ("%s process %P terminated normally",