summary refs log tree commit diff
path: root/synapse/state/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'synapse/state/__init__.py')
-rw-r--r--synapse/state/__init__.py27
1 files changed, 19 insertions, 8 deletions
diff --git a/synapse/state/__init__.py b/synapse/state/__init__.py

index 84f59c7d85..c3d6e80c49 100644 --- a/synapse/state/__init__.py +++ b/synapse/state/__init__.py
@@ -310,6 +310,7 @@ class StateHandler: state_group_before_event = None state_group_before_event_prev_group = None deltas_to_state_group_before_event = None + entry = None else: # otherwise, we'll need to resolve the state across the prev_events. @@ -340,9 +341,13 @@ class StateHandler: current_state_ids=state_ids_before_event, ) - # XXX: can we update the state cache entry for the new state group? or - # could we set a flag on resolve_state_groups_for_events to tell it to - # always make a state group? + # Assign the new state group to the cached state entry. + # + # Note that this can race in that we could generate multiple state + # groups for the same state entry, but that is just inefficient + # rather than dangerous. + if entry and entry.state_group is None: + entry.state_group = state_group_before_event # # now if it's not a state event, we're done @@ -393,7 +398,7 @@ class StateHandler: async def resolve_state_groups_for_events( self, room_id: str, event_ids: Iterable[str] ) -> _StateCacheEntry: - """ Given a list of event_ids this method fetches the state at each + """Given a list of event_ids this method fetches the state at each event, resolves conflicts between them and returns them. Args: @@ -565,7 +570,9 @@ class StateResolutionHandler: return cache logger.info( - "Resolving state for %s with groups %s", room_id, list(group_names), + "Resolving state for %s with groups %s", + room_id, + list(group_names), ) state_groups_histogram.observe(len(state_groups_ids)) @@ -610,7 +617,7 @@ class StateResolutionHandler: event_map: a dict from event_id to event, for any events that we happen to have in flight (eg, those currently being persisted). This will be - used as a starting point fof finding the state we need; any missing + used as a starting point for finding the state we need; any missing events will be requested via state_map_factory. If None, all events will be fetched via state_res_store. @@ -651,11 +658,15 @@ class StateResolutionHandler: return self._report_biggest( - lambda i: i.cpu_time, "CPU time", _biggest_room_by_cpu_counter, + lambda i: i.cpu_time, + "CPU time", + _biggest_room_by_cpu_counter, ) self._report_biggest( - lambda i: i.db_time, "DB time", _biggest_room_by_db_counter, + lambda i: i.db_time, + "DB time", + _biggest_room_by_db_counter, ) self._state_res_metrics.clear()