[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