diff options
author | Richard van der Hoff <1389908+richvdh@users.noreply.github.com> | 2022-07-26 12:47:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-26 11:47:31 +0000 |
commit | ca3db044a3b5a207ff8d65ad7b761427ab215ccc (patch) | |
tree | 82a100ebd57098e5a6cd0f4a471a1c782e580380 /synapse/storage/databases | |
parent | Faster room joins: avoid blocking when pulling events with missing prevs (#13... (diff) | |
download | synapse-ca3db044a3b5a207ff8d65ad7b761427ab215ccc.tar.xz |
Fix infinite loop in partial-state resync (#13353)
Make sure that we only pull out events from the db once they have no prev-events with partial state.
Diffstat (limited to 'synapse/storage/databases')
-rw-r--r-- | synapse/storage/databases/main/events_worker.py | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/synapse/storage/databases/main/events_worker.py b/synapse/storage/databases/main/events_worker.py index 5914a35420..29c99c6357 100644 --- a/synapse/storage/databases/main/events_worker.py +++ b/synapse/storage/databases/main/events_worker.py @@ -2110,11 +2110,29 @@ class EventsWorkerStore(SQLBaseStore): def _get_partial_state_events_batch_txn( txn: LoggingTransaction, room_id: str ) -> List[str]: + # we want to work through the events from oldest to newest, so + # we only want events whose prev_events do *not* have partial state - hence + # the 'NOT EXISTS' clause in the below. + # + # This is necessary because ordering by stream ordering isn't quite enough + # to ensure that we work from oldest to newest event (in particular, + # if an event is initially persisted as an outlier and later de-outliered, + # it can end up with a lower stream_ordering than its prev_events). + # + # Typically this means we'll only return one event per batch, but that's + # hard to do much about. + # + # See also: https://github.com/matrix-org/synapse/issues/13001 txn.execute( """ SELECT event_id FROM partial_state_events AS pse JOIN events USING (event_id) - WHERE pse.room_id = ? + WHERE pse.room_id = ? AND + NOT EXISTS( + SELECT 1 FROM event_edges AS ee + JOIN partial_state_events AS prev_pse ON (prev_pse.event_id=ee.prev_event_id) + WHERE ee.event_id=pse.event_id + ) ORDER BY events.stream_ordering LIMIT 100 """, |