[Checkins] SVN: lovely.responsecache/trunk/ Use a transaction
datamanager to do the purge.
Juergen Kartnaller
juergen at kartnaller.at
Wed Feb 13 02:07:38 EST 2008
Log message for revision 83777:
Use a transaction datamanager to do the purge.
Purging is now done on transaction boundaries to make sure we only purge if
everything got well.
Changed:
U lovely.responsecache/trunk/CHANGES.txt
U lovely.responsecache/trunk/setup.py
U lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
U lovely.responsecache/trunk/src/lovely/responsecache/configure.zcml
U lovely.responsecache/trunk/src/lovely/responsecache/purge.py
-=-
Modified: lovely.responsecache/trunk/CHANGES.txt
===================================================================
--- lovely.responsecache/trunk/CHANGES.txt 2008-02-13 03:51:58 UTC (rev 83776)
+++ lovely.responsecache/trunk/CHANGES.txt 2008-02-13 07:07:36 UTC (rev 83777)
@@ -2,6 +2,11 @@
Changes for lovely.responsecache
================================
+2008/02/13 0.4.3a1
+==================
+
+- use a transaction datamanager to do the purge
+
2008/02/07 0.4.2
================
Modified: lovely.responsecache/trunk/setup.py
===================================================================
--- lovely.responsecache/trunk/setup.py 2008-02-13 03:51:58 UTC (rev 83776)
+++ lovely.responsecache/trunk/setup.py 2008-02-13 07:07:36 UTC (rev 83777)
@@ -23,7 +23,7 @@
setup(
name = 'lovely.responsecache',
- version = '0.4.2',
+ version = '0.4.3a1',
author = "Lovely Systems",
author_email = "office at lovelysystems.com",
description = "Cache results of ContentProviders",
Modified: lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt 2008-02-13 03:51:58 UTC (rev 83776)
+++ lovely.responsecache/trunk/src/lovely/responsecache/PURGE.txt 2008-02-13 07:07:36 UTC (rev 83777)
@@ -21,12 +21,22 @@
>>> util.purge('http://domain/purge_expression1')
-Now call the endOfRequest function. NOTE: In wild this function is registed
-as an event handler and will be called at the end of any request::
+Purging is integrated into the transaction manager, that means the real purge
+is done on transaction commit and only if the the second phase of the commit
+is used. This makes sure we do not purge if a request fails.
- >>> from lovely.responsecache.purge import endOfRequest
+ >>> import transaction
+
+Before we commit the transaction we clear the log to check for purges.
+
>>> log_info.clear()
- >>> endOfRequest(None)
+
+Now we commit.
+
+ >>> transaction.commit()
+
+And have our purge in the log.
+
>>> print log_info
lovely.responsecache.purge ERROR
unable to purge 'http://localhost:33334/purge_expression1', reason: (7, "couldn't connect to host")
@@ -71,7 +81,7 @@
>>> log_info.clear()
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> print log_info
lovely.responsecache.purge INFO
purged 'http://localhost:33334/purge_expression1'
@@ -79,10 +89,10 @@
>>> purgedUrls
['/purge_expression1']
-If the endOfRequest get called twice there should not be more to purge::
+If we commit without adding a new purge nothing happens.
>>> purgedUrls = []
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
[]
@@ -91,7 +101,7 @@
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
>>> util.purge('http://domain/purge_expression2')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1', '/purge_expression2']
@@ -101,7 +111,7 @@
>>> util.purge('http://domain/purge_expression1')
>>> util.purge('http://domain/purge_expression2')
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1', '/purge_expression2']
@@ -122,7 +132,7 @@
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1', '/purge_expression1']
@@ -140,7 +150,7 @@
>>> log_info.clear()
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1']
@@ -163,7 +173,7 @@
>>> log_info.clear()
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1']
@@ -179,7 +189,7 @@
>>> log_info.clear()
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1']
@@ -196,7 +206,7 @@
>>> log_info.clear()
>>> purgedUrls = []
>>> util.purge('http://domain/purge_expression1')
- >>> endOfRequest(None)
+ >>> transaction.commit()
>>> purgedUrls
['/purge_expression1', '/purge_expression1']
Modified: lovely.responsecache/trunk/src/lovely/responsecache/configure.zcml
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/configure.zcml 2008-02-13 03:51:58 UTC (rev 83776)
+++ lovely.responsecache/trunk/src/lovely/responsecache/configure.zcml 2008-02-13 07:07:36 UTC (rev 83777)
@@ -11,8 +11,6 @@
<subscriber handler=".event.setCache"/>
<subscriber handler=".event.setAuthInfoCookie"/>
- <subscriber for="zope.app.publication.interfaces.IEndRequestEvent"
- handler=".purge.endOfRequest"/>
<view
name="ckey" type="*"
Modified: lovely.responsecache/trunk/src/lovely/responsecache/purge.py
===================================================================
--- lovely.responsecache/trunk/src/lovely/responsecache/purge.py 2008-02-13 03:51:58 UTC (rev 83776)
+++ lovely.responsecache/trunk/src/lovely/responsecache/purge.py 2008-02-13 07:07:36 UTC (rev 83777)
@@ -19,9 +19,12 @@
import logging
import threading
-from time import time
import urlparse
+import transaction
+from time import time
+from transaction.interfaces import IDataManager
+
from zope import component, interface
from zope.schema.fieldproperty import FieldProperty
@@ -48,6 +51,7 @@
for esc in escapes:
expr = expr.replace(esc, '\\' + esc)
if not hasattr(storage, EXPRS_ATTR):
+ transaction.get().join(PurgeDataManager(self))
setattr(storage, EXPRS_ATTR, set([expr]))
else:
getattr(storage, EXPRS_ATTR).add(expr)
@@ -73,6 +77,9 @@
self.failLock.acquire()
self.failedHosts[host] = time()
self.failLock.release()
+ self._clearPurge()
+
+ def _clearPurge(self):
delattr(storage, EXPRS_ATTR)
def _expr2URL(self, expr):
@@ -108,9 +115,36 @@
pass
-def endOfRequest(event):
- utils = component.getAllUtilitiesRegisteredFor(interfaces.IPurge)
- for util in utils:
- util.doPurge()
+class PurgeDataManager(object):
+ """An IDataManager implementation to do purges."""
+ interface.implements(IDataManager)
+ def __init__(self, util):
+ self.util = util
+
+ def _doPurge(self):
+ self.util.doPurge()
+
+ def abort(self, txn):
+ self.util._clearPurge()
+
+ def tpc_begin(self, txn):
+ pass
+
+ def commit(self, txn):
+ pass
+
+ def tpc_vote(self, txn):
+ pass
+
+ def tpc_finish(self, txn):
+ # here we purge
+ self.util.doPurge()
+
+ def tpc_abort(self, txn):
+ self.util._clearPurge()
+
+ def sortKey(self):
+ return "purge_%d" % id(self)
+
More information about the Checkins
mailing list