Fix current_state_events table to not lie

If we try and persist two state events that have the same ancestor we
calculate the wrong current state when persisting those events.
This commit is contained in:
Erik Johnston 2017-03-14 10:54:28 +00:00
parent f29d85d9e4
commit cc7a294e2e

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