1 files changed, 18 insertions, 4 deletions
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index e4a5b64d10..a5f4ce7c8a 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -766,10 +766,24 @@ class FederationEventHandler:
"""
logger.info("Processing pulled event %s", event)
- # these should not be outliers.
- assert (
- not event.internal_metadata.is_outlier()
- ), "pulled event unexpectedly flagged as outlier"
+ # This function should not be used to persist outliers (use something
+ # else) because this does a bunch of operations that aren't necessary
+ # (extra work; in particular, it makes sure we have all the prev_events
+ # and resolves the state across those prev events). If you happen to run
+ # into a situation where the event you're trying to process/backfill is
+ # marked as an `outlier`, then you should update that spot to return an
+ # `EventBase` copy that doesn't have `outlier` flag set.
+ #
+ # `EventBase` is used to represent both an event we have not yet
+ # persisted, and one that we have persisted and now keep in the cache.
+ # In an ideal world this method would only be called with the first type
+ # of event, but it turns out that's not actually the case and for
+ # example, you could get an event from cache that is marked as an
+ # `outlier` (fix up that spot though).
+ assert not event.internal_metadata.is_outlier(), (
+ "Outlier event passed to _process_pulled_event. "
+ "To persist an event as a non-outlier, make sure to pass in a copy without `event.internal_metadata.outlier = true`."
+ )
event_id = event.event_id
|