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()
diff --git a/synapse/state/v1.py b/synapse/state/v1.py
index 85edae053d..ce255da6fd 100644
--- a/synapse/state/v1.py
+++ b/synapse/state/v1.py
@@ -95,7 +95,11 @@ async def resolve_events_with_store(
if event.room_id != room_id:
raise Exception(
"Attempting to state-resolve for room %s with event %s which is in %s"
- % (room_id, event.event_id, event.room_id,)
+ % (
+ room_id,
+ event.event_id,
+ event.room_id,
+ )
)
# get the ids of the auth events which allow us to authenticate the
@@ -119,7 +123,11 @@ async def resolve_events_with_store(
if event.room_id != room_id:
raise Exception(
"Attempting to state-resolve for room %s with event %s which is in %s"
- % (room_id, event.event_id, event.room_id,)
+ % (
+ room_id,
+ event.event_id,
+ event.room_id,
+ )
)
state_map.update(state_map_new)
@@ -243,7 +251,7 @@ def _resolve_with_state(
def _resolve_state_events(
conflicted_state: StateMap[List[EventBase]], auth_events: MutableStateMap[EventBase]
) -> StateMap[EventBase]:
- """ This is where we actually decide which of the conflicted state to
+ """This is where we actually decide which of the conflicted state to
use.
We resolve conflicts in the following order:
diff --git a/synapse/state/v2.py b/synapse/state/v2.py
index e585954bd8..e73a548ee4 100644
--- a/synapse/state/v2.py
+++ b/synapse/state/v2.py
@@ -118,7 +118,11 @@ async def resolve_events_with_store(
if event.room_id != room_id:
raise Exception(
"Attempting to state-resolve for room %s with event %s which is in %s"
- % (room_id, event.event_id, event.room_id,)
+ % (
+ room_id,
+ event.event_id,
+ event.room_id,
+ )
)
full_conflicted_set = {eid for eid in full_conflicted_set if eid in event_map}
|