Commit 9070f8e2 authored by Jim Fulton's avatar Jim Fulton

Complain if server invalidations are applied out of order.

parent 2b62301d
......@@ -555,13 +555,28 @@ class ClientCache(object):
# 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
# 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.
# - 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
def invalidate(self, oid, tid):
if tid > self.tid and tid is not None:
self.setLastTid(tid)
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:
......
......@@ -76,8 +76,6 @@ class CacheTests(unittest.TestCase):
self.assertEqual(self.cache.getLastTid(), None)
self.cache.setLastTid(n2)
self.assertEqual(self.cache.getLastTid(), n2)
self.cache.invalidate(n1, n1)
self.cache.invalidate(n1, n1)
self.assertEqual(self.cache.getLastTid(), n2)
self.cache.invalidate(n1, n3)
self.assertEqual(self.cache.getLastTid(), n3)
......@@ -92,10 +90,11 @@ class CacheTests(unittest.TestCase):
def testInvalidate(self):
data1 = "data for n1"
self.cache.store(n1, n3, None, data1)
self.cache.invalidate(n1, n4)
self.cache.invalidate(n2, n2)
self.cache.invalidate(n1, n4)
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):
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