From 811ac73a42db16db7211a7517ad5651a1f6aee71 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 24 Jul 2018 13:40:42 +0100 Subject: [PATCH] Don't fetch state from the database unless needed --- synapse/storage/events.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/synapse/storage/events.py b/synapse/storage/events.py index 6d2aae9c4..eb8bbe13a 100644 --- a/synapse/storage/events.py +++ b/synapse/storage/events.py @@ -631,6 +631,24 @@ class EventsStore(EventsWorkerStore): if old_state_groups == new_state_groups: defer.returnValue((None, None)) + if len(new_state_groups) == 1: + # If there is only one state group, then we know what the current + # state is. + if len(old_state_groups) == 1: + new_state_group = next(iter(new_state_groups)) + old_state_group = next(iter(old_state_groups)) + + delta_ids = state_group_deltas.get( + (old_state_group, new_state_group,), None + ) + if delta_ids is not None: + # We have a delta from the existing to new current state, + # so lets just return that. If we happen to already have + # the current state in memory then lets also return that, + # but it doesn't matter if we don't. + new_state = state_groups_map.get(new_state_group) + defer.returnValue((new_state, delta_ids)) + # Now that we have calculated new_state_groups we need to get # their state IDs so we can resolve to a single state set. missing_state = new_state_groups - set(state_groups_map) @@ -639,19 +657,7 @@ class EventsStore(EventsWorkerStore): state_groups_map.update(group_to_state) if len(new_state_groups) == 1: - # If there is only one state group, then we know what the current - # state is. - new_state_group = new_state_groups.pop() - - delta_ids = None - if len(old_state_groups) == 1: - old_state_group = old_state_groups.pop() - - delta_ids = state_group_deltas.get( - (old_state_group, new_state_group,), None - ) - - defer.returnValue((state_groups_map[new_state_group], delta_ids)) + defer.returnValue((state_groups_map[new_state_groups.pop()], None)) # Ok, we need to defer to the state handler to resolve our state sets.