Skip to content
Snippets Groups Projects
Unverified Commit f9bc5428 authored by Nick Mills-Barrett's avatar Nick Mills-Barrett Committed by GitHub
Browse files

Batch up calls to `get_rooms_for_users` (#14109)

parent 09be8ab5
No related branches found
No related tags found
No related merge requests found
Break up calls to fetch rooms for many users. Contributed by Nick @ Beeper (@fizzadar).
......@@ -666,7 +666,7 @@ class RoomMemberWorkerStore(EventsWorkerStore):
cached_method_name="get_rooms_for_user",
list_name="user_ids",
)
async def get_rooms_for_users(
async def _get_rooms_for_users(
self, user_ids: Collection[str]
) -> Dict[str, FrozenSet[str]]:
"""A batched version of `get_rooms_for_user`.
......@@ -697,6 +697,21 @@ class RoomMemberWorkerStore(EventsWorkerStore):
return {key: frozenset(rooms) for key, rooms in user_rooms.items()}
async def get_rooms_for_users(
self, user_ids: Collection[str]
) -> Dict[str, FrozenSet[str]]:
"""A batched wrapper around `_get_rooms_for_users`, to prevent locking
other calls to `get_rooms_for_user` for large user lists.
"""
all_user_rooms: Dict[str, FrozenSet[str]] = {}
# 250 users is pretty arbitrary but the data can be quite large if users
# are in many rooms.
for user_ids in batch_iter(user_ids, 250):
all_user_rooms.update(await self._get_rooms_for_users(user_ids))
return all_user_rooms
@cached(max_entries=10000)
async def does_pair_of_users_share_a_room(
self, user_id: str, other_user_id: str
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment