diff --git a/changelog.d/12314.misc b/changelog.d/12314.misc
new file mode 100644
index 0000000000..9f333e718a
--- /dev/null
+++ b/changelog.d/12314.misc
@@ -0,0 +1 @@
+Avoid trying to calculate the state at outlier events.
diff --git a/synapse/storage/databases/main/event_federation.py b/synapse/storage/databases/main/event_federation.py
index 277e6422eb..634e19e035 100644
--- a/synapse/storage/databases/main/event_federation.py
+++ b/synapse/storage/databases/main/event_federation.py
@@ -1073,9 +1073,15 @@ class EventFederationWorkerStore(SignatureWorkerStore, EventsWorkerStore, SQLBas
/* Get the depth and stream_ordering of the prev_event_id from the events table */
INNER JOIN events
ON prev_event_id = events.event_id
+
+ /* exclude outliers from the results (we don't have the state, so cannot
+ * verify if the requesting server can see them).
+ */
+ WHERE NOT events.outlier
+
/* Look for an edge which matches the given event_id */
- WHERE event_edges.event_id = ?
- AND event_edges.is_state = ?
+ AND event_edges.event_id = ? AND NOT event_edges.is_state
+
/* Because we can have many events at the same depth,
* we want to also tie-break and sort on stream_ordering */
ORDER BY depth DESC, stream_ordering DESC
@@ -1084,7 +1090,7 @@ class EventFederationWorkerStore(SignatureWorkerStore, EventsWorkerStore, SQLBas
txn.execute(
connected_prev_event_query,
- (event_id, False, limit),
+ (event_id, limit),
)
return [
BackfillQueueNavigationItem(
|