Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Skip handling of push actions for outlier events (#10780)
Browse files Browse the repository at this point in the history
Outlier events don't ever have push actions associated with them, so we
can skip some expensive queries during event persistence.
  • Loading branch information
erikjohnston authored Sep 8, 2021
1 parent 0288e60 commit 74f01e1
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 4 deletions.
1 change: 1 addition & 0 deletions changelog.d/10780.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Minor speed ups when joining large rooms over federation.
21 changes: 17 additions & 4 deletions synapse/storage/databases/main/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
(
Expand All @@ -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():
Expand All @@ -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):
Expand Down
1 change: 1 addition & 0 deletions tests/storage/test_event_push_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit 74f01e1

Please sign in to comment.