[Zodb-checkins] SVN: ZODB/branches/3.9/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 13:53:49 EDT 2010


Log message for revision 116673:
  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.9/src/ZEO/cache.py

-=-
Modified: ZODB/branches/3.9/src/ZEO/cache.py
===================================================================
--- ZODB/branches/3.9/src/ZEO/cache.py	2010-09-20 17:34:09 UTC (rev 116672)
+++ ZODB/branches/3.9/src/ZEO/cache.py	2010-09-20 17:53:49 UTC (rev 116673)
@@ -435,10 +435,14 @@
     # recent tid.
     @locked
     def setLastTid(self, tid):
+        if (not tid) or (tid == z64):
+            return
         if (self.tid is not None) and (tid <= self.tid) and self:
+            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))
@@ -647,20 +651,11 @@
 
     @locked
     def invalidate(self, oid, 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, tid)
-            return
+            return self.setLastTid(tid)
 
         self.f.seek(ofs)
         read = self.f.read
@@ -683,6 +678,8 @@
             # 0x1C = invalidate (hit, saving non-current)
             self._trace(0x1C, oid, tid)
 
+        return self.setLastTid(tid)
+
     ##
     # Generates (oid, serial) oairs for all objects in the
     # cache.  This generator is used by cache verification.



More information about the Zodb-checkins mailing list