Commit 40bbc6b5 authored by Jim Fulton's avatar Jim Fulton

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.)
parent ee1a527a
......@@ -435,10 +435,14 @@ class ClientCache(object):
# 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 @@ class ClientCache(object):
@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 @@ class ClientCache(object):
# 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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment