Skip to content
Snippets Groups Projects
Commit d787e41b authored by Erik Johnston's avatar Erik Johnston
Browse files

Measure StateHandler._resolve_events

parent 6cf0ba14
No related branches found
No related tags found
No related merge requests found
...@@ -18,6 +18,7 @@ from twisted.internet import defer ...@@ -18,6 +18,7 @@ from twisted.internet import defer
from synapse.util.logutils import log_function from synapse.util.logutils import log_function
from synapse.util.caches.expiringcache import ExpiringCache from synapse.util.caches.expiringcache import ExpiringCache
from synapse.util.metrics import Measure
from synapse.api.constants import EventTypes from synapse.api.constants import EventTypes
from synapse.api.errors import AuthError from synapse.api.errors import AuthError
from synapse.api.auth import AuthEventTypes from synapse.api.auth import AuthEventTypes
...@@ -263,48 +264,49 @@ class StateHandler(object): ...@@ -263,48 +264,49 @@ class StateHandler(object):
from (type, state_key) to event. prev_states is a list of event_ids. from (type, state_key) to event. prev_states is a list of event_ids.
:rtype: (dict[(str, str), synapse.events.FrozenEvent], list[str]) :rtype: (dict[(str, str), synapse.events.FrozenEvent], list[str])
""" """
state = {} with Measure(self.clock, "state._resolve_events"):
for st in state_sets: state = {}
for e in st: for st in state_sets:
state.setdefault( for e in st:
(e.type, e.state_key), state.setdefault(
{} (e.type, e.state_key),
)[e.event_id] = e {}
)[e.event_id] = e
unconflicted_state = {
k: v.values()[0] for k, v in state.items() unconflicted_state = {
if len(v.values()) == 1 k: v.values()[0] for k, v in state.items()
} if len(v.values()) == 1
}
conflicted_state = {
k: v.values()
for k, v in state.items()
if len(v.values()) > 1
}
if event_type: conflicted_state = {
prev_states_events = conflicted_state.get( k: v.values()
(event_type, state_key), [] for k, v in state.items()
) if len(v.values()) > 1
prev_states = [s.event_id for s in prev_states_events] }
else:
prev_states = []
auth_events = { if event_type:
k: e for k, e in unconflicted_state.items() prev_states_events = conflicted_state.get(
if k[0] in AuthEventTypes (event_type, state_key), []
} )
prev_states = [s.event_id for s in prev_states_events]
else:
prev_states = []
try: auth_events = {
resolved_state = self._resolve_state_events( k: e for k, e in unconflicted_state.items()
conflicted_state, auth_events if k[0] in AuthEventTypes
) }
except:
logger.exception("Failed to resolve state") try:
raise resolved_state = self._resolve_state_events(
conflicted_state, auth_events
)
except:
logger.exception("Failed to resolve state")
raise
new_state = unconflicted_state new_state = unconflicted_state
new_state.update(resolved_state) new_state.update(resolved_state)
return new_state, prev_states return new_state, prev_states
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment