Graceful restart also for imapd.conf
Olivier ROLAND
cyrus-dev at edla.org
Tue Aug 9 05:42:03 EDT 2011
2011/8/9 Dave McMurtrie <dave64 at andrew.cmu.edu>:
>
>
> On Aug 9, 2011, at 4:50 AM, Olivier ROLAND <cyrus-dev at edla.org> wrote:
>
>> 2011/8/9 Greg Banks <gnb at fastmail.fm>:
>>> G'day Olivier,
>>>
>>> On 08/08/11 19:39, Olivier ROLAND wrote:
>>>>
>>>> Hi there,
>>>>
>>>> Since version 2.0.9 Cyrus master can re-read /etc/cyrus.conf on SIGHUP.
>>>>
>>>> The man say :
>>>> Master rereads its configuration file when it receives a hangup
>>>> signal,
>>>> SIGHUP. Services and events may be added, deleted or modified when
>>>> the
>>>> configuration file is reread. Any active services removed from
>>>> the
>>>> configuration file will be allowed to run until completion.
>>>>
>>>> Looking at the code I wonder why we don't do the same to re-reread
>>>> /etc/imapd.conf.
>>>> Actually, master only send a SIGHUP to children when the service have
>>>> been removed.
>>>> My guess is that we could send a SIGHUP to all services. That way we
>>>> don't have to wait for all preforked processes to finish before taking
>>>> into account the new imapd.conf
>>>> I have made some test and till now all seem working well.
>>>
>>> I haven't seen your code so I don't know how you're dealing with re-reading
>>> imapd.conf. But I note that in the code I see there's a bunch of global
>>> variables in the imapd process which are set as a side effect of reading
>>> imapd.conf. Not handling those properly can have all sorts of unpleasant
>>> effects, including memory leaks and pointers to freed memory. You might
>>> want to look at the recent commit in the master branch that adds a function
>>> config_reset() that handles all that; it was added for unit testing but
>>> could be useful when re-reading imapd.conf.
>>>
>>> http://git.cyrusimap.org/cyrus-imapd/commit/?id=03b4fcc4d956ccbfbbd5220b6d1ca9107707821f
>>>
>>>> The only tricky thing I see is that we don't want to SIGHUP children
>>>> in the SERVICE_STATE_DEAD state but the actual code already take care
>>>> of that.
>>>>
>>>> So is there any problem that justify to limit the SIGHUP propagation
>>>> to children for removed service only ?
>>>> Or could we go a bit further (with very few modification to the code)
>>>> and allow graceful restart when we modify /etc/imapd.conf.
>>>>
>>>
>>> There are some imapd.conf entries which it would probably be a really bad
>>> idea to modify partway through a client session, like 'virtdomains'. There
>>> are others which are only consulted during imapd process initialisation and
>>> would be ignored if the file was re-read later, like 'mupdate_server'. All
>>> the code that uses config data was written under the assumption that the
>>> data would not change in the lifetime of the process, and in some cases that
>>> assumption allowed simplifying short-cuts which would not be valid
>>> otherwise.
>>>
>>> So while I think it would be great to be able to re-read imapd.conf on
>>> SIGHUP, there may be quite a lot of work to clean up the fallout.
>>>
>>> --
>>> Greg.
>>>
>>>
>>
>> Thanks a lot Greg for your feedback but you missed the point ;-)
>> I don't change anything during the lifetime of the process.
>> Cyrus let the last active child finally terminate with the old
>> imapd.conf and then force the process to exit cleanly immediatly
>> without recycling. (no additional code is needed, all is already
>> there, see the code used when a service is disabled)
>> We are with a brand new process for the new imapd.conf, so no problem
>> with global variables, no problem with initialisation, etc ...
>>
>> The idea here is to use this code not only when a service is disabled
>> but every time master receive a SIGHUP.
>> I see no side effect during all my tests but prefer to ask the mailing
>> list just in case I missed something.
>> Seem that we could have re-read imapd.conf functionality for free. In
>> fact I'm very surprised that this was not done before ;-)
>>
>
> If you're interested, you can already accomplish this by updating the mtime (touch) of the on-disk executable for whichever process you want to re-read imapd.conf. This check is actually in place to detect if a new binary has been installed so you could (in theory) upgrade while Cyrus is still running, but changing the mtime of the binary should have the effect you desire.
>
> Hth,
>
> Dave
Thank's Dave. Yes indeed your trick works (calling exactly the same
piece of code).
Good to know but can we reasonably tell a sysadmin to proceed like
that ? I don't think so.
Olivier ROLAND
AtoS
More information about the Cyrus-devel
mailing list