[Zope] how do I manage a graceful shutdown?

Toby Dickenson tdickenson@geminidataloggers.com
Fri, 21 Feb 2003 00:13:45 +0000


On Thursday 20 February 2003 9:48 pm, Jamie Heilman wrote:
> Toby Dickenson wrote:
> > Read the code. It allows medusa-registered sockets to manage the shutdown
> > process.
>
> OK, so if one had a Product that they wanted to be lifetime aware, do
> you have an example of how one could one use this API?

I hope youve read the documentation in Lifetime.py. I include it below. First 
you need to work out what phase of the shutdown process you need to take 
action in, or delay.

The easiest example is from the HTTP Server. It includes this code to close 
the listening socket (the socket that receives new connections) in phase 2

def clean_shutdown_control(self,phase,time_in_this_phase):
        if phase==2:
            self.log_info('closing HTTP to new connections')
            self.close()

Sockets for http clients have this code that keeps zope in shutdown phase 3 
for as long as there is still a request in progress.

    def clean_shutdown_control(self,phase,time_in_this_phase):
        if phase==3:
            # This is the shutdown phase where we are trying to finish 
processing
            # outstanding requests, and not accept any more
            self.no_more_requests = 1
            if self.working or self.writable():
                # We are busy working on an old request. Try to stall shutdown
                return 1
            else:
                # We are no longer busy. Close ourself and allow shutdown to 
proceed
                self.close()
                return 0




# The shutdown phase counts up from 0 to 4.
#
# 0  Not yet terminating. running in main loop
#
# 1  Loss of service is imminent. Prepare any front-end proxies for this 
happening
#    by stopping any ICP servers, so that they can choose to send requests to 
other
#    Zope servers in the cluster.
#
# 2  Stop accepting any new requests.
#
# 3  Wait for all old requests to have been processed
#
# 4  Already terminated
#
# It is up to individual socket handlers to implement these actions, by 
providing the
# 'clean_shutdown_control' method. This is called intermittantly during 
shutdown with
# two parameters; the current phase number, and the amount of time that it has 
currently
# been in that phase. This method should return true if it does not yet want 
shutdown to
# proceed to the next phase.


-- 
Toby Dickenson
http://www.geminidataloggers.com/people/tdickenson