Commit 1d61dc56 authored by Jim Fulton's avatar Jim Fulton

Complain if server invalidations are applied out of order.

parent d649173c
...@@ -607,15 +607,30 @@ class ClientCache(object): ...@@ -607,15 +607,30 @@ class ClientCache(object):
# data for `oid`, stop believing we have current data, and mark the # data for `oid`, stop believing we have current data, and mark the
# data we had as being valid only up to `tid`. In all other cases, do # data we had as being valid only up to `tid`. In all other cases, do
# nothing. # nothing.
# @param oid object id #
# @param version name of version to invalidate. # Paramters:
# @param tid the id of the transaction that wrote a new revision of oid, #
# - oid object id
# - version name of version to invalidate.
# - tid the id of the transaction that wrote a new revision of oid,
# or None to forget all cached info about oid (version, current # or None to forget all cached info about oid (version, current
# revision, and non-current revisions) # revision, and non-current revisions)
# - server_invalidation, a flag indicating whether the
# invalidation has come from the server. It's possible, due
# to threading issues, that when applying a local
# invalidation after a store, that later invalidations from
# the server may already have arrived.
@locked @locked
def invalidate(self, oid, version, tid): def invalidate(self, oid, version, tid, server_invalidation=True):
if tid > self.tid and tid is not None: if tid is not None:
self.setLastTid(tid) 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:
......
...@@ -44,7 +44,6 @@ class CacheTests(unittest.TestCase): ...@@ -44,7 +44,6 @@ class CacheTests(unittest.TestCase):
self.assertEqual(self.cache.getLastTid(), None) self.assertEqual(self.cache.getLastTid(), None)
self.cache.setLastTid(n2) self.cache.setLastTid(n2)
self.assertEqual(self.cache.getLastTid(), n2) self.assertEqual(self.cache.getLastTid(), n2)
self.cache.invalidate(n1, "", n1)
self.assertEqual(self.cache.getLastTid(), n2) self.assertEqual(self.cache.getLastTid(), n2)
self.cache.invalidate(n1, "", n3) self.cache.invalidate(n1, "", n3)
self.assertEqual(self.cache.getLastTid(), n3) self.assertEqual(self.cache.getLastTid(), n3)
...@@ -64,8 +63,8 @@ class CacheTests(unittest.TestCase): ...@@ -64,8 +63,8 @@ class CacheTests(unittest.TestCase):
def testInvalidate(self): def testInvalidate(self):
data1 = "data for n1" data1 = "data for n1"
self.cache.store(n1, "", n3, None, data1) self.cache.store(n1, "", n3, None, data1)
self.cache.invalidate(n1, "", n4)
self.cache.invalidate(n2, "", n2) self.cache.invalidate(n2, "", n2)
self.cache.invalidate(n1, "", n4)
self.assertEqual(self.cache.load(n1, ""), None) self.assertEqual(self.cache.load(n1, ""), None)
self.assertEqual(self.cache.loadBefore(n1, n4), self.assertEqual(self.cache.loadBefore(n1, n4),
(data1, n3, n4)) (data1, n3, n4))
......
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