[Zodb-checkins] SVN: ZODB/trunk/src/ZEO/cache.py Don't update the cache lastTid until we've invalidated a value (rather
Jim Fulton
jim at zope.com
Sun Jul 11 11:17:00 EDT 2010
Log message for revision 114602:
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. (I can't think of a sane way to test
this scenario.)
Changed:
U ZODB/trunk/src/ZEO/cache.py
-=-
Modified: ZODB/trunk/src/ZEO/cache.py
===================================================================
--- ZODB/trunk/src/ZEO/cache.py 2010-07-11 14:37:59 UTC (rev 114601)
+++ ZODB/trunk/src/ZEO/cache.py 2010-07-11 15:17:00 UTC (rev 114602)
@@ -437,10 +437,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))
@@ -649,20 +653,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
@@ -685,6 +680,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