patch to force cyrus to reload its configuration in a more rigorous way

Alain Spineux aspineux at gmail.com
Tue Apr 1 13:07:17 EDT 2008


Before this patch, cyrus was already able to detect a configuration
file change,
but only at the end of a connection. And any process waiting for a
new connection was ignoring the change during the next connection,
until they have finished.
In other word, after a configuration change, any waiting process can
still serve a new
connection with the old configuration and let the administrator
believe its change is not
working.

My patch force cyrmaster to send a SIGHUP to all its children when it
detect a configuration change:
- any working process will ignore the SIGHUP when processing a
connection (what my patch does)
and at the end of the connection, it will detect the configuration
change and terminate
(this is what is doing the original code).
- any waiting process, will catch the SIGHUP and handle it like SIGALARM
(what my patch does) and make the process believe its waiting period
(-T option of imapd command) is expired and then terminate. (like was
doing the original code)

Here is the patch and also in attachment.

Regards

--- cyrus-imapd-2.3.11/imap/signals.c.orig      2006-11-30
18:11:20.000000000 +0100
+++ cyrus-imapd-2.3.11/imap/signals.c   2008-03-23 17:24:54.000000000 +0100
@@ -79,6 +79,12 @@
        fatal("unable to install signal handler for %d: %m", SIGALRM);
     }

+    /* ASX: SIGHUP is used to force a configuration reload, and the waiting
+     * period is a privileged moment, so we don't set SA_RESTART */
+    if (alarm && sigaction(SIGHUP, &action, NULL) < 0) {
+       fatal("unable to install signal handler for %d: %m", SIGHUP);
+    }
+
 #ifdef SA_RESTART
     action.sa_flags |= SA_RESTART;
 #endif
--- cyrus-imapd-2.3.11/master/master.c.orig     2007-10-10
15:59:48.000000000 +0200
+++ cyrus-imapd-2.3.11/master/master.c  2008-03-23 17:29:33.000000000 +0100
@@ -1568,6 +1568,23 @@
                syslog(LOG_DEBUG, "init: service %s socket %d pipe %d %d",
                       Services[i].name, Services[i].socket,
                       Services[i].stat[0], Services[i].stat[1]);
+        } else if (Services[i].exec && Services[i].socket) {
+            /* refresh the old one */
+            syslog(LOG_DEBUG, "ASX SOMETHING TO DO service %s socket
%d pipe %d %d %d",
+                      Services[i].name, Services[i].socket,
+                      Services[i].stat[0], Services[i].stat[1],
+                       Services[i].exec ? 1:0);
+            /* send SIGHUP to all children */
+            for (j = 0 ; j < child_table_size ; j++ ) {
+                c = ctable[j];
+                while (c != NULL) {
+                    if ((c->si == i) && (c->service_state !=
SERVICE_STATE_DEAD)) {
+                        syslog(LOG_DEBUG, "ASX send SIGHUP to %d", c->pid);
+                        kill(c->pid, SIGHUP);
+                    }
+                    c = c->next;
+                }
+            }
        }
     }

--- cyrus-imapd-2.3.11/master/service.c.orig    2007-09-27
22:10:39.000000000 +0200
+++ cyrus-imapd-2.3.11/master/service.c 2008-03-23 17:32:46.000000000 +0100
@@ -460,7 +460,12 @@
                            notify_master(STATUS_FD,
MASTER_SERVICE_UNAVAILABLE);
                        service_abort(EX_OSERR);
                    }
-               }
+                } else {
+                     /* fd >= 0 */
+                     /* ASX we dont want SIGHUP to disrupt a connection
+                      * before the end */
+                     signals_add_handlers(0);
+                }
            } else {
                /* udp */
                struct sockaddr_storage from;


-- 
Alain Spineux
aspineux gmail com
May the sources be with you
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cyrus-imapd-2.3.11_reload_conf-asx.patch
Type: text/x-diff
Size: 2372 bytes
Desc: not available
Url : http://lists.andrew.cmu.edu/pipermail/info-cyrus/attachments/20080401/9845f6ea/attachment.bin 


More information about the Info-cyrus mailing list