[CalendarServer-changes] [8382] CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/ datastore/upgrade/migrate.py

source_changes at macosforge.org source_changes at macosforge.org
Sat Dec 3 00:37:39 PST 2011


Revision: 8382
          http://trac.macosforge.org/projects/calendarserver/changeset/8382
Author:   glyph at apple.com
Date:     2011-12-03 00:37:39 -0800 (Sat, 03 Dec 2011)
Log Message:
-----------
misc fixes to get through the test suite, and move configuration external to the migration service

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/migrate.py

Modified: CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/migrate.py
===================================================================
--- CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/migrate.py	2011-12-03 08:37:25 UTC (rev 8381)
+++ CalendarServer/branches/users/glyph/parallel-upgrade/txdav/common/datastore/upgrade/migrate.py	2011-12-03 08:37:39 UTC (rev 8382)
@@ -35,8 +35,6 @@
 
 from twisted.protocols.amp import AMP, Command, String
 
-from twext.internet.spawnsvc import SpawnerService
-
 from txdav.caldav.datastore.util import migrateHome as migrateCalendarHome
 from txdav.carddav.datastore.util import migrateHome as migrateAddressbookHome
 from txdav.common.datastore.file import CommonDataStore as FileStore, TOPPATHS
@@ -92,11 +90,11 @@
         self.service = upgradeService
 
 
-    def configure(self):
-        from twistedcaldav.config import config
+    def configure(self, filename):
         return self.callRemote(Configure,
-                               filename=config._provider.getConfigFileName()
-                               or "")
+                               filename=filename
+                               # config._provider.getConfigFileName() or ""
+                           )
 
 
     def oneUpgrade(self, uid, homeType):
@@ -132,13 +130,28 @@
     Helper protocol which runs in a subprocess to upgrade.
     """
 
+    def __init__(self, store):
+        """
+        
+        """
+        super(UpgradeHelperProcess, self).__init__()
+        self.store = store
+        self.store.setMigrating(True)
+        
+
     @Configure.responder
     @logFailures
     def configure(self, filename):
+        subsvc = None
+        self.upgrader = UpgradeToDatabaseService.wrapService(
+            CachingFilePath(filename), subsvc, self.store
+        )
+        return {}
+
+        # This stuff needs to be done by somebody in caldavd.py
         from twistedcaldav.config import config
         from calendarserver.tap.util import getDBPool, storeFromConfig
         config.load(filename)
-        subsvc = object()
         pool, txnf = getDBPool(config)
         if pool is not None:
             pool.startService()
@@ -148,9 +161,6 @@
         # calendarserver.tap.caldav does with its own thing.
         dbstore = storeFromConfig(config, txnf)
         dbstore.setMigrating(True)
-        self.upgrader = UpgradeToDatabaseService.wrapService(
-            CachingFilePath(config.DocumentRoot), subsvc, dbstore
-        )
         return {}
 
 
@@ -179,7 +189,8 @@
     """
 
     @classmethod
-    def wrapService(cls, path, service, store, uid=None, gid=None):
+    def wrapService(cls, path, service, store, uid=None, gid=None,
+                    parallel=0, spawner=None):
         """
         Create an L{UpgradeToDatabaseService} if there are still file-based
         calendar or addressbook homes remaining in the given path.
@@ -199,6 +210,11 @@
 
         @type service: L{IService}
 
+        @param parallel: The number of parallel subprocesses that should manage
+            the upgrade.
+
+        @param spawner: the L{SpawnerService} subclass.
+
         @return: a service
         @rtype: L{IService}
         """
@@ -239,14 +255,14 @@
                 self = cls(
                     FileStore(path, None, True, True,
                               propertyStoreClass=appropriateStoreClass),
-                    store, service, uid=uid, gid=gid,
+                    store, service, uid=uid, gid=gid, spawner=spawner
                 )
                 return self
         return service
 
 
     def __init__(self, fileStore, sqlStore, service, uid=None, gid=None,
-                 parallel=5):
+                 parallel=0, spawner=None):
         """
         Initialize the service.
         """
@@ -256,6 +272,7 @@
         self.uid = uid
         self.gid = gid
         self.parallel = parallel
+        self.spawner = spawner
 
 
     @inlineCallbacks
@@ -298,18 +315,19 @@
         parallel = self.parallel
         if parallel:
             self.log_warn("Starting upgrade helper processes.")
-            spawner = SpawnerService()
+            spawner = self.spawner
             spawner.startService()
             drivers = []
             for value in xrange(parallel):
-                driver = spawner.spawn(UpgradeDriver(self),
-                                       UpgradeHelperProcess)
+                driver = yield spawner.spawn(UpgradeDriver(self),
+                                             UpgradeHelperProcess)
                 drivers.append(driver)
 
             # Wait for all subprocesses to be fully configured before
             # continuing, but let them configure in any order.
             self.log_warn("Configuring upgrade helper processes.")
-            yield DeferredList([driver.configure() for driver in drivers])
+            yield DeferredList([driver.configure(self.fileStore._path.path)
+                                for driver in drivers])
             self.log_warn("Upgrade helpers ready.")
 
         self.log_warn("Beginning filesystem -> database upgrade.")
@@ -340,14 +358,15 @@
                     d.addBoth(freeUp)
                 else:
                     yield self.migrateOneHome(fileTxn, homeType, fileHome)
+
+        if inParallel:
+            yield DeferredList(inParallel)
+
         for homeType in TOPPATHS:
             homesPath = self.fileStore._path.child(homeType)
             if homesPath.isdir():
                 homesPath.remove()
 
-        if inParallel:
-            yield DeferredList(inParallel)
-        
         # Set attachment directory ownership.  FIXME: is this still necessary
         # since attachments started living outside the database directory
         # created by initdb?  default permissions might be correct now.
@@ -368,8 +387,10 @@
         self.log_warn(
             "Filesystem upgrade complete, launching database service."
         )
-        # see http://twistedmatrix.com/trac/ticket/4649
-        reactor.callLater(0, self.wrappedService.setServiceParent, self.parent)
+        wrapped = self.wrappedService
+        if wrapped is not None:
+            # see http://twistedmatrix.com/trac/ticket/4649
+            reactor.callLater(0, wrapped.setServiceParent, self.parent)
 
 
     def startService(self):
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20111203/3b71ab88/attachment.html>


More information about the calendarserver-changes mailing list