[Zodb-checkins] SVN: ZODB/trunk/src/ Fixed a bug in processing invalidations. Cache last tid shouldn't be set until all of the invalidations have been processed. For this reason, we no longer set the last tid in the cache invalidate method

Jim Fulton jim at zope.com
Wed Sep 8 13:26:55 EDT 2010


Log message for revision 116233:
  Fixed a bug in processing invalidations. Cache last tid shouldn't be set until all of the invalidations have been processed. For this reason, we no longer set the last tid in the cache invalidate method

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZEO/ClientStorage.py
  U   ZODB/trunk/src/ZEO/cache.py
  U   ZODB/trunk/src/ZEO/tests/test_cache.py

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-09-08 17:23:15 UTC (rev 116232)
+++ ZODB/trunk/src/CHANGES.txt	2010-09-08 17:26:55 UTC (rev 116233)
@@ -8,6 +8,9 @@
 Bugs fixed
 ----------
 
+- Process exits or database closes could cause ZEO caches to have
+  incorrect data due to a problem in the way invalidations were processed.
+
 - Database connections didn't invalidate cache entries when conflict
   errors were raised in response to checkCurrentSerialInTransaction
   errors. Normally, this shouldn't be a problem, since there should be

Modified: ZODB/trunk/src/ZEO/ClientStorage.py
===================================================================
--- ZODB/trunk/src/ZEO/ClientStorage.py	2010-09-08 17:23:15 UTC (rev 116232)
+++ ZODB/trunk/src/ZEO/ClientStorage.py	2010-09-08 17:26:55 UTC (rev 116233)
@@ -1213,7 +1213,7 @@
             return
 
         for oid, _ in self._seriald.iteritems():
-            self._cache.invalidate(oid, tid, False)
+            self._cache.invalidate(oid, tid)
 
         for oid, data in self._tbuf:
             # If data is None, we just invalidate.
@@ -1224,7 +1224,7 @@
                     self._cache.store(oid, s, None, data)
             else:
                 # object deletion
-                self._cache.invalidate(oid, tid, False)
+                self._cache.invalidate(oid, tid)
 
         if self.fshelper is not None:
             blobs = self._tbuf.blobs
@@ -1479,6 +1479,7 @@
             if oid == self._load_oid:
                 self._load_status = 0
             self._cache.invalidate(oid, tid)
+        self._cache.setLastTid(tid)
 
         if self._db is not None:
             self._db.invalidate(tid, oids)

Modified: ZODB/trunk/src/ZEO/cache.py
===================================================================
--- ZODB/trunk/src/ZEO/cache.py	2010-09-08 17:23:15 UTC (rev 116232)
+++ ZODB/trunk/src/ZEO/cache.py	2010-09-08 17:26:55 UTC (rev 116233)
@@ -664,20 +664,13 @@
     # - oid object id
     # - tid the id of the transaction that wrote a new revision of oid,
     #        or None to forget all cached info about oid.
-    # - server_invalidation, a flag indicating whether the
-    #       invalidation has come from the server. It's possible, due
-    #       to threading issues, that when applying a local
-    #       invalidation after a store, that later invalidations from
-    #       the server may already have arrived.
 
     @locked
-    def invalidate(self, oid, tid, server_invalidation=True):
+    def invalidate(self, oid, tid):
         ofs = self.current.get(oid)
         if ofs is None:
             # 0x10 == invalidate (miss)
             self._trace(0x10, oid, tid)
-            if server_invalidation:
-                self.setLastTid(tid)
             return
 
         self.f.seek(ofs)
@@ -704,9 +697,6 @@
             # 0x1C = invalidate (hit, saving non-current)
             self._trace(0x1C, oid, tid)
 
-        if server_invalidation:
-            self.setLastTid(tid)
-
     ##
     # Generates (oid, serial) oairs for all objects in the
     # cache.  This generator is used by cache verification.

Modified: ZODB/trunk/src/ZEO/tests/test_cache.py
===================================================================
--- ZODB/trunk/src/ZEO/tests/test_cache.py	2010-09-08 17:23:15 UTC (rev 116232)
+++ ZODB/trunk/src/ZEO/tests/test_cache.py	2010-09-08 17:26:55 UTC (rev 116233)
@@ -83,9 +83,11 @@
         self.cache.setLastTid(n2)
         self.assertEqual(self.cache.getLastTid(), n2)
         self.assertEqual(self.cache.getLastTid(), n2)
-        self.cache.invalidate(n1, n3)
+        self.cache.setLastTid(n3)
         self.assertEqual(self.cache.getLastTid(), n3)
 
+        # Check that setting tids out of order gives an error:
+
         # the cache complains only when it's non-empty
         self.cache.store(n1, n3, None, 'x')
         self.assertRaises(ValueError, self.cache.setLastTid, n2)



More information about the Zodb-checkins mailing list