diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index c055c26eca..eb03a5accb 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -519,8 +519,17 @@ class FederationHandler:
state_events=state,
)
+ if ret.partial_state:
+ await self.store.store_partial_state_room(room_id, ret.servers_in_room)
+
max_stream_id = await self._federation_event_handler.process_remote_join(
- origin, room_id, auth_chain, state, event, room_version_obj
+ origin,
+ room_id,
+ auth_chain,
+ state,
+ event,
+ room_version_obj,
+ partial_state=ret.partial_state,
)
# We wait here until this instance has seen the events come down
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index 09d0de1ead..4bd87709f3 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -397,6 +397,7 @@ class FederationEventHandler:
state: List[EventBase],
event: EventBase,
room_version: RoomVersion,
+ partial_state: bool,
) -> int:
"""Persists the events returned by a send_join
@@ -412,6 +413,7 @@ class FederationEventHandler:
event
room_version: The room version we expect this room to have, and
will raise if it doesn't match the version in the create event.
+ partial_state: True if the state omits non-critical membership events
Returns:
The stream ID after which all events have been persisted.
@@ -453,10 +455,14 @@ class FederationEventHandler:
)
# and now persist the join event itself.
- logger.info("Peristing join-via-remote %s", event)
+ logger.info(
+ "Peristing join-via-remote %s (partial_state: %s)", event, partial_state
+ )
with nested_logging_context(suffix=event.event_id):
context = await self._state_handler.compute_event_context(
- event, old_state=state
+ event,
+ old_state=state,
+ partial_state=partial_state,
)
context = await self._check_event_auth(origin, event, context)
@@ -698,6 +704,8 @@ class FederationEventHandler:
try:
state = await self._resolve_state_at_missing_prevs(origin, event)
+ # TODO(faster_joins): make sure that _resolve_state_at_missing_prevs does
+ # not return partial state
await self._process_received_pdu(
origin, event, state=state, backfilled=backfilled
)
@@ -1791,6 +1799,7 @@ class FederationEventHandler:
prev_state_ids=prev_state_ids,
prev_group=prev_group,
delta_ids=state_updates,
+ partial_state=context.partial_state,
)
async def _run_push_actions_and_persist_event(
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index ce1fa3c78e..61cb133ef2 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -992,6 +992,8 @@ class EventCreationHandler:
and full_state_ids_at_event
and builder.internal_metadata.is_historical()
):
+ # TODO(faster_joins): figure out how this works, and make sure that the
+ # old state is complete.
old_state = await self.store.get_events_as_list(full_state_ids_at_event)
context = await self.state.compute_event_context(event, old_state=old_state)
else:
|