mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-08-02 08:06:03 -04:00
Define StateMap as immutable and add a MutableStateMap type. (#8183)
This commit is contained in:
parent
2c2e649be2
commit
d5e73cb6aa
8 changed files with 52 additions and 32 deletions
|
@ -25,6 +25,7 @@ from typing import (
|
|||
Sequence,
|
||||
Set,
|
||||
Union,
|
||||
cast,
|
||||
overload,
|
||||
)
|
||||
|
||||
|
@ -41,7 +42,7 @@ from synapse.logging.utils import log_function
|
|||
from synapse.state import v1, v2
|
||||
from synapse.storage.databases.main.events_worker import EventRedactBehaviour
|
||||
from synapse.storage.roommember import ProfileInfo
|
||||
from synapse.types import Collection, StateMap
|
||||
from synapse.types import Collection, MutableStateMap, StateMap
|
||||
from synapse.util import Clock
|
||||
from synapse.util.async_helpers import Linearizer
|
||||
from synapse.util.caches.expiringcache import ExpiringCache
|
||||
|
@ -205,7 +206,7 @@ class StateHandler(object):
|
|||
|
||||
logger.debug("calling resolve_state_groups from get_current_state_ids")
|
||||
ret = await self.resolve_state_groups_for_events(room_id, latest_event_ids)
|
||||
return dict(ret.state)
|
||||
return ret.state
|
||||
|
||||
async def get_current_users_in_room(
|
||||
self, room_id: str, latest_event_ids: Optional[List[str]] = None
|
||||
|
@ -302,7 +303,7 @@ class StateHandler(object):
|
|||
# if we're given the state before the event, then we use that
|
||||
state_ids_before_event = {
|
||||
(s.type, s.state_key): s.event_id for s in old_state
|
||||
}
|
||||
} # type: StateMap[str]
|
||||
state_group_before_event = None
|
||||
state_group_before_event_prev_group = None
|
||||
deltas_to_state_group_before_event = None
|
||||
|
@ -315,7 +316,7 @@ class StateHandler(object):
|
|||
event.room_id, event.prev_event_ids()
|
||||
)
|
||||
|
||||
state_ids_before_event = dict(entry.state)
|
||||
state_ids_before_event = entry.state
|
||||
state_group_before_event = entry.state_group
|
||||
state_group_before_event_prev_group = entry.prev_group
|
||||
deltas_to_state_group_before_event = entry.delta_ids
|
||||
|
@ -540,7 +541,7 @@ class StateResolutionHandler(object):
|
|||
#
|
||||
# XXX: is this actually worthwhile, or should we just let
|
||||
# resolve_events_with_store do it?
|
||||
new_state = {}
|
||||
new_state = {} # type: MutableStateMap[str]
|
||||
conflicted_state = False
|
||||
for st in state_groups_ids.values():
|
||||
for key, e_id in st.items():
|
||||
|
@ -554,13 +555,20 @@ class StateResolutionHandler(object):
|
|||
if conflicted_state:
|
||||
logger.info("Resolving conflicted state for %r", room_id)
|
||||
with Measure(self.clock, "state._resolve_events"):
|
||||
new_state = await resolve_events_with_store(
|
||||
self.clock,
|
||||
room_id,
|
||||
room_version,
|
||||
list(state_groups_ids.values()),
|
||||
event_map=event_map,
|
||||
state_res_store=state_res_store,
|
||||
# resolve_events_with_store returns a StateMap, but we can
|
||||
# treat it as a MutableStateMap as it is above. It isn't
|
||||
# actually mutated anymore (and is frozen in
|
||||
# _make_state_cache_entry below).
|
||||
new_state = cast(
|
||||
MutableStateMap,
|
||||
await resolve_events_with_store(
|
||||
self.clock,
|
||||
room_id,
|
||||
room_version,
|
||||
list(state_groups_ids.values()),
|
||||
event_map=event_map,
|
||||
state_res_store=state_res_store,
|
||||
),
|
||||
)
|
||||
|
||||
# if the new state matches any of the input state groups, we can
|
||||
|
|
|
@ -32,7 +32,7 @@ from synapse.api.constants import EventTypes
|
|||
from synapse.api.errors import AuthError
|
||||
from synapse.api.room_versions import RoomVersions
|
||||
from synapse.events import EventBase
|
||||
from synapse.types import StateMap
|
||||
from synapse.types import MutableStateMap, StateMap
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -131,7 +131,7 @@ async def resolve_events_with_store(
|
|||
|
||||
def _seperate(
|
||||
state_sets: Iterable[StateMap[str]],
|
||||
) -> Tuple[StateMap[str], StateMap[Set[str]]]:
|
||||
) -> Tuple[MutableStateMap[str], MutableStateMap[Set[str]]]:
|
||||
"""Takes the state_sets and figures out which keys are conflicted and
|
||||
which aren't. i.e., which have multiple different event_ids associated
|
||||
with them in different state sets.
|
||||
|
@ -152,7 +152,7 @@ def _seperate(
|
|||
"""
|
||||
state_set_iterator = iter(state_sets)
|
||||
unconflicted_state = dict(next(state_set_iterator))
|
||||
conflicted_state = {} # type: StateMap[Set[str]]
|
||||
conflicted_state = {} # type: MutableStateMap[Set[str]]
|
||||
|
||||
for state_set in state_set_iterator:
|
||||
for key, value in state_set.items():
|
||||
|
@ -208,7 +208,7 @@ def _create_auth_events_from_maps(
|
|||
|
||||
|
||||
def _resolve_with_state(
|
||||
unconflicted_state_ids: StateMap[str],
|
||||
unconflicted_state_ids: MutableStateMap[str],
|
||||
conflicted_state_ids: StateMap[Set[str]],
|
||||
auth_event_ids: StateMap[str],
|
||||
state_map: Dict[str, EventBase],
|
||||
|
@ -241,7 +241,7 @@ def _resolve_with_state(
|
|||
|
||||
|
||||
def _resolve_state_events(
|
||||
conflicted_state: StateMap[List[EventBase]], auth_events: StateMap[EventBase]
|
||||
conflicted_state: StateMap[List[EventBase]], auth_events: MutableStateMap[EventBase]
|
||||
) -> StateMap[EventBase]:
|
||||
""" This is where we actually decide which of the conflicted state to
|
||||
use.
|
||||
|
|
|
@ -38,7 +38,7 @@ from synapse.api.constants import EventTypes
|
|||
from synapse.api.errors import AuthError
|
||||
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS
|
||||
from synapse.events import EventBase
|
||||
from synapse.types import StateMap
|
||||
from synapse.types import MutableStateMap, StateMap
|
||||
from synapse.util import Clock
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -414,7 +414,7 @@ async def _iterative_auth_checks(
|
|||
base_state: StateMap[str],
|
||||
event_map: Dict[str, EventBase],
|
||||
state_res_store: "synapse.state.StateResolutionStore",
|
||||
) -> StateMap[str]:
|
||||
) -> MutableStateMap[str]:
|
||||
"""Sequentially apply auth checks to each event in given list, updating the
|
||||
state as it goes along.
|
||||
|
||||
|
@ -430,7 +430,7 @@ async def _iterative_auth_checks(
|
|||
Returns:
|
||||
Returns the final updated state
|
||||
"""
|
||||
resolved_state = base_state.copy()
|
||||
resolved_state = dict(base_state)
|
||||
room_version_obj = KNOWN_ROOM_VERSIONS[room_version]
|
||||
|
||||
for idx, event_id in enumerate(event_ids, start=1):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue