[CalendarServer-changes] [9672] CalendarServer/branches/users/glyph/q

source_changes at macosforge.org source_changes at macosforge.org
Sat Aug 11 01:55:42 PDT 2012


Revision: 9672
          http://trac.macosforge.org/projects/calendarserver/changeset/9672
Author:   glyph at apple.com
Date:     2012-08-11 01:55:41 -0700 (Sat, 11 Aug 2012)
Log Message:
-----------
Add a factory to construct connections in the worker, and adjust NullQueuer so its signature matches.

Modified Paths:
--------------
    CalendarServer/branches/users/glyph/q/twext/enterprise/queue.py

Property Changed:
----------------
    CalendarServer/branches/users/glyph/q/

Modified: CalendarServer/branches/users/glyph/q/twext/enterprise/queue.py
===================================================================
--- CalendarServer/branches/users/glyph/q/twext/enterprise/queue.py	2012-08-11 08:55:41 UTC (rev 9671)
+++ CalendarServer/branches/users/glyph/q/twext/enterprise/queue.py	2012-08-11 08:55:41 UTC (rev 9672)
@@ -598,6 +598,25 @@
 
 
 
+class WorkerFactory(Factory, object):
+    """
+    Factory, to be used as the client to connect from the worker to the
+    controller.
+    """
+
+    def __init__(self, transactionFactory, schema):
+        """
+        Create a L{WorkerFactory} with a transaction factory and a schema.
+        """
+        self.transactionFactory = transactionFactory
+        self.schema = schema
+
+
+    def buildProtocol(self, addr):
+        return ConnectionFromController(self.transactionFactory, self.schema)
+
+
+
 class TransactionFailed(Exception):
     """
     A transaction failed.
@@ -1043,6 +1062,31 @@
 
 
 
+class ImmediateWorkProposal(object):
+    """
+    Like L{WorkProposal}, but for items that must be executed immediately
+    because no real queue is set up yet.
+
+    @see: L{WorkProposal}, L{NullQueuer.enqueueWork}
+    """
+    def __init__(self, proposed, done):
+        self.proposed = proposed
+        self.done = done
+
+
+    def whenExecuted(self):
+        return _cloneDeferred(self.done)
+
+
+    def whenProposed(self):
+        return _cloneDeferred(self.proposed)
+
+
+    def whenCommitted(self):
+        return _cloneDeferred(self.done)
+
+
+
 class NullQueuer(object):
     """
     When work is enqueued with this queuer, it is just executed immediately,
@@ -1050,16 +1094,34 @@
     very efficient.
     """
 
-    @inlineCallbacks
     def enqueueWork(self, txn, workItemType, **kw):
         """
         Do this work immediately.
 
         @see: L{PeerConnectionPool.enqueueWork}
+
+        @return: a pseudo work proposal, since everything completes at the same
+            time.
+        @rtype: L{ImmediateWorkProposal}
         """
-        item = yield self.workItemType.create(self.txn, **self.kw)
-        yield item.delete()
-        yield item.doWork()
+        proposed = Deferred()
+        done = Deferred()
+        @inlineCallbacks
+        def doit():
+            item = yield self.workItemType.create(self.txn, **self.kw)
+            proposed.callback(True)
+            yield item.delete()
+            yield item.doWork()
+        @txn.postCommit
+        def committed():
+            done.callback(True)
+        @txn.postAbort
+        def aborted():
+            tf = TransactionFailed()
+            done.errback(tf)
+            if not proposed.called:
+                proposed.errback(tf)
+        return ImmediateWorkProposal(proposed, done)
 
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120811/7b331ba2/attachment-0001.html>


More information about the calendarserver-changes mailing list