diff options
author | Nick Mills-Barrett <nick@beeper.com> | 2022-10-12 11:36:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-12 11:36:22 +0100 |
commit | f9bc5428c46e73ca471b6976865d5ba4168f938d (patch) | |
tree | a59a663d3ebda4ec07d84349480c3a2956345f6c | |
parent | Remove the experimental implementation of MSC3772. (#14094) (diff) | |
download | synapse-f9bc5428c46e73ca471b6976865d5ba4168f938d.tar.xz |
Batch up calls to `get_rooms_for_users` (#14109)
-rw-r--r-- | changelog.d/14109.misc | 1 | ||||
-rw-r--r-- | synapse/storage/databases/main/roommember.py | 17 |
2 files changed, 17 insertions, 1 deletions
diff --git a/changelog.d/14109.misc b/changelog.d/14109.misc new file mode 100644 index 0000000000..7987c2050f --- /dev/null +++ b/changelog.d/14109.misc @@ -0,0 +1 @@ +Break up calls to fetch rooms for many users. Contributed by Nick @ Beeper (@fizzadar). diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 2337289d88..2ed6ad754f 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -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 |