Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Fix forgotten rooms missing in initial sync (#15815)
Browse files Browse the repository at this point in the history
If you leave a room and forget it, then rejoin it, the room would be
missing from the next initial sync.

fixes #13262

Signed-off-by: Nicolas Werner <[email protected]>
  • Loading branch information
nico-famedly authored Jun 21, 2023
1 parent 289ce3b commit e0c39d6
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelog.d/15815.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix forgotten rooms missing from initial sync after rejoining them. Contributed by Nico from Famedly.
13 changes: 13 additions & 0 deletions synapse/storage/databases/main/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,17 @@ def _invalidate_caches_for_event(
)
self._attempt_to_invalidate_cache("get_rooms_for_user", (state_key,))

self._attempt_to_invalidate_cache(
"did_forget",
(
state_key,
room_id,
),
)
self._attempt_to_invalidate_cache(
"get_forgotten_rooms_for_user", (state_key,)
)

if relates_to:
self._attempt_to_invalidate_cache("get_relations_for_event", (relates_to,))
self._attempt_to_invalidate_cache("get_references_for_event", (relates_to,))
Expand Down Expand Up @@ -336,6 +347,8 @@ def _invalidate_caches_for_room_events(self, room_id: str) -> None:
"get_rooms_for_user_with_stream_ordering", None
)
self._attempt_to_invalidate_cache("get_rooms_for_user", None)
self._attempt_to_invalidate_cache("did_forget", None)
self._attempt_to_invalidate_cache("get_forgotten_rooms_for_user", None)
self._attempt_to_invalidate_cache("get_references_for_event", None)
self._attempt_to_invalidate_cache("get_thread_summary", None)
self._attempt_to_invalidate_cache("get_thread_participated", None)
Expand Down
21 changes: 21 additions & 0 deletions tests/handlers/test_room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,27 @@ def test_leave_and_forget(self) -> None:
self.get_success(self.store.is_locally_forgotten_room(self.room_id))
)

def test_leave_and_unforget(self) -> None:
"""Tests if rejoining a room unforgets the room, so that it shows up in sync again."""
self.helper.join(self.room_id, user=self.bob, tok=self.bob_token)

# alice is not the last room member that leaves and forgets the room
self.helper.leave(self.room_id, user=self.alice, tok=self.alice_token)
self.get_success(self.handler.forget(self.alice_ID, self.room_id))
self.assertTrue(
self.get_success(self.store.did_forget(self.alice, self.room_id))
)

self.helper.join(self.room_id, user=self.alice, tok=self.alice_token)
self.assertFalse(
self.get_success(self.store.did_forget(self.alice, self.room_id))
)

# the server has not forgotten the room
self.assertFalse(
self.get_success(self.store.is_locally_forgotten_room(self.room_id))
)

@override_config({"forget_rooms_on_leave": True})
def test_leave_and_auto_forget(self) -> None:
"""Tests the `forget_rooms_on_leave` config option."""
Expand Down

0 comments on commit e0c39d6

Please sign in to comment.