mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-08-08 15:12:18 -04:00
Faster joins: Refactor handling of servers in room (#14954)
Ensure that the list of servers in a partial state room always contains the server we joined off. Also refactor `get_partial_state_servers_at_join` to return `None` when the given room is no longer partial stated, to explicitly indicate when the room has partial state. Otherwise it's not clear whether an empty list means that the room has full state, or the room is partial stated, but the server we joined off told us that there are no servers in the room. Signed-off-by: Sean Quah <seanq@matrix.org>
This commit is contained in:
parent
8e9fc28c6a
commit
0a686d1d13
9 changed files with 77 additions and 37 deletions
|
@ -19,6 +19,7 @@ import itertools
|
|||
import logging
|
||||
from typing import (
|
||||
TYPE_CHECKING,
|
||||
AbstractSet,
|
||||
Awaitable,
|
||||
Callable,
|
||||
Collection,
|
||||
|
@ -110,8 +111,9 @@ class SendJoinResult:
|
|||
# True if 'state' elides non-critical membership events
|
||||
partial_state: bool
|
||||
|
||||
# if 'partial_state' is set, a list of the servers in the room (otherwise empty)
|
||||
servers_in_room: List[str]
|
||||
# If 'partial_state' is set, a set of the servers in the room (otherwise empty).
|
||||
# Always contains the server we joined off.
|
||||
servers_in_room: AbstractSet[str]
|
||||
|
||||
|
||||
class FederationClient(FederationBase):
|
||||
|
@ -1152,15 +1154,24 @@ class FederationClient(FederationBase):
|
|||
% (auth_chain_create_events,)
|
||||
)
|
||||
|
||||
if response.members_omitted and not response.servers_in_room:
|
||||
raise InvalidResponseError(
|
||||
"members_omitted was set, but no servers were listed in the room"
|
||||
)
|
||||
servers_in_room = None
|
||||
if response.servers_in_room is not None:
|
||||
servers_in_room = set(response.servers_in_room)
|
||||
|
||||
if response.members_omitted and not partial_state:
|
||||
raise InvalidResponseError(
|
||||
"members_omitted was set, but we asked for full state"
|
||||
)
|
||||
if response.members_omitted:
|
||||
if not servers_in_room:
|
||||
raise InvalidResponseError(
|
||||
"members_omitted was set, but no servers were listed in the room"
|
||||
)
|
||||
|
||||
if not partial_state:
|
||||
raise InvalidResponseError(
|
||||
"members_omitted was set, but we asked for full state"
|
||||
)
|
||||
|
||||
# `servers_in_room` is supposed to be a complete list.
|
||||
# Fix things up in case the remote homeserver is badly behaved.
|
||||
servers_in_room.add(destination)
|
||||
|
||||
return SendJoinResult(
|
||||
event=event,
|
||||
|
@ -1168,7 +1179,7 @@ class FederationClient(FederationBase):
|
|||
auth_chain=signed_auth,
|
||||
origin=destination,
|
||||
partial_state=response.members_omitted,
|
||||
servers_in_room=response.servers_in_room or [],
|
||||
servers_in_room=servers_in_room or frozenset(),
|
||||
)
|
||||
|
||||
# MSC3083 defines additional error codes for room joins.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue