From a7619fa8ee0cceb1b6fe73614124c6d79d05ad90 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 8 Sep 2021 13:40:30 +0100 Subject: [PATCH 1/3] Skip handling of push actions for outlier events Outlier events don't ever have push actions associated with them, so we can skip some expensive queries during event persistence. --- synapse/storage/databases/main/events.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py index f07e288056b8..14ada8a8b359 100644 --- a/synapse/storage/databases/main/events.py +++ b/synapse/storage/databases/main/events.py @@ -1990,6 +1990,15 @@ def _set_push_actions_for_event_and_users_txn( events_and_context. """ + # Only non outlier events will have push actions associated with them, + # so let's filter them out. (This makes joining large rooms faster, as + # these queries took seconds to process all the state events). + non_outlier_events = [ + event + for event, _ in events_and_contexts + if not event.internal_metadata.is_outlier() + ] + sql = """ INSERT INTO event_push_actions ( room_id, event_id, user_id, actions, stream_ordering, @@ -2000,7 +2009,7 @@ def _set_push_actions_for_event_and_users_txn( WHERE event_id = ? """ - if events_and_contexts: + if non_outlier_events: txn.execute_batch( sql, ( @@ -2010,12 +2019,12 @@ def _set_push_actions_for_event_and_users_txn( event.depth, event.event_id, ) - for event, _ in events_and_contexts + for event in non_outlier_events ), ) room_to_event_ids: Dict[str, List[str]] = {} - for e, _ in events_and_contexts: + for e in non_outlier_events: room_to_event_ids.setdefault(e.room_id, []).append(e.event_id) for room_id, event_ids in room_to_event_ids.items(): @@ -2040,7 +2049,11 @@ def _set_push_actions_for_event_and_users_txn( # persisted. txn.execute_batch( "DELETE FROM event_push_actions_staging WHERE event_id = ?", - ((event.event_id,) for event, _ in all_events_and_contexts), + ( + (event.event_id,) + for event, _ in all_events_and_contexts + if not event.internal_metadata.is_outlier() + ), ) def _remove_push_actions_for_event_id_txn(self, txn, room_id, event_id): From e67d3b8e32f584bcdc83ccffd0e2835a7f1bdc19 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 8 Sep 2021 13:43:34 +0100 Subject: [PATCH 2/3] Newsfile --- changelog.d/10780.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/10780.misc diff --git a/changelog.d/10780.misc b/changelog.d/10780.misc new file mode 100644 index 000000000000..3b7acff03f4f --- /dev/null +++ b/changelog.d/10780.misc @@ -0,0 +1 @@ +Minor speed ups when joining large rooms over federation. From 121d43b435870d583d78827d16c5c461faf1328f Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 8 Sep 2021 14:31:53 +0100 Subject: [PATCH 3/3] Fix test --- tests/storage/test_event_push_actions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/storage/test_event_push_actions.py b/tests/storage/test_event_push_actions.py index 1930b37eda1e..bb5939ba4a51 100644 --- a/tests/storage/test_event_push_actions.py +++ b/tests/storage/test_event_push_actions.py @@ -69,6 +69,7 @@ def _inject_actions(stream, action): event.room_id = room_id event.event_id = "$test:example.com" event.internal_metadata.stream_ordering = stream + event.internal_metadata.is_outlier.return_value = False event.depth = stream self.get_success(