Check the stream position before checking if the cache is empty. (#14639)
An empty cache does not mean the entity has no changed, if it is earlier than the earliest known stream position return that the entity *has* changed since the cache cannot accurately answer that query.
This commit is contained in:
parent
f3ad68c343
commit
da77720752
|
@ -0,0 +1 @@
|
||||||
|
Fix a long-standing bug where the user directory and room/user stats might be out of sync.
|
|
@ -213,16 +213,17 @@ class StreamChangeCache:
|
||||||
"""
|
"""
|
||||||
assert isinstance(stream_pos, int)
|
assert isinstance(stream_pos, int)
|
||||||
|
|
||||||
if not self._cache:
|
|
||||||
# If the cache is empty, nothing can have changed.
|
|
||||||
return False
|
|
||||||
|
|
||||||
# _cache is not valid at or before the earliest known stream position, so
|
# _cache is not valid at or before the earliest known stream position, so
|
||||||
# return that an entity has changed.
|
# return that an entity has changed.
|
||||||
if stream_pos <= self._earliest_known_stream_pos:
|
if stream_pos <= self._earliest_known_stream_pos:
|
||||||
self.metrics.inc_misses()
|
self.metrics.inc_misses()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
# If the cache is empty, nothing can have changed.
|
||||||
|
if not self._cache:
|
||||||
|
self.metrics.inc_misses()
|
||||||
|
return False
|
||||||
|
|
||||||
self.metrics.inc_hits()
|
self.metrics.inc_hits()
|
||||||
return stream_pos < self._cache.peekitem()[0]
|
return stream_pos < self._cache.peekitem()[0]
|
||||||
|
|
||||||
|
|
|
@ -144,9 +144,10 @@ class StreamChangeCacheTests(unittest.HomeserverTestCase):
|
||||||
"""
|
"""
|
||||||
cache = StreamChangeCache("#test", 1)
|
cache = StreamChangeCache("#test", 1)
|
||||||
|
|
||||||
# With no entities, it returns False for the past, present, and future.
|
# With no entities, it returns True for the past, present, and False for
|
||||||
self.assertFalse(cache.has_any_entity_changed(0))
|
# the future.
|
||||||
self.assertFalse(cache.has_any_entity_changed(1))
|
self.assertTrue(cache.has_any_entity_changed(0))
|
||||||
|
self.assertTrue(cache.has_any_entity_changed(1))
|
||||||
self.assertFalse(cache.has_any_entity_changed(2))
|
self.assertFalse(cache.has_any_entity_changed(2))
|
||||||
|
|
||||||
# We add an entity
|
# We add an entity
|
||||||
|
|
Loading…
Reference in New Issue