|
|
|
@ -337,7 +337,7 @@ class StateHandler(object): |
|
|
|
|
for st in state_groups_ids.values() |
|
|
|
|
] |
|
|
|
|
with Measure(self.clock, "state._resolve_events"): |
|
|
|
|
new_state, _ = Resolver.resolve_events( |
|
|
|
|
new_state, _ = resolve_events( |
|
|
|
|
state_sets, event_type, state_key |
|
|
|
|
) |
|
|
|
|
new_state = { |
|
|
|
@ -392,11 +392,11 @@ class StateHandler(object): |
|
|
|
|
) |
|
|
|
|
with Measure(self.clock, "state._resolve_events"): |
|
|
|
|
if event.is_state(): |
|
|
|
|
return Resolver.resolve_events( |
|
|
|
|
return resolve_events( |
|
|
|
|
state_sets, event.type, event.state_key |
|
|
|
|
) |
|
|
|
|
else: |
|
|
|
|
return Resolver.resolve_events(state_sets) |
|
|
|
|
return resolve_events(state_sets) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _ordered_events(events): |
|
|
|
@ -406,9 +406,7 @@ def _ordered_events(events): |
|
|
|
|
return sorted(events, key=key_func) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Resolver(object): |
|
|
|
|
@staticmethod |
|
|
|
|
def resolve_events(state_sets, event_type=None, state_key=""): |
|
|
|
|
def resolve_events(state_sets, event_type=None, state_key=""): |
|
|
|
|
""" |
|
|
|
|
Returns |
|
|
|
|
(dict[(str, str), synapse.events.FrozenEvent], list[str]): a tuple |
|
|
|
@ -448,7 +446,7 @@ class Resolver(object): |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
resolved_state = Resolver._resolve_state_events( |
|
|
|
|
resolved_state = _resolve_state_events( |
|
|
|
|
conflicted_state, auth_events |
|
|
|
|
) |
|
|
|
|
except: |
|
|
|
@ -460,8 +458,8 @@ class Resolver(object): |
|
|
|
|
|
|
|
|
|
return new_state, prev_states |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def _resolve_state_events(conflicted_state, auth_events): |
|
|
|
|
|
|
|
|
|
def _resolve_state_events(conflicted_state, auth_events): |
|
|
|
|
""" This is where we actually decide which of the conflicted state to |
|
|
|
|
use. |
|
|
|
|
|
|
|
|
@ -476,7 +474,7 @@ class Resolver(object): |
|
|
|
|
if power_key in conflicted_state: |
|
|
|
|
events = conflicted_state[power_key] |
|
|
|
|
logger.debug("Resolving conflicted power levels %r", events) |
|
|
|
|
resolved_state[power_key] = Resolver._resolve_auth_events( |
|
|
|
|
resolved_state[power_key] = _resolve_auth_events( |
|
|
|
|
events, auth_events) |
|
|
|
|
|
|
|
|
|
auth_events.update(resolved_state) |
|
|
|
@ -484,7 +482,7 @@ class Resolver(object): |
|
|
|
|
for key, events in conflicted_state.items(): |
|
|
|
|
if key[0] == EventTypes.JoinRules: |
|
|
|
|
logger.debug("Resolving conflicted join rules %r", events) |
|
|
|
|
resolved_state[key] = Resolver._resolve_auth_events( |
|
|
|
|
resolved_state[key] = _resolve_auth_events( |
|
|
|
|
events, |
|
|
|
|
auth_events |
|
|
|
|
) |
|
|
|
@ -494,7 +492,7 @@ class Resolver(object): |
|
|
|
|
for key, events in conflicted_state.items(): |
|
|
|
|
if key[0] == EventTypes.Member: |
|
|
|
|
logger.debug("Resolving conflicted member lists %r", events) |
|
|
|
|
resolved_state[key] = Resolver._resolve_auth_events( |
|
|
|
|
resolved_state[key] = _resolve_auth_events( |
|
|
|
|
events, |
|
|
|
|
auth_events |
|
|
|
|
) |
|
|
|
@ -504,14 +502,14 @@ class Resolver(object): |
|
|
|
|
for key, events in conflicted_state.items(): |
|
|
|
|
if key not in resolved_state: |
|
|
|
|
logger.debug("Resolving conflicted state %r:%r", key, events) |
|
|
|
|
resolved_state[key] = Resolver._resolve_normal_events( |
|
|
|
|
resolved_state[key] = _resolve_normal_events( |
|
|
|
|
events, auth_events |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
return resolved_state |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def _resolve_auth_events(events, auth_events): |
|
|
|
|
|
|
|
|
|
def _resolve_auth_events(events, auth_events): |
|
|
|
|
reverse = [i for i in reversed(_ordered_events(events))] |
|
|
|
|
|
|
|
|
|
auth_events = dict(auth_events) |
|
|
|
@ -528,8 +526,8 @@ class Resolver(object): |
|
|
|
|
|
|
|
|
|
return event |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def _resolve_normal_events(events, auth_events): |
|
|
|
|
|
|
|
|
|
def _resolve_normal_events(events, auth_events): |
|
|
|
|
for event in _ordered_events(events): |
|
|
|
|
try: |
|
|
|
|
# The signatures have already been checked at this point |
|
|
|
|