[CalendarServer-changes] [6406] CalendarServer/trunk/txdav/base/datastore/subpostgres.py
source_changes at macosforge.org
source_changes at macosforge.org
Wed Oct 6 14:26:53 PDT 2010
Revision: 6406
http://trac.macosforge.org/projects/calendarserver/changeset/6406
Author: sagen at apple.com
Date: 2010-10-06 14:26:51 -0700 (Wed, 06 Oct 2010)
Log Message:
-----------
Delay reactor shutdown while performing database initialization
Modified Paths:
--------------
CalendarServer/trunk/txdav/base/datastore/subpostgres.py
Modified: CalendarServer/trunk/txdav/base/datastore/subpostgres.py
===================================================================
--- CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2010-10-06 20:31:12 UTC (rev 6405)
+++ CalendarServer/trunk/txdav/base/datastore/subpostgres.py 2010-10-06 21:26:51 UTC (rev 6406)
@@ -244,6 +244,15 @@
self.dataStoreDirectory = dataStoreDirectory
self.resetSchema = resetSchema
+ # In order to delay a shutdown until database initialization has
+ # completed, we register a before-shutdown callback. This callback
+ # returns immediately if we're not in the critical code, and returns
+ # a deferred if we are. That deferred gets fired once database init
+ # is complete and shutdown can proceed.
+ self.delayedShutdown = False # set to True when in critical code
+ self.shutdownDeferred = None # the actual deferred
+ reactor.addSystemEventTrigger("before", "shutdown", self.shutdownCallback)
+
# Options from config
self.databaseName = databaseName
self.logFile = logFile
@@ -270,7 +279,36 @@
self.monitor = None
self.openConnections = []
+ def shutdownCallback(self):
+ """
+ Callback registered for before-reactor-shutdown. Returns immediately
+ if delayedShutdown is False. Returns a deferred if delayedShutdown
+ is True.
+ """
+ if self.delayedShutdown:
+ self.shutdownDeferred = Deferred()
+ return self.shutdownDeferred
+ def activateDelayedShutdown(self):
+ """
+ Call this when starting database initialization code to protect against
+ shutdown.
+
+ Sets the delayedShutdown flag to True so that if reactor shutdown
+ commences, the shutdown will be delayed until deactivateDelayedShutdown
+ is called.
+ """
+ self.delayedShutdown = True
+
+ def deactivateDelayedShutdown(self):
+ """
+ Call this when database initialization code has completed so that the
+ reactor can shutdown.
+ """
+ self.delayedShutdown = False
+ if self.shutdownDeferred:
+ self.shutdownDeferred.callback(None)
+
def produceConnection(self, label="<unlabeled>", databaseName=None):
"""
Produce a DB-API 2.0 connection pointed at this database.
@@ -405,14 +443,17 @@
self.monitor = monitor
def gotReady(result):
self.ready()
+ self.deactivateDelayedShutdown()
def reportit(f):
log.err(f)
+ self.deactivateDelayedShutdown()
self.monitor.completionDeferred.addCallback(
gotReady).addErrback(reportit)
def startService(self):
MultiService.startService(self)
+ self.activateDelayedShutdown()
clusterDir = self.dataStoreDirectory.child("cluster")
workingDir = self.dataStoreDirectory.child("working")
env = self.env = os.environ.copy()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20101006/fbc51d06/attachment.html>
More information about the calendarserver-changes
mailing list