summary refs log tree commit diff
path: root/synapse/storage/events.py
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2017-03-14 11:35:05 +0000
committerErik Johnston <erik@matrix.org>2017-03-14 11:35:05 +0000
commitbb256ac96f2a10b60708d5273bee5df2533f10b8 (patch)
treeae6d19a234b566ff4fc58ec1d7b47c9622843b2c /synapse/storage/events.py
parentAdd new storage function to slave store (diff)
parentMerge pull request #1996 from matrix-org/erikj/fix_current_state (diff)
downloadsynapse-bb256ac96f2a10b60708d5273bee5df2533f10b8.tar.xz
Merge branch 'develop' of github.com:matrix-org/synapse into erikj/public_list_speed
Diffstat (limited to 'synapse/storage/events.py')
-rw-r--r--synapse/storage/events.py31
1 files changed, 28 insertions, 3 deletions
diff --git a/synapse/storage/events.py b/synapse/storage/events.py
index 0039c281cd..72319c35ae 100644
--- a/synapse/storage/events.py
+++ b/synapse/storage/events.py
@@ -433,11 +433,36 @@ class EventsStore(SQLBaseStore):
         if not new_latest_event_ids:
             current_state = {}
         elif was_updated:
+            # We work out the current state by passing the state sets to the
+            # state resolution algorithm. It may ask for some events, including
+            # the events we have yet to persist, so we need a slightly more
+            # complicated event lookup function than simply looking the events
+            # up in the db.
+            events_map = {ev.event_id: ev for ev, _ in events_context}
+
+            @defer.inlineCallbacks
+            def get_events(ev_ids):
+                # We get the events by first looking at the list of events we
+                # are trying to persist, and then fetching the rest from the DB.
+                db = []
+                to_return = {}
+                for ev_id in ev_ids:
+                    ev = events_map.get(ev_id, None)
+                    if ev:
+                        to_return[ev_id] = ev
+                    else:
+                        db.append(ev_id)
+
+                if db:
+                    evs = yield self.get_events(
+                        ev_ids, get_prev_content=False, check_redacted=False,
+                    )
+                    to_return.update(evs)
+                defer.returnValue(to_return)
+
             current_state = yield resolve_events(
                 state_sets,
-                state_map_factory=lambda ev_ids: self.get_events(
-                    ev_ids, get_prev_content=False, check_redacted=False,
-                ),
+                state_map_factory=get_events,
             )
         else:
             return