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

Commit

Permalink
Give the correct next event when the message timestamps are the same -
Browse files Browse the repository at this point in the history
…MSC3030 (#13658)

Discovered while working on #13589 and I had all the messages at the same timestamp in the tests.

Part of matrix-org/matrix-spec-proposals#3030

Complement tests: matrix-org/complement#457
  • Loading branch information
MadLittleMods authored Aug 30, 2022
1 parent 20c76ce commit 92c5817
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog.d/13658.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix MSC3030 `/timestamp_to_event` endpoint to return the correct next event when the events have the same timestamp.
12 changes: 10 additions & 2 deletions synapse/storage/databases/main/events_worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -2111,7 +2111,14 @@ async def get_event_id_for_timestamp(
AND room_id = ?
/* Make sure event is not rejected */
AND rejections.event_id IS NULL
ORDER BY origin_server_ts %s
/**
* First sort by the message timestamp. If the message timestamps are the
* same, we want the message that logically comes "next" (before/after
* the given timestamp) based on the DAG and its topological order (`depth`).
* Finally, we can tie-break based on when it was received on the server
* (`stream_ordering`).
*/
ORDER BY origin_server_ts %s, depth %s, stream_ordering %s
LIMIT 1;
"""

Expand All @@ -2130,7 +2137,8 @@ def get_event_id_for_timestamp_txn(txn: LoggingTransaction) -> Optional[str]:
order = "ASC"

txn.execute(
sql_template % (comparison_operator, order), (timestamp, room_id)
sql_template % (comparison_operator, order, order, order),
(timestamp, room_id),
)
row = txn.fetchone()
if row:
Expand Down

0 comments on commit 92c5817

Please sign in to comment.