mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-24 02:25:45 +03:00
Fix bump stamp for non-joined rooms
We should only look for bump stamps in joined rooms, otherwise we should just use the membership stream ordering.
This commit is contained in:
parent
b09bcf16d9
commit
f73c844403
2 changed files with 65 additions and 18 deletions
|
@ -967,27 +967,29 @@ class SlidingSyncHandler:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Figure out the last bump event in the room
|
|
||||||
last_bump_event_result = (
|
|
||||||
await self.store.get_last_event_pos_in_room_before_stream_ordering(
|
|
||||||
room_id,
|
|
||||||
to_token.room_key,
|
|
||||||
event_types=SLIDING_SYNC_DEFAULT_BUMP_EVENT_TYPES,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
# By default, just choose the membership event position
|
# By default, just choose the membership event position
|
||||||
bump_stamp = room_membership_for_user_at_to_token.event_pos.stream
|
bump_stamp = room_membership_for_user_at_to_token.event_pos.stream
|
||||||
# But if we found a bump event, use that instead
|
|
||||||
if last_bump_event_result is not None:
|
|
||||||
_, new_bump_event_pos = last_bump_event_result
|
|
||||||
|
|
||||||
# If we've just joined a remote room, then the last bump event may
|
# Figure out the last bump event in the room if we're in the room.
|
||||||
# have been backfilled (and so have a negative stream ordering).
|
if room_membership_for_user_at_to_token.membership == Membership.JOIN:
|
||||||
# These negative stream orderings can't sensibly be compared, so
|
last_bump_event_result = (
|
||||||
# instead we use the membership event position.
|
await self.store.get_last_event_pos_in_room_before_stream_ordering(
|
||||||
if new_bump_event_pos.stream > 0:
|
room_id,
|
||||||
bump_stamp = new_bump_event_pos.stream
|
to_token.room_key,
|
||||||
|
event_types=SLIDING_SYNC_DEFAULT_BUMP_EVENT_TYPES,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# But if we found a bump event, use that instead
|
||||||
|
if last_bump_event_result is not None:
|
||||||
|
_, new_bump_event_pos = last_bump_event_result
|
||||||
|
|
||||||
|
# If we've just joined a remote room, then the last bump event may
|
||||||
|
# have been backfilled (and so have a negative stream ordering).
|
||||||
|
# These negative stream orderings can't sensibly be compared, so
|
||||||
|
# instead we use the membership event position.
|
||||||
|
if new_bump_event_pos.stream > 0:
|
||||||
|
bump_stamp = new_bump_event_pos.stream
|
||||||
|
|
||||||
unstable_expanded_timeline = False
|
unstable_expanded_timeline = False
|
||||||
prev_room_sync_config = previous_connection_state.room_configs.get(room_id)
|
prev_room_sync_config = previous_connection_state.room_configs.get(room_id)
|
||||||
|
|
|
@ -758,3 +758,48 @@ class SlidingSyncRoomsMetaTestCase(SlidingSyncBase):
|
||||||
response_body, _ = self.do_sync(sync_body, tok=user1_tok)
|
response_body, _ = self.do_sync(sync_body, tok=user1_tok)
|
||||||
|
|
||||||
self.assertGreater(response_body["rooms"][room_id]["bump_stamp"], 0)
|
self.assertGreater(response_body["rooms"][room_id]["bump_stamp"], 0)
|
||||||
|
|
||||||
|
def test_rooms_bump_stamp_invites(self) -> None:
|
||||||
|
"""
|
||||||
|
Test that `bump_stamp` is present and points to the membership event,
|
||||||
|
and not later events, for non-joined rooms
|
||||||
|
"""
|
||||||
|
|
||||||
|
user1_id = self.register_user("user1", "pass")
|
||||||
|
user1_tok = self.login(user1_id, "pass")
|
||||||
|
|
||||||
|
user2_id = self.register_user("user2", "pass")
|
||||||
|
user2_tok = self.login(user2_id, "pass")
|
||||||
|
|
||||||
|
room_id = self.helper.create_room_as(
|
||||||
|
user2_id,
|
||||||
|
tok=user2_tok,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Invite user1 to the room
|
||||||
|
invite_response = self.helper.invite(room_id, user2_id, user1_id, tok=user2_tok)
|
||||||
|
|
||||||
|
# More messages happen after the invite
|
||||||
|
self.helper.send(room_id, "message in room1", tok=user2_tok)
|
||||||
|
|
||||||
|
# We expect the bump_stamp to match the invite.
|
||||||
|
invite_pos = self.get_success(
|
||||||
|
self.store.get_position_for_event(invite_response["event_id"])
|
||||||
|
)
|
||||||
|
|
||||||
|
# Doing an SS request should return a `bump_stamp` of the invite event,
|
||||||
|
# rather than the message that was sent after.
|
||||||
|
sync_body = {
|
||||||
|
"lists": {
|
||||||
|
"foo-list": {
|
||||||
|
"ranges": [[0, 1]],
|
||||||
|
"required_state": [],
|
||||||
|
"timeline_limit": 5,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response_body, _ = self.do_sync(sync_body, tok=user1_tok)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
response_body["rooms"][room_id]["bump_stamp"], invite_pos.stream
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in a new issue