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

From: Simon Matter (no email)
Date: Wed Apr 02 2008 - 04:30:18 EDT

  • Next message: Bron Gondwana: "Re: Sync_client error Hit upload limit 0"

    > 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)

    Hi Alain,

    Thanks for the patch, I'll try it out and may include it in my rpms later.
    If I understand this correctly one drawback could be that on a heavy
    loaded server sending SIGHUP will resuilt in much more newly created
    processes after the SIGHUP has been sent. Could that be a problem somehow?

    Simon

    >
    > 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
    > ----
    > Cyrus Home Page: http://cyrusimap.web.cmu.edu/
    > Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
    > List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

    ----
    Cyrus Home Page: http://cyrusimap.web.cmu.edu/
    Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
    List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html
    

  • Next message: Bron Gondwana: "Re: Sync_client error Hit upload limit 0"





    Hosted Email Solutions

    Invaluement Anti-Spam DNSBLs



    Powered By FreeBSD   Powered By FreeBSD