diff --git a/synapse/storage/databases/main/stream.py b/synapse/storage/databases/main/stream.py index 70c3a3cb07..680014bad5 100644 --- a/synapse/storage/databases/main/stream.py +++ b/synapse/storage/databases/main/stream.py @@ -914,11 +914,15 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore): def get_last_event_in_room_before_stream_ordering_txn( txn: LoggingTransaction, ) -> Optional[str]: - # We need to handle the fact that the stream tokens can be vector clocks. We - # do this by getting all rows between the minimum and maximum stream - # ordering in the token, plus one row less than the minimum stream ordering - # (TODO: Why?). We then filter the results against the token and return the - # first row that matches. + # We're looking for the closest event at or before the token. We need to + # handle the fact that the stream token can be a vector clock (with an + # `instance_map`) and events can be persisted on different instances + # (sharded event persisters). The first subquery handles the events that + # would be within the vector clock and gets all rows between the minimum and + # maximum stream ordering in the token which need to be filtered against the + # `instance_map`. The second subquery handles the "before" case and finds a + # row before the token. We then filter out any results past the token's + # vector clock and return the first row that matches. min_stream = end_token.stream max_stream = end_token.get_max_stream_pos()