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): ...@@ -437,10 +437,14 @@ class ClientCache(object):
# recent tid. # recent tid.
@locked @locked
def setLastTid(self, tid): def setLastTid(self, tid):
if (not tid) or (tid == z64):
return
if (self.tid is not None) and (tid <= self.tid) and self: 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 " raise ValueError("new last tid (%s) must be greater than "
"previous one (%s)" % (u64(tid), "previous one (%s)"
u64(self.tid))) % (u64(tid), u64(self.tid)))
assert isinstance(tid, str) and len(tid) == 8, tid assert isinstance(tid, str) and len(tid) == 8, tid
self.tid = tid self.tid = tid
self.f.seek(len(magic)) self.f.seek(len(magic))
...@@ -649,20 +653,11 @@ class ClientCache(object): ...@@ -649,20 +653,11 @@ class ClientCache(object):
@locked @locked
def invalidate(self, oid, tid, server_invalidation=True): 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) ofs = self.current.get(oid)
if ofs is None: if ofs is None:
# 0x10 == invalidate (miss) # 0x10 == invalidate (miss)
self._trace(0x10, oid, tid) self._trace(0x10, oid, tid)
return return self.setLastTid(tid)
self.f.seek(ofs) self.f.seek(ofs)
read = self.f.read read = self.f.read
...@@ -685,6 +680,8 @@ class ClientCache(object): ...@@ -685,6 +680,8 @@ class ClientCache(object):
# 0x1C = invalidate (hit, saving non-current) # 0x1C = invalidate (hit, saving non-current)
self._trace(0x1C, oid, tid) self._trace(0x1C, oid, tid)
return self.setLastTid(tid)
## ##
# Generates (oid, serial) oairs for all objects in the # Generates (oid, serial) oairs for all objects in the
# cache. This generator is used by cache verification. # 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