summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2018-07-25 09:35:02 +0100
committerErik Johnston <erik@matrix.org>2018-07-25 09:35:02 +0100
commitec56121b0d099824a1455260e05904f081b6d14a (patch)
tree2190b4f5d5e1766d058623aa1347c466f5e1b9a3 /synapse
parentMerge pull request #3597 from matrix-org/erikj/did_forget (diff)
downloadsynapse-ec56121b0d099824a1455260e05904f081b6d14a.tar.xz
Correctly handle outliers during persist events
We incorrectly asserted that all contexts must have a non None state
group without consider outliers. This would usually be fine as the
assertion would never be hit, as there is a shortcut during persistence
if the forward extremities don't change.

However, if the outlier is being persisted with non-outlier events, the
function would be called and the assertion would be hit.

Fixes #3601
Diffstat (limited to 'synapse')
-rw-r--r--synapse/storage/events.py13
1 files changed, 7 insertions, 6 deletions
diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 906a405031..bd05f23b06 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -575,11 +575,12 @@ class EventsStore(EventsWorkerStore):
 
         for ev, ctx in events_context:
             if ctx.state_group is None:
-                # I don't think this can happen, but let's double-check
-                raise Exception(
-                    "Context for new extremity event %s has no state "
-                    "group" % (ev.event_id, ),
-                )
+                # This should only happen for outlier events.
+                if not event.internal_metadata.is_outlier():
+                    raise Exception(
+                        "Context for new event %s has no state "
+                        "group" % (ev.event_id, ),
+                    )
 
             if ctx.state_group in state_groups_map:
                 continue
@@ -607,7 +608,7 @@ class EventsStore(EventsWorkerStore):
         for event_id in new_latest_event_ids:
             # First search in the list of new events we're adding.
             for ev, ctx in events_context:
-                if event_id == ev.event_id:
+                if event_id == ev.event_id and ctx.state_group is not None:
                     event_id_to_state_group[event_id] = ctx.state_group
                     break
             else: