[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