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()
|