[Checkins] SVN: ZODB/branches/3.8/src/ZEO/cache.py Don't update the cache lastTid until we've invalidated a value (rather

Jim Fulton jim at zope.com
Mon Sep 20 16:50:33 EDT 2010


Log message for revision 116689:
  Don't update the cache lastTid until we've invalidated a value (rather
  than before).  It's possible that process shutdown after updating
  lastTid but before invalidating the current record could explain some
  problems we've seen on restarts.
  
  (This change is made irrelevent by later changes.)
  

Changed:
  U   ZODB/branches/3.8/src/ZEO/cache.py

-=-
Modified: ZODB/branches/3.8/src/ZEO/cache.py
===================================================================
--- ZODB/branches/3.8/src/ZEO/cache.py	2010-09-20 20:41:19 UTC (rev 116688)
+++ ZODB/branches/3.8/src/ZEO/cache.py	2010-09-20 20:50:32 UTC (rev 116689)
@@ -379,10 +379,14 @@
     # recent tid.
     @locked
     def setLastTid(self, tid):
-        if self.tid is not None and tid <= self.tid:
+        if (not tid) or (tid == z64):
+            return
+        if (self.tid is not None) and (tid <= self.tid):
+            if tid == self.tid:
+                return                  # Be a little forgiving
             raise ValueError("new last tid (%s) must be greater than "
-                             "previous one (%s)" % (u64(tid),
-                                                    u64(self.tid)))
+                             "previous one (%s)"
+                             % (u64(tid), u64(self.tid)))
         assert isinstance(tid, str) and len(tid) == 8, tid
         self.tid = tid
         self.f.seek(len(magic))
@@ -631,20 +635,11 @@
 
     @locked
     def invalidate(self, oid, version, tid, server_invalidation=True):
-        if tid is not None:
-            if tid > self.tid:
-                self.setLastTid(tid)
-            elif tid < self.tid:
-                if server_invalidation:
-                    raise ValueError("invalidation tid (%s) must not be less"
-                                     " than previous one (%s)" %
-                                     (u64(tid), u64(self.tid)))
-
         ofs = self.current.get(oid)
         if ofs is None:
             # 0x10 == invalidate (miss)
             self._trace(0x10, oid, version, tid)
-            return
+            return self.setLastTid(tid)
 
         self.f.seek(ofs)
         read = self.f.read
@@ -672,6 +667,8 @@
             # 0x1C = invalidate (hit, saving non-current)
             self._trace(0x1C, oid, version, tid)
 
+        return self.setLastTid(tid)
+
     ##
     # Generates (oid, serial, version) triples for all objects in the
     # cache.  This generator is used by cache verification.



More information about the checkins mailing list