From ee2e0b9e1da1d8b0d58a2d062d8d3f24eee5d2a2 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 4 Apr 2023 09:21:57 +0100 Subject: [PATCH 1/5] Speed up membership queries for users with forgotten rooms --- synapse/storage/databases/main/roommember.py | 6 ++++++ .../delta/74/03_room_membership_index.sql | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 synapse/storage/schema/main/delta/74/03_room_membership_index.sql diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 694a5b802c7c..84145f5ba772 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -1391,6 +1391,12 @@ def __init__( columns=["user_id", "room_id"], where_clause="forgotten = 1", ) + self.db_pool.updates.register_background_index_update( + "room_membership_user_room_index", + index_name="room_membership_user_room_idx", + table="room_memberships", + columns=["user_id", "room_id"], + ) async def _background_add_membership_profile( self, progress: JsonDict, batch_size: int diff --git a/synapse/storage/schema/main/delta/74/03_room_membership_index.sql b/synapse/storage/schema/main/delta/74/03_room_membership_index.sql new file mode 100644 index 000000000000..81a7d9ff9cad --- /dev/null +++ b/synapse/storage/schema/main/delta/74/03_room_membership_index.sql @@ -0,0 +1,19 @@ +/* Copyright 2023 The Matrix.org Foundation C.I.C + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +-- Add an index to `room_membership(user_id, room_id)` to make querying for +-- forgotten rooms faster. +INSERT INTO background_updates (ordering, update_name, progress_json) VALUES + (7403, 'room_membership_user_room_index', '{}'); From 813d935e01f47a3d9f5ffd2d6302ac0fea69bd0e Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 4 Apr 2023 09:25:43 +0100 Subject: [PATCH 2/5] Skip forgotten check for joined/invited rooms --- synapse/storage/databases/main/roommember.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 84145f5ba772..959151c8ce27 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -419,7 +419,11 @@ async def get_rooms_for_local_user_where_membership_is( ) # Now we filter out forgotten and excluded rooms - rooms_to_exclude = await self.get_forgotten_rooms_for_user(user_id) + rooms_to_exclude = set() + + # Users can't forget joined/invited rooms, so we skip the check for such look ups. + if not all(m in (Membership.JOIN, Membership.INVITE) for m in membership_list): + rooms_to_exclude = await self.get_forgotten_rooms_for_user(user_id) if excluded_rooms is not None: # Take a copy to avoid mutating the in-cache set From 95af0601cf31b1b95ab32a983f26e47987273cad Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 4 Apr 2023 09:28:43 +0100 Subject: [PATCH 3/5] Newsfile --- changelog.d/15385.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/15385.misc diff --git a/changelog.d/15385.misc b/changelog.d/15385.misc new file mode 100644 index 000000000000..76350c398d6f --- /dev/null +++ b/changelog.d/15385.misc @@ -0,0 +1 @@ +Speed up membership queries for users with forgotten rooms. From c069eb2b8c90cb11d3a2a03d252872d16cf47d52 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 4 Apr 2023 09:33:16 +0100 Subject: [PATCH 4/5] Type hints --- synapse/storage/databases/main/roommember.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 959151c8ce27..26cfebd01c1d 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -419,7 +419,7 @@ async def get_rooms_for_local_user_where_membership_is( ) # Now we filter out forgotten and excluded rooms - rooms_to_exclude = set() + rooms_to_exclude: AbstractSet[str] = set() # Users can't forget joined/invited rooms, so we skip the check for such look ups. if not all(m in (Membership.JOIN, Membership.INVITE) for m in membership_list): From e7bca7d00294014ea0eb973132b1ce0b87ca7299 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 4 Apr 2023 11:34:39 +0100 Subject: [PATCH 5/5] Update synapse/storage/databases/main/roommember.py Co-authored-by: Sean Quah <8349537+squahtx@users.noreply.github.com> --- synapse/storage/databases/main/roommember.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/synapse/storage/databases/main/roommember.py b/synapse/storage/databases/main/roommember.py index 26cfebd01c1d..daad58291a8b 100644 --- a/synapse/storage/databases/main/roommember.py +++ b/synapse/storage/databases/main/roommember.py @@ -422,7 +422,7 @@ async def get_rooms_for_local_user_where_membership_is( rooms_to_exclude: AbstractSet[str] = set() # Users can't forget joined/invited rooms, so we skip the check for such look ups. - if not all(m in (Membership.JOIN, Membership.INVITE) for m in membership_list): + if any(m not in (Membership.JOIN, Membership.INVITE) for m in membership_list): rooms_to_exclude = await self.get_forgotten_rooms_for_user(user_id) if excluded_rooms is not None: