element-hq / element-hq/synapse
`get_missing_events` does not respect `min_depth`
- Dominant language
- Python
- Stars
- 4.6k
- Forks
- 600
- Avg merge
- 5d 22h
- Merged PRs (30d)
- 51
Description
### Description
The `on_get_missing_events` handler does not respect the `min_depth` field of the `POST /_matrix/federation/v1/get_missing_events/{roomId}` endpoint:
https://github.com/element-hq/synapse/blob/306d8b23bd405802ef668e99420d37f6f8a2ecec/synapse/federation/transport/server/federation.py#L627-L650
This means that Synapse will return potentially significantly more events than the sender requested, wasting time and potentially resulting in even more roundtrips.
### Steps to reproduce
- call `/get_missing_events` with a `min_depth` that is less than some of the events that would be returned
- synapse returns a bunch of events below min_depth
### Homeserver
N/A
### Synapse Version
N/A
### Installation Method
I don't know
### Database
N/A
### Workers
Multiple workers
### Platform
N/A
### Configuration
N/A
### Relevant log output
```shell
2026-05-30T18:28:29.460190Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Attempting to gap fill missing events elapsed=12.959471226s limit=50 via=servername.example iteration=101 discovered=1648 min_depth=68402
2026-05-30T18:28:29.460346Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk:request:fed{dest="servername.example"}: conduwuit_service::federation::execute: Sending request method=POST url=https://matrix.servername.example:8448/_matrix/federation/v1/get_missing_events/!roomid
2026-05-30T18:28:29.534368Z TRACE transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk:request:fed{dest="servername.example"}: conduwuit_service::federation::execute: Received response from https://matrix.servername.example:8448 status=200 OK method=POST request_url=https://matrix.servername.example:8448/_matrix/federation/v1/get_missing_events/!roomid response_url=https://matrix.servername.example:8448/_matrix/federation/v1/get_missing_events/!roomid
2026-05-30T18:28:29.534395Z TRACE transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk:request:fed{dest="servername.example"}: conduwuit_service::federation::execute: Waiting for response body...
2026-05-30T18:28:29.535236Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk:request:fed{dest="servername.example"}: conduwuit_service::federation::execute: Got 200 for POST https://matrix.servername.example:8448/_matrix/federation/v1/get_missing_events/!roomid
2026-05-30T18:28:29.535282Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Got 20 events back from remote elapsed=13.034563404s
2026-05-30T18:28:29.535471Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.034752457s
2026-05-30T18:28:29.535545Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.034826528s
2026-05-30T18:28:29.535608Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.034888886s
2026-05-30T18:28:29.535702Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.034983079s
2026-05-30T18:28:29.535758Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48625 below min_depth 68402 elapsed=13.035038577s
2026-05-30T18:28:29.535846Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.035126887s
2026-05-30T18:28:29.535890Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48622 below min_depth 68402 elapsed=13.035171184s
2026-05-30T18:28:29.535933Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48590 below min_depth 68402 elapsed=13.035214707s
2026-05-30T18:28:29.535987Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48587 below min_depth 68402 elapsed=13.035268002s
2026-05-30T18:28:29.536095Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035376758s
2026-05-30T18:28:29.536152Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035433022s
2026-05-30T18:28:29.536200Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48633 below min_depth 68402 elapsed=13.035481615s
2026-05-30T18:28:29.536280Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035561297s
2026-05-30T18:28:29.536330Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035611791s
2026-05-30T18:28:29.536376Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035657714s
2026-05-30T18:28:29.536430Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035711498s
2026-05-30T18:28:29.536482Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035763367s
2026-05-30T18:28:29.536565Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035846586s
2026-05-30T18:28:29.536623Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035904578s
2026-05-30T18:28:29.536668Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Received PDU with depth 48629 below min_depth 68402 elapsed=13.035948729s
2026-05-30T18:28:29.536675Z TRACE transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}:get_missing_events_bulk: conduwuit_service::rooms::event_handler::fetch_and_handle_outliers: Finished get_missing_events elapsed=13.035956504s
2026-05-30T18:28:29.536682Z DEBUG transaction{id="txnid" origin="servername.example"}:pdu{room_id=!roomid event_id=$eventid}: conduwuit_service::rooms::event_handler::fetch_prev: Fetched 1659 missing events elapsed=13.037008972s
```
### Anything else that would be useful to know?
Synapse does *request* a `min_depth` too: https://github.com/element-hq/synapse/blob/306d8b23bd405802ef668e99420d37f6f8a2ecec/synapse/federation/transport/client.py#L780-L792
and looks like it expects that field to be respected: https://github.com/element-hq/synapse/blob/306d8b23bd405802ef668e99420d37f6f8a2ecec/synapse/handlers/federation_event.py#L307-L329
and `min_depth` is even mentioned soon after too: https://github.com/element-hq/synapse/blob/306d8b23bd405802ef668e99420d37f6f8a2ecec/synapse/handlers/federation_event.py#L344-L352
Contributor guide
Research direction
Start at on_get_missing_events in synapse/federation/transport/server/federation.py and compare its handling with the min_depth request built in synapse/federation/transport/client.py. Read the min_depth expectations in synapse/handlers/federation_event.py; done means the get_missing_events response no longer includes events below the requested depth and the relevant federation behavior is covered by tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 58/100