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

Commit e0c39d6

Browse files
authored
Fix forgotten rooms missing in initial sync (#15815)
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 <n.werner@famedly.com>
1 parent 289ce3b commit e0c39d6

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

changelog.d/15815.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix forgotten rooms missing from initial sync after rejoining them. Contributed by Nico from Famedly.

synapse/storage/databases/main/cache.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,17 @@ def _invalidate_caches_for_event(
289289
)
290290
self._attempt_to_invalidate_cache("get_rooms_for_user", (state_key,))
291291

292+
self._attempt_to_invalidate_cache(
293+
"did_forget",
294+
(
295+
state_key,
296+
room_id,
297+
),
298+
)
299+
self._attempt_to_invalidate_cache(
300+
"get_forgotten_rooms_for_user", (state_key,)
301+
)
302+
292303
if relates_to:
293304
self._attempt_to_invalidate_cache("get_relations_for_event", (relates_to,))
294305
self._attempt_to_invalidate_cache("get_references_for_event", (relates_to,))
@@ -336,6 +347,8 @@ def _invalidate_caches_for_room_events(self, room_id: str) -> None:
336347
"get_rooms_for_user_with_stream_ordering", None
337348
)
338349
self._attempt_to_invalidate_cache("get_rooms_for_user", None)
350+
self._attempt_to_invalidate_cache("did_forget", None)
351+
self._attempt_to_invalidate_cache("get_forgotten_rooms_for_user", None)
339352
self._attempt_to_invalidate_cache("get_references_for_event", None)
340353
self._attempt_to_invalidate_cache("get_thread_summary", None)
341354
self._attempt_to_invalidate_cache("get_thread_participated", None)

tests/handlers/test_room_member.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,27 @@ def test_leave_and_forget(self) -> None:
333333
self.get_success(self.store.is_locally_forgotten_room(self.room_id))
334334
)
335335

336+
def test_leave_and_unforget(self) -> None:
337+
"""Tests if rejoining a room unforgets the room, so that it shows up in sync again."""
338+
self.helper.join(self.room_id, user=self.bob, tok=self.bob_token)
339+
340+
# alice is not the last room member that leaves and forgets the room
341+
self.helper.leave(self.room_id, user=self.alice, tok=self.alice_token)
342+
self.get_success(self.handler.forget(self.alice_ID, self.room_id))
343+
self.assertTrue(
344+
self.get_success(self.store.did_forget(self.alice, self.room_id))
345+
)
346+
347+
self.helper.join(self.room_id, user=self.alice, tok=self.alice_token)
348+
self.assertFalse(
349+
self.get_success(self.store.did_forget(self.alice, self.room_id))
350+
)
351+
352+
# the server has not forgotten the room
353+
self.assertFalse(
354+
self.get_success(self.store.is_locally_forgotten_room(self.room_id))
355+
)
356+
336357
@override_config({"forget_rooms_on_leave": True})
337358
def test_leave_and_auto_forget(self) -> None:
338359
"""Tests the `forget_rooms_on_leave` config option."""

0 commit comments

Comments
 (0)