Merge pull request #1996 from matrix-org/erikj/fix_current_state

Fix current_state_events table to not lie
This commit is contained in:
Erik Johnston 2017-03-14 11:34:35 +00:00 committed by GitHub
commit 6a3c5d6891
1 changed files with 28 additions and 3 deletions

View File

@ -433,11 +433,36 @@ class EventsStore(SQLBaseStore):
if not new_latest_event_ids: if not new_latest_event_ids:
current_state = {} current_state = {}
elif was_updated: 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( current_state = yield resolve_events(
state_sets, state_sets,
state_map_factory=lambda ev_ids: self.get_events( state_map_factory=get_events,
ev_ids, get_prev_content=False, check_redacted=False,
),
) )
else: else:
return return