[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