Skip to content

Commit 8d34579

Browse files
committed
Add a cache on get_rooms_for_local_user_where_membership_is
1 parent 43c865f commit 8d34579

File tree

8 files changed

+20
-10
lines changed

8 files changed

+20
-10
lines changed

synapse/api/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Membership:
5050
KNOCK: Final = "knock"
5151
LEAVE: Final = "leave"
5252
BAN: Final = "ban"
53-
LIST: Final = {INVITE, JOIN, KNOCK, LEAVE, BAN}
53+
LIST: Final = (INVITE, JOIN, KNOCK, LEAVE, BAN)
5454

5555

5656
class PresenceState:

synapse/handlers/initial_sync.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ async def _snapshot_all_rooms(
135135
memberships.append(Membership.LEAVE)
136136

137137
room_list = await self.store.get_rooms_for_local_user_where_membership_is(
138-
user_id=user_id, membership_list=memberships
138+
user_id=user_id, membership_list=tuple(memberships)
139139
)
140140

141141
user = UserID.from_string(user_id)

synapse/handlers/search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ async def _search(
278278
# TODO: Search through left rooms too
279279
rooms = await self.store.get_rooms_for_local_user_where_membership_is(
280280
requester.user.to_string(),
281-
membership_list=[Membership.JOIN],
281+
membership_list=(Membership.JOIN,),
282282
# membership_list=[Membership.JOIN, Membership.LEAVE, Membership.Ban],
283283
)
284284
room_ids = {r.room_id for r in rooms}

synapse/server_notices/server_notices_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ async def maybe_get_notice_room_for_user(self, user_id: str) -> Optional[str]:
114114
return None
115115

116116
rooms = await self._store.get_rooms_for_local_user_where_membership_is(
117-
user_id, [Membership.INVITE, Membership.JOIN]
117+
user_id, (Membership.INVITE, Membership.JOIN)
118118
)
119119
for room in rooms:
120120
# it's worth noting that there is an asymmetry here in that we
@@ -262,7 +262,7 @@ async def maybe_invite_user_to_room(self, user_id: str, room_id: str) -> None:
262262
# Check whether the user has already joined or been invited to this room. If
263263
# that's the case, there is no need to re-invite them.
264264
joined_rooms = await self._store.get_rooms_for_local_user_where_membership_is(
265-
user_id, [Membership.INVITE, Membership.JOIN]
265+
user_id, (Membership.INVITE, Membership.JOIN)
266266
)
267267
for room in joined_rooms:
268268
if room.room_id == room_id:

synapse/storage/_base.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ def _invalidate_state_caches(
120120
"get_user_in_room_with_profile", (room_id, user_id)
121121
)
122122
self._attempt_to_invalidate_cache("get_rooms_for_user", (user_id,))
123+
self._attempt_to_invalidate_cache(
124+
"get_rooms_for_local_user_where_membership_is", (user_id,)
125+
)
123126

124127
# Purge other caches based on room state.
125128
self._attempt_to_invalidate_cache("get_room_summary", (room_id,))
@@ -146,6 +149,9 @@ def _invalidate_state_caches_all(self, room_id: str) -> None:
146149
self._attempt_to_invalidate_cache("does_pair_of_users_share_a_room", None)
147150
self._attempt_to_invalidate_cache("get_user_in_room_with_profile", None)
148151
self._attempt_to_invalidate_cache("get_rooms_for_user", None)
152+
self._attempt_to_invalidate_cache(
153+
"get_rooms_for_local_user_where_membership_is", None
154+
)
149155
self._attempt_to_invalidate_cache("get_room_summary", (room_id,))
150156

151157
def _attempt_to_invalidate_cache(

synapse/storage/databases/main/roommember.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ async def get_invited_rooms_for_local_user(
385385
"""
386386

387387
return await self.get_rooms_for_local_user_where_membership_is(
388-
user_id, [Membership.INVITE]
388+
user_id, (Membership.INVITE,)
389389
)
390390

391391
async def get_knocked_at_rooms_for_local_user(
@@ -401,7 +401,7 @@ async def get_knocked_at_rooms_for_local_user(
401401
"""
402402

403403
return await self.get_rooms_for_local_user_where_membership_is(
404-
user_id, [Membership.KNOCK]
404+
user_id, (Membership.KNOCK,)
405405
)
406406

407407
async def get_invite_for_local_user_in_room(
@@ -422,12 +422,13 @@ async def get_invite_for_local_user_in_room(
422422
return invite
423423
return None
424424

425+
@cached(max_entries=1000, uncached_args=["excluded_rooms"], tree=True)
425426
async def get_rooms_for_local_user_where_membership_is(
426427
self,
427428
user_id: str,
428429
membership_list: Collection[str],
429430
excluded_rooms: StrCollection = (),
430-
) -> List[RoomsForUser]:
431+
) -> Sequence[RoomsForUser]:
431432
"""Get all the rooms for this *local* user where the membership for this user
432433
matches one in the membership list.
433434
@@ -1320,6 +1321,9 @@ def f(txn: LoggingTransaction) -> None:
13201321
self._invalidate_cache_and_stream(
13211322
txn, self.get_forgotten_rooms_for_user, (user_id,)
13221323
)
1324+
self._invalidate_cache_and_stream(
1325+
txn, self.get_rooms_for_local_user_where_membership_is, (user_id,)
1326+
)
13231327

13241328
await self.db_pool.runInteraction("forget_membership", f)
13251329

tests/rest/client/test_account.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ def test_pending_invites(self) -> None:
535535
# Check that the membership of @invitee:test in the room is now "leave".
536536
memberships = self.get_success(
537537
store.get_rooms_for_local_user_where_membership_is(
538-
invitee_id, [Membership.LEAVE]
538+
invitee_id, (Membership.LEAVE,)
539539
)
540540
)
541541
self.assertEqual(len(memberships), 1, memberships)

tests/storage/test_roommember.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def test_one_member(self) -> None:
6868

6969
rooms_for_user = self.get_success(
7070
self.store.get_rooms_for_local_user_where_membership_is(
71-
self.u_alice, [Membership.JOIN]
71+
self.u_alice, (Membership.JOIN,)
7272
)
7373
)
7474

0 commit comments

Comments
 (0)