[Zodb-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 Zodb-checkins
mailing list