[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