diff --git a/synapse/federation/federation_server.py b/synapse/federation/federation_server.py
index 3e1518f1f6..5dfdc86740 100644
--- a/synapse/federation/federation_server.py
+++ b/synapse/federation/federation_server.py
@@ -67,6 +67,7 @@ from synapse.replication.http.federation import (
ReplicationFederationSendEduRestServlet,
ReplicationGetQueryRestServlet,
)
+from synapse.storage.databases.main.events import PartialStateConflictError
from synapse.storage.databases.main.lock import Lock
from synapse.types import JsonDict, StateMap, get_domain_from_id
from synapse.util import json_decoder, unwrapFirstError
@@ -882,9 +883,20 @@ class FederationServer(FederationBase):
logger.warning("%s", errmsg)
raise SynapseError(403, errmsg, Codes.FORBIDDEN)
- return await self._federation_event_handler.on_send_membership_event(
- origin, event
- )
+ try:
+ return await self._federation_event_handler.on_send_membership_event(
+ origin, event
+ )
+ except PartialStateConflictError:
+ # The room was un-partial stated while we were persisting the event.
+ # Try once more, with full state this time.
+ logger.info(
+ "Room %s was un-partial stated during `on_send_membership_event`, trying again.",
+ room_id,
+ )
+ return await self._federation_event_handler.on_send_membership_event(
+ origin, event
+ )
async def on_event_auth(
self, origin: str, room_id: str, event_id: str
|