[CalendarServer-changes] [4832] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Mon Dec 7 14:00:59 PST 2009


Revision: 4832
          http://trac.macosforge.org/projects/calendarserver/changeset/4832
Author:   wsanchez at apple.com
Date:     2009-12-07 14:00:59 -0800 (Mon, 07 Dec 2009)
Log Message:
-----------
Unroll some inlineCallbacks

Modified Paths:
--------------
    CalendarServer/trunk/HACKING
    CalendarServer/trunk/calendarserver/sidecar/task.py

Modified: CalendarServer/trunk/HACKING
===================================================================
--- CalendarServer/trunk/HACKING	2009-12-07 21:57:09 UTC (rev 4831)
+++ CalendarServer/trunk/HACKING	2009-12-07 22:00:59 UTC (rev 4832)
@@ -268,16 +268,15 @@
      d.addErrback(onError)
      return d
 
- * When using ``waitForDeferred()`` in a deferredGenerator, ``x`` may
-   be used to clear the deferred if the deferred result will be ignored.
+ * We prefer ``inlineCallbacks`` over ``deferredGenerator``.
+   ``inlineCallbacks`` are more readable, and we do not support Python
+   versions old enough that ``deferredGenerator`` would be necessary.
 
-   ::
+ * That said, avoid using ``inlineCallbacks`` when chaining deferreds
+   is straightforward, as they are more expensive.  Use
+   ``inlineCallbacks`` when necessary for keeping code maintainable,
+   such as when creating serialized deferreds in a for loop.
 
-     x = waitForDeferred(doThisAndThat())
-     yield x
-     x.getResult()
-     del x # Optional, but should be safe
-
  * ``_`` may be used to denote unused callback arguments:
 
    ::

Modified: CalendarServer/trunk/calendarserver/sidecar/task.py
===================================================================
--- CalendarServer/trunk/calendarserver/sidecar/task.py	2009-12-07 21:57:09 UTC (rev 4831)
+++ CalendarServer/trunk/calendarserver/sidecar/task.py	2009-12-07 22:00:59 UTC (rev 4832)
@@ -25,7 +25,7 @@
 from time import sleep
 from twisted.application.service import Service, IServiceMaker
 from twisted.internet.address import IPv4Address
-from twisted.internet.defer import DeferredList, inlineCallbacks, returnValue
+from twisted.internet.defer import DeferredList, succeed
 from twisted.internet.reactor import callLater
 from twisted.plugin import IPlugin
 from twisted.python.reflect import namedClass
@@ -56,23 +56,27 @@
         self._urlsByResource = {}
         self.headers = Headers()
 
-    @inlineCallbacks
     def _getChild(self, resource, segments):
         if not segments:
             returnValue(resource)
 
-        child, remaining = (yield resource.locateChild(self, segments))
-        returnValue((yield self._getChild(child, remaining)))
+        d = resource.locateChild(self, segments)
+        d.addCallback(lambda location: self._getChild(*location))
+        return d
 
-    @inlineCallbacks
     def locateResource(self, url):
         url = url.strip("/")
         segments = url.split("/")
-        resource = (yield self._getChild(self.rootResource, segments))
-        if resource:
-            self._rememberResource(resource, url)
-        returnValue(resource)
 
+        def remember(resource):
+            if resource:
+                self._rememberResource(resource, url)
+            return resource
+
+        d = self._getChild(self.rootResource, segments)
+        d.addCallback(remember)
+        return d
+
     def _rememberResource(self, resource, url):
         self._resourcesByURL[url] = resource
         self._urlsByResource[resource] = url
@@ -87,7 +91,6 @@
     def addResponseFilter(*args, **kwds):
         pass
 
- at inlineCallbacks
 def processInboxItem(rootResource, directory, inboxFile, inboxItemFile, uuid):
     log.debug("Processing inbox item %s" % (inboxItemFile,))
 
@@ -102,7 +105,7 @@
     try:
         method = calendar.propertyValue("METHOD")
     except ValueError:
-        returnValue(None)
+        return succeed(None)
 
     if method == "REPLY":
         # originator is attendee sending reply
@@ -115,12 +118,14 @@
     originator = LocalCalendarUser(originator, originatorPrincipal)
     recipients = (owner,)
     scheduler = DirectScheduler(FakeRequest(rootResource, "PUT"), inboxItemFile)
-    result = (yield scheduler.doSchedulingViaPUT(originator, recipients,
-        calendar, internal_request=False))
 
-    if os.path.exists(inboxItemFile.fp.path):
-        os.remove(inboxItemFile.fp.path)
+    def removeItem(_):
+        if inboxItemFile.fp.exists():
+            inboxItemFile.fp.remove()
 
+    d = scheduler.doSchedulingViaPUT(originator, recipients, calendar, internal_request=False))
+    d.addCallback(removeItem)
+    return d
 
 
 class Task(object):
@@ -130,27 +135,25 @@
         self.taskName = fileName.split(".")[0]
         self.taskFile = os.path.join(self.service.processingDir, fileName)
 
-    @inlineCallbacks
     def run(self):
-        methodName = "task_%s" % (self.taskName,)
-        method = getattr(self, methodName, None)
-        if method:
-            try:
-                log.warn("Running task '%s'" % (self.taskName))
-                yield method()
-                log.warn("Completed task '%s'" % (self.taskName))
-            except Exception, e:
-                log.error("Failed task '%s' (%s)" % (self.taskName, e))
-                os.remove(self.taskFile)
-                raise
-        else:
-            log.error("Unknown task requested: '%s'" % (self.taskName))
+        method = getattr(self, "task_%s" % (self.taskName,), None)
+
+        if method is None:
+            log.error("Unknown task requested: %s" % (self.taskName))
             os.remove(self.taskFile)
-            returnValue(None)
+            return succeed(None)
 
-    @inlineCallbacks
+        try:
+            log.warn("Running task: %s" % (self.taskName))
+            d = method()
+            d.addCallback(lambda _: log.warn("Completed task: %s" % (self.taskName)))
+            return d
+        except Exception, e:
+            log.error("Failed task '%s' (%s)" % (self.taskName, e))
+            os.remove(self.taskFile)
+            raise
+
     def task_scheduleinboxes(self):
-
         calendars = self.service.root.getChild("calendars")
         uidDir = calendars.getChild("__uids__")
 
@@ -174,21 +177,25 @@
 
             inboxItemFile = inboxFile.getChild(fileName)
 
-            yield processInboxItem(
+            def processed(_):
+                inboxItems.remove(inboxItem)
+
+                # Rewrite the task file in case we exit before we're done
+                with open(self.taskFile + ".tmp", "w") as output:
+                    for inboxItem in inboxItems:
+                        output.write("%s\n" % (inboxItem,))
+                os.rename(self.taskFile + ".tmp", self.taskFile)
+
+            d = processInboxItem(
                 self.service.root,
                 self.service.directory,
                 inboxFile,
                 inboxItemFile,
                 uuid
             )
-            inboxItems.remove(inboxItem)
+            d.addCallback(processed)
+            return d
 
-            # Rewrite the task file in case we exit before we're done
-            with open(self.taskFile + ".tmp", "w") as output:
-                for inboxItem in inboxItems:
-                    output.write("%s\n" % (inboxItem,))
-            os.rename(self.taskFile + ".tmp", self.taskFile)
-
         os.remove(self.taskFile)
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20091207/3ae87447/attachment.html>


More information about the calendarserver-changes mailing list