diff --git a/changelog.d/5042.bugfix b/changelog.d/5042.bugfix
new file mode 100644
index 0000000000..736b07c790
--- /dev/null
+++ b/changelog.d/5042.bugfix
@@ -0,0 +1 @@
+Fix bug processing incoming events over federation if call to `/get_missing_events` fails.
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 51d7eb274b..d5a605d3bd 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -498,15 +498,25 @@ class FederationHandler(BaseHandler):
#
# All that said: Let's try increasing the timout to 60s and see what happens.
- missing_events = yield self.federation_client.get_missing_events(
- origin,
- room_id,
- earliest_events_ids=list(latest),
- latest_events=[pdu],
- limit=10,
- min_depth=min_depth,
- timeout=60000,
- )
+ try:
+ missing_events = yield self.federation_client.get_missing_events(
+ origin,
+ room_id,
+ earliest_events_ids=list(latest),
+ latest_events=[pdu],
+ limit=10,
+ min_depth=min_depth,
+ timeout=60000,
+ )
+ except RequestSendFailed as e:
+ # We failed to get the missing events, but since we need to handle
+ # the case of `get_missing_events` not returning the necessary
+ # events anyway, it is safe to simply log the error and continue.
+ logger.warn(
+ "[%s %s]: Failed to get prev_events: %s",
+ room_id, event_id, e,
+ )
+ return
logger.info(
"[%s %s]: Got %d prev_events: %s",
|