Commit 0da4760d authored by Jim Fulton's avatar Jim Fulton

Complain if server invalidations are applied out of order.

parent 2497e651
...@@ -555,13 +555,28 @@ class ClientCache(object): ...@@ -555,13 +555,28 @@ 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 tid the id of the transaction that wrote a new revision of oid, # Paramters:
#
# - oid object id
# - tid the id of the transaction that wrote a new revision of oid,
# or None to forget all cached info about oid. # or None to forget all cached info about oid.
# - 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, tid): def invalidate(self, oid, 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:
......
...@@ -76,8 +76,6 @@ class CacheTests(unittest.TestCase): ...@@ -76,8 +76,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.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)
...@@ -92,10 +90,11 @@ class CacheTests(unittest.TestCase): ...@@ -92,10 +90,11 @@ 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), (data1, n3, n4)) self.assertEqual(self.cache.loadBefore(n1, n4),
(data1, n3, n4))
def testNonCurrent(self): def testNonCurrent(self):
data1 = "data for n1" data1 = "data for n1"
......
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