diff options
author | reivilibre <oliverw@matrix.org> | 2022-08-04 15:27:04 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-04 16:27:04 +0100 |
commit | e9e6aacfbe016922ed6a25071c0e9ce77334b4e8 (patch) | |
tree | 8c78022941d7e7c910917b0fde86b32382446846 /synapse/handlers | |
parent | Optimise async get event lookups (#13435) (diff) | |
download | synapse-e9e6aacfbe016922ed6a25071c0e9ce77334b4e8.tar.xz |
Faster Room Joins: prevent Synapse from answering federated join requests for a room which it has not fully joined yet. (#13416)
Diffstat (limited to 'synapse/handlers')
-rw-r--r-- | synapse/handlers/federation.py | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py index 30f1585a85..5042236742 100644 --- a/synapse/handlers/federation.py +++ b/synapse/handlers/federation.py @@ -754,6 +754,23 @@ class FederationHandler: # (and return a 404 otherwise) room_version = await self.store.get_room_version(room_id) + if await self.store.is_partial_state_room(room_id): + # If our server is still only partially joined, we can't give a complete + # response to /make_join, so return a 404 as we would if we weren't in the + # room at all. + # The main reason we can't respond properly is that we need to know about + # the auth events for the join event that we would return. + # We also should not bother entertaining the /make_join since we cannot + # handle the /send_join. + logger.info( + "Rejecting /make_join to %s because it's a partial state room", room_id + ) + raise SynapseError( + 404, + "Unable to handle /make_join right now; this server is not fully joined.", + errcode=Codes.NOT_FOUND, + ) + # now check that we are *still* in the room is_in_room = await self._event_auth_handler.check_host_in_room( room_id, self.server_name |