Add parameter to control whether we do a partial state join (#14843)

When the local homeserver is already joined to a room and wants to
perform another remote join, we may find it useful to do a non-partial
state join if we already have the full state for the room.

Signed-off-by: Sean Quah <seanq@matrix.org>
This commit is contained in:
Sean Quah 2023-01-16 23:15:17 +00:00 committed by GitHub
parent 4db3331bb9
commit db5145a31d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 5 deletions

1
changelog.d/14843.misc Normal file
View File

@ -0,0 +1 @@
Add a parameter to control whether the federation client performs a partial state join.

View File

@ -1014,7 +1014,11 @@ class FederationClient(FederationBase):
) )
async def send_join( async def send_join(
self, destinations: Iterable[str], pdu: EventBase, room_version: RoomVersion self,
destinations: Iterable[str],
pdu: EventBase,
room_version: RoomVersion,
partial_state: bool = True,
) -> SendJoinResult: ) -> SendJoinResult:
"""Sends a join event to one of a list of homeservers. """Sends a join event to one of a list of homeservers.
@ -1027,6 +1031,10 @@ class FederationClient(FederationBase):
pdu: event to be sent pdu: event to be sent
room_version: the version of the room (according to the server that room_version: the version of the room (according to the server that
did the make_join) did the make_join)
partial_state: whether to ask the remote server to omit membership state
events from the response. If the remote server complies,
`partial_state` in the send join result will be set. Defaults to
`True`.
Returns: Returns:
The result of the send join request. The result of the send join request.
@ -1037,7 +1045,9 @@ class FederationClient(FederationBase):
""" """
async def send_request(destination: str) -> SendJoinResult: async def send_request(destination: str) -> SendJoinResult:
response = await self._do_send_join(room_version, destination, pdu) response = await self._do_send_join(
room_version, destination, pdu, omit_members=partial_state
)
# If an event was returned (and expected to be returned): # If an event was returned (and expected to be returned):
# #
@ -1177,7 +1187,11 @@ class FederationClient(FederationBase):
) )
async def _do_send_join( async def _do_send_join(
self, room_version: RoomVersion, destination: str, pdu: EventBase self,
room_version: RoomVersion,
destination: str,
pdu: EventBase,
omit_members: bool,
) -> SendJoinResponse: ) -> SendJoinResponse:
time_now = self._clock.time_msec() time_now = self._clock.time_msec()
@ -1188,6 +1202,7 @@ class FederationClient(FederationBase):
room_id=pdu.room_id, room_id=pdu.room_id,
event_id=pdu.event_id, event_id=pdu.event_id,
content=pdu.get_pdu_json(time_now), content=pdu.get_pdu_json(time_now),
omit_members=omit_members,
) )
except HttpResponseException as e: except HttpResponseException as e:
# If an error is received that is due to an unrecognised endpoint, # If an error is received that is due to an unrecognised endpoint,

View File

@ -351,13 +351,16 @@ class TransportLayerClient:
room_id: str, room_id: str,
event_id: str, event_id: str,
content: JsonDict, content: JsonDict,
omit_members: bool,
) -> "SendJoinResponse": ) -> "SendJoinResponse":
path = _create_v2_path("/send_join/%s/%s", room_id, event_id) path = _create_v2_path("/send_join/%s/%s", room_id, event_id)
query_params: Dict[str, str] = {} query_params: Dict[str, str] = {}
if self._faster_joins_enabled: if self._faster_joins_enabled:
# lazy-load state on join # lazy-load state on join
query_params["org.matrix.msc3706.partial_state"] = "true" query_params["org.matrix.msc3706.partial_state"] = (
query_params["omit_members"] = "true" "true" if omit_members else "false"
)
query_params["omit_members"] = "true" if omit_members else "false"
return await self.client.put_json( return await self.client.put_json(
destination=destination, destination=destination,