[Erp5-report] r22387 - /erp5/trunk/products/ClockServer/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Jul 9 16:14:21 CEST 2008
Author: vincent
Date: Wed Jul 9 16:14:21 2008
New Revision: 22387
URL: http://svn.erp5.org?rev=22387&view=rev
Log:
Define, handle and advertise shutdown_method option.
Modified:
erp5/trunk/products/ClockServer/ClockServer.py
erp5/trunk/products/ClockServer/README
erp5/trunk/products/ClockServer/component.xml
erp5/trunk/products/ClockServer/datatypes.py
Modified: erp5/trunk/products/ClockServer/ClockServer.py
URL: http://svn.erp5.org/erp5/trunk/products/ClockServer/ClockServer.py?rev=22387&r1=22386&r2=22387&view=diff
==============================================================================
--- erp5/trunk/products/ClockServer/ClockServer.py (original)
+++ erp5/trunk/products/ClockServer/ClockServer.py Wed Jul 9 16:14:21 2008
@@ -39,6 +39,13 @@
class ClockServer(OriginalClockServer):
running = True
+ def __init__(self, *args, **kw):
+ self.shutdown_method = kw.pop('shutdown_method')
+ OriginalClockServer.__init__(self, *args, **kw)
+ if self.shutdown_method is None:
+ self.log_info('ClockServer shutdown_method is not set in configuration'\
+ 'file. Unclean shutdown can happen.', type='warning')
+
def readable(self):
"""
Avoid starting a new tic if shutdown started.
@@ -73,31 +80,29 @@
closed.
"""
self.running = False
- separator = '?' in self.method and '&' or '?'
- # XXX: should use a float for time representation
- # TODO: allow user to specify a separate shutdown method instead of
- # reusing regular one.
- method = '%s%sshutdown:int=1&phase:int=%i&time_in_phase:int=%i' % \
- (self.method, separator, _shutdown_phase, time_in_this_phase)
+ if self.shutdown_method is not None:
+ # XXX: should use a float for time representation
+ method = '%s?phase:int=%i&time_in_phase:float=%f' % \
+ (self.shutdown_method, _shutdown_phase, time_in_this_phase)
- stdin = StringIO.StringIO()
- request_string = 'GET %s HTTP/1.0' % (method, )
- request = http_request(DummyChannel(self), request_string, 'GET', method,
- '1.0', self.headers)
- environment = self.get_env(request)
- response = make_response(request, environment)
- # Hook response._finish to get a notification when request is over.
- def _finish():
- response.__class__._finish(response)
+ stdin = StringIO.StringIO()
+ request_string = 'GET %s HTTP/1.0' % (method, )
+ request = http_request(DummyChannel(self), request_string, 'GET', method,
+ '1.0', self.headers)
+ environment = self.get_env(request)
+ response = make_response(request, environment)
+ # Hook response._finish to get a notification when request is over.
+ def _finish():
+ response.__class__._finish(response)
+ wait_for_close_lock.release()
+ response._finish = _finish
+ # (end of hook)
+ zope_request = HTTPRequest(stdin, environment, response)
+ wait_for_close_lock.acquire()
+ self.zhandler('Zope2', zope_request, response)
+ self.log_info('ClockServer: Waiting for shutdown handler.')
+ wait_for_close_lock.acquire()
+ self.log_info('ClockServer: Going on.')
wait_for_close_lock.release()
- response._finish = _finish
- # (end of hook)
- zope_request = HTTPRequest(stdin, environment, response)
- wait_for_close_lock.acquire()
- self.zhandler('Zope2', zope_request, response)
- self.log_info('ClockServer: Waiting for shutdown handler.')
- wait_for_close_lock.acquire()
- self.log_info('ClockServer: Going on.')
- wait_for_close_lock.release()
return 0 # TODO: detect an error to allow taking the veto.
Modified: erp5/trunk/products/ClockServer/README
URL: http://svn.erp5.org/erp5/trunk/products/ClockServer/README?rev=22387&r1=22386&r2=22387&view=diff
==============================================================================
--- erp5/trunk/products/ClockServer/README (original)
+++ erp5/trunk/products/ClockServer/README Wed Jul 9 16:14:21 2008
@@ -29,6 +29,7 @@
timerserver) and use the following configuration:
method /Control_Panel/timer_service/process_timer?interval:int=5
+ shutdown_method /Control_Panel/timer_service/process_shutdown
period 5
Note: Because ClockServer uses asyncore's "readable" method polling,
Modified: erp5/trunk/products/ClockServer/component.xml
URL: http://svn.erp5.org/erp5/trunk/products/ClockServer/component.xml?rev=22387&r1=22386&r2=22387&view=diff
==============================================================================
--- erp5/trunk/products/ClockServer/component.xml (original)
+++ erp5/trunk/products/ClockServer/component.xml Wed Jul 9 16:14:21 2008
@@ -7,6 +7,19 @@
The traversal path (from the Zope root) to an
executable Zope method (Python Script, external method, product
method, etc). The method must take no arguments. Ex: "/site/methodname"
+ </description>
+ </key>
+ <key name="shutdown_method" datatype="string">
+ <description>
+ The traversal path (from the Zope root) to an
+ executable Zope method (Python Script, external method, product
+ method, etc). The method must take the following arguments:
+ phase (number)
+ Shutdown phase number.
+ See Lifetime.py .
+ time_in_phase (number)
+ Time spent in current phase, in seconds.
+ Given method path must not contain any argument. Ex: "/site/methodname"
</description>
</key>
<key name="period" datatype="integer" default="60">
Modified: erp5/trunk/products/ClockServer/datatypes.py
URL: http://svn.erp5.org/erp5/trunk/products/ClockServer/datatypes.py?rev=22387&r1=22386&r2=22387&view=diff
==============================================================================
--- erp5/trunk/products/ClockServer/datatypes.py (original)
+++ erp5/trunk/products/ClockServer/datatypes.py Wed Jul 9 16:14:21 2008
@@ -18,6 +18,7 @@
def __init__(self, section):
ServerFactory.__init__(self)
self.method = section.method
+ self.shutdown_method = section.shutdown_method
self.period = section.period
self.user = section.user
self.password = section.password
@@ -28,5 +29,6 @@
from Products.ClockServer.ClockServer import ClockServer
from ZServer.AccessLogger import access_logger
return ClockServer(self.method, self.period, self.user,
- self.password, self.hostheader, access_logger)
+ self.password, self.hostheader, access_logger,
+ shutdown_method=self.shutdown_method)
More information about the Erp5-report
mailing list