diff options
author | Erik Johnston <erik@matrix.org> | 2017-03-14 11:35:05 +0000 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2017-03-14 11:35:05 +0000 |
commit | bb256ac96f2a10b60708d5273bee5df2533f10b8 (patch) | |
tree | ae6d19a234b566ff4fc58ec1d7b47c9622843b2c /synapse/storage/events.py | |
parent | Add new storage function to slave store (diff) | |
parent | Merge pull request #1996 from matrix-org/erikj/fix_current_state (diff) | |
download | synapse-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.py | 31 |
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 |