Commit 2f5d02b3 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. (I can't think of a sane way to test
this scenario.)
parent 52d81dae
......@@ -437,10 +437,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))
......@@ -649,20 +653,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
......@@ -685,6 +680,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