Skip to content

Commit

Permalink
/sync: Fix edge-case in calculating the "device_lists" response
Browse files Browse the repository at this point in the history
Fixes #16948. If the `join` and the
`leave` are in the same sync response, we need to count them as a "left" user.
  • Loading branch information
richvdh committed Feb 21, 2024
1 parent bc1db16 commit 9dfbd75
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog.d/16949.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix various long-standing bugs which could cause incorrect state to be returned from `/sync` in certain situations.
11 changes: 9 additions & 2 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -2746,7 +2746,7 @@ def calculate_user_changes(self) -> Tuple[AbstractSet[str], AbstractSet[str]]:
if self.since_token:
for joined_sync in self.joined:
it = itertools.chain(
joined_sync.timeline.events, joined_sync.state.values()
joined_sync.state.values(), joined_sync.timeline.events
)
for event in it:
if event.type == EventTypes.Member:
Expand All @@ -2758,13 +2758,20 @@ def calculate_user_changes(self) -> Tuple[AbstractSet[str], AbstractSet[str]]:
newly_joined_or_invited_or_knocked_users.add(
event.state_key
)
# If the user left and rejoined in the same batch, they
# count as a newly-joined user, *not* a newly-left user.
newly_left_users.discard(event.state_key)
else:
prev_content = event.unsigned.get("prev_content", {})
prev_membership = prev_content.get("membership", None)
if prev_membership == Membership.JOIN:
newly_left_users.add(event.state_key)
# If the user joined and left in the same batch, they
# count as a newly-left user, not a newly-joined user.
newly_joined_or_invited_or_knocked_users.discard(
event.state_key
)

newly_left_users -= newly_joined_or_invited_or_knocked_users
return newly_joined_or_invited_or_knocked_users, newly_left_users


Expand Down

0 comments on commit 9dfbd75

Please sign in to comment.