mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-07 09:15:22 -04:00
Add a class UnpersistedEventContext to allow for the batching up of storing state groups (#14675)
* add class UnpersistedEventContext * modify create new client event to create unpersistedeventcontexts * persist event contexts after creation * fix tests to persist unpersisted event contexts * cleanup * misc lints + cleanup * changelog + fix comments * lints * fix batch insertion? * reduce redundant calculation * add unpersisted event classes * rework compute_event_context, split into function that returns unpersisted event context and then persists it * use calculate_context_info to create unpersisted event contexts * update typing * $%#^&* * black * fix comments and consolidate classes, use attr.s for class * requested changes * lint * requested changes * requested changes * refactor to be stupidly explicit * clearer renaming and flow * make partial state non-optional * update docstrings --------- Co-authored-by: Erik Johnston <erik@matrix.org>
This commit is contained in:
parent
c1d2ce2901
commit
03bccd542b
14 changed files with 369 additions and 172 deletions
|
@ -48,7 +48,7 @@ from synapse.api.urls import ConsentURIBuilder
|
|||
from synapse.event_auth import validate_event_for_room_version
|
||||
from synapse.events import EventBase, relation_from_event
|
||||
from synapse.events.builder import EventBuilder
|
||||
from synapse.events.snapshot import EventContext
|
||||
from synapse.events.snapshot import EventContext, UnpersistedEventContextBase
|
||||
from synapse.events.utils import maybe_upsert_event_field
|
||||
from synapse.events.validator import EventValidator
|
||||
from synapse.handlers.directory import DirectoryHandler
|
||||
|
@ -708,7 +708,7 @@ class EventCreationHandler:
|
|||
|
||||
builder.internal_metadata.historical = historical
|
||||
|
||||
event, context = await self.create_new_client_event(
|
||||
event, unpersisted_context = await self.create_new_client_event(
|
||||
builder=builder,
|
||||
requester=requester,
|
||||
allow_no_prev_events=allow_no_prev_events,
|
||||
|
@ -721,6 +721,8 @@ class EventCreationHandler:
|
|||
current_state_group=current_state_group,
|
||||
)
|
||||
|
||||
context = await unpersisted_context.persist(event)
|
||||
|
||||
# In an ideal world we wouldn't need the second part of this condition. However,
|
||||
# this behaviour isn't spec'd yet, meaning we should be able to deactivate this
|
||||
# behaviour. Another reason is that this code is also evaluated each time a new
|
||||
|
@ -1083,13 +1085,14 @@ class EventCreationHandler:
|
|||
state_map: Optional[StateMap[str]] = None,
|
||||
for_batch: bool = False,
|
||||
current_state_group: Optional[int] = None,
|
||||
) -> Tuple[EventBase, EventContext]:
|
||||
) -> Tuple[EventBase, UnpersistedEventContextBase]:
|
||||
"""Create a new event for a local client. If bool for_batch is true, will
|
||||
create an event using the prev_event_ids, and will create an event context for
|
||||
the event using the parameters state_map and current_state_group, thus these parameters
|
||||
must be provided in this case if for_batch is True. The subsequently created event
|
||||
and context are suitable for being batched up and bulk persisted to the database
|
||||
with other similarly created events.
|
||||
with other similarly created events. Note that this returns an UnpersistedEventContext,
|
||||
which must be converted to an EventContext before it can be sent to the DB.
|
||||
|
||||
Args:
|
||||
builder:
|
||||
|
@ -1131,7 +1134,7 @@ class EventCreationHandler:
|
|||
batch persisting
|
||||
|
||||
Returns:
|
||||
Tuple of created event, context
|
||||
Tuple of created event, UnpersistedEventContext
|
||||
"""
|
||||
# Strip down the state_event_ids to only what we need to auth the event.
|
||||
# For example, we don't need extra m.room.member that don't match event.sender
|
||||
|
@ -1192,9 +1195,16 @@ class EventCreationHandler:
|
|||
event = await builder.build(
|
||||
prev_event_ids=prev_event_ids, auth_event_ids=auth_ids, depth=depth
|
||||
)
|
||||
context = await self.state.compute_event_context_for_batched(
|
||||
event, state_map, current_state_group
|
||||
|
||||
context: UnpersistedEventContextBase = (
|
||||
await self.state.calculate_context_info(
|
||||
event,
|
||||
state_ids_before_event=state_map,
|
||||
partial_state=False,
|
||||
state_group_before_event=current_state_group,
|
||||
)
|
||||
)
|
||||
|
||||
else:
|
||||
event = await builder.build(
|
||||
prev_event_ids=prev_event_ids,
|
||||
|
@ -1244,16 +1254,17 @@ class EventCreationHandler:
|
|||
|
||||
state_map_for_event[(data.event_type, data.state_key)] = state_id
|
||||
|
||||
context = await self.state.compute_event_context(
|
||||
# TODO(faster_joins): check how MSC2716 works and whether we can have
|
||||
# partial state here
|
||||
# https://github.com/matrix-org/synapse/issues/13003
|
||||
context = await self.state.calculate_context_info(
|
||||
event,
|
||||
state_ids_before_event=state_map_for_event,
|
||||
# TODO(faster_joins): check how MSC2716 works and whether we can have
|
||||
# partial state here
|
||||
# https://github.com/matrix-org/synapse/issues/13003
|
||||
partial_state=False,
|
||||
)
|
||||
|
||||
else:
|
||||
context = await self.state.compute_event_context(event)
|
||||
context = await self.state.calculate_context_info(event)
|
||||
|
||||
if requester:
|
||||
context.app_service = requester.app_service
|
||||
|
@ -2082,9 +2093,9 @@ class EventCreationHandler:
|
|||
|
||||
async def _rebuild_event_after_third_party_rules(
|
||||
self, third_party_result: dict, original_event: EventBase
|
||||
) -> Tuple[EventBase, EventContext]:
|
||||
) -> Tuple[EventBase, UnpersistedEventContextBase]:
|
||||
# the third_party_event_rules want to replace the event.
|
||||
# we do some basic checks, and then return the replacement event and context.
|
||||
# we do some basic checks, and then return the replacement event.
|
||||
|
||||
# Construct a new EventBuilder and validate it, which helps with the
|
||||
# rest of these checks.
|
||||
|
@ -2138,5 +2149,6 @@ class EventCreationHandler:
|
|||
|
||||
# we rebuild the event context, to be on the safe side. If nothing else,
|
||||
# delta_ids might need an update.
|
||||
context = await self.state.compute_event_context(event)
|
||||
context = await self.state.calculate_context_info(event)
|
||||
|
||||
return event, context
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue