diff options
author | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-10-29 16:15:48 +0000 |
---|---|---|
committer | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-10-29 16:16:01 +0000 |
commit | b1ee6fd7ed16bb06ba684fa4ef2be3b6dd2da642 (patch) | |
tree | 9cb0904e325de9203d26218d33da969dbef46928 | |
parent | Construct a source-specific 'SourcePaginationConfig' to pass into get_paginat... (diff) | |
download | synapse-b1ee6fd7ed16bb06ba684fa4ef2be3b6dd2da642.tar.xz |
Fix an off-by-one bug in presence event stream pagination; this might be responsible for any number of bug reports
Diffstat (limited to '')
-rw-r--r-- | synapse/handlers/presence.py | 2 | ||||
-rw-r--r-- | tests/handlers/test_presence.py | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index 13b5b4da93..4bbcb52b28 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -838,7 +838,7 @@ class PresenceEventSource(object): updates = [] # TODO(paul): use a DeferredList ? How to limit concurrency. for observed_user in cachemap.keys(): - if not (to_key < cachemap[observed_user].serial < from_key): + if not (to_key < cachemap[observed_user].serial <= from_key): continue if (yield self.is_visible(observer_user, observed_user)): diff --git a/tests/handlers/test_presence.py b/tests/handlers/test_presence.py index 1850deacf5..fdc2e8de4a 100644 --- a/tests/handlers/test_presence.py +++ b/tests/handlers/test_presence.py @@ -29,6 +29,7 @@ from synapse.server import HomeServer from synapse.api.constants import PresenceState from synapse.api.errors import SynapseError from synapse.handlers.presence import PresenceHandler, UserPresenceCache +from synapse.streams.config import SourcePaginationConfig OFFLINE = PresenceState.OFFLINE @@ -676,6 +677,21 @@ class PresencePushTestCase(unittest.TestCase): msg="Presence event should be visible to self-reflection" ) + config = SourcePaginationConfig(from_key=1, to_key=0) + (chunk, _) = yield self.event_source.get_pagination_rows( + self.u_apple, config, None + ) + self.assertEquals(chunk, + [ + {"type": "m.presence", + "content": { + "user_id": "@apple:test", + "presence": ONLINE, + "last_active_ago": 0, + }}, + ] + ) + # Banana sees it because of presence subscription (events, _) = yield self.event_source.get_new_events_for_user( self.u_banana, 0, None |