diff --git a/changelog.d/11634.misc b/changelog.d/11634.misc
new file mode 100644
index 0000000000..4069cbc2f4
--- /dev/null
+++ b/changelog.d/11634.misc
@@ -0,0 +1 @@
+Refactor the way that the `outlier` flag is set on events received over federation.
diff --git a/synapse/federation/federation_base.py b/synapse/federation/federation_base.py
index 4df90e02d7..addc0bf000 100644
--- a/synapse/federation/federation_base.py
+++ b/synapse/federation/federation_base.py
@@ -215,15 +215,12 @@ def _is_invite_via_3pid(event: EventBase) -> bool:
)
-def event_from_pdu_json(
- pdu_json: JsonDict, room_version: RoomVersion, outlier: bool = False
-) -> EventBase:
+def event_from_pdu_json(pdu_json: JsonDict, room_version: RoomVersion) -> EventBase:
"""Construct an EventBase from an event json received over federation
Args:
pdu_json: pdu as received over federation
room_version: The version of the room this event belongs to
- outlier: True to mark this event as an outlier
Raises:
SynapseError: if the pdu is missing required fields or is otherwise
@@ -247,6 +244,4 @@ def event_from_pdu_json(
validate_canonicaljson(pdu_json)
event = make_event_from_dict(pdu_json, room_version)
- event.internal_metadata.outlier = outlier
-
return event
diff --git a/synapse/federation/federation_client.py b/synapse/federation/federation_client.py
index 7353c2b6b1..6ea4edfc71 100644
--- a/synapse/federation/federation_client.py
+++ b/synapse/federation/federation_client.py
@@ -265,10 +265,7 @@ class FederationClient(FederationBase):
room_version = await self.store.get_room_version(room_id)
- pdus = [
- event_from_pdu_json(p, room_version, outlier=False)
- for p in transaction_data_pdus
- ]
+ pdus = [event_from_pdu_json(p, room_version) for p in transaction_data_pdus]
# Check signatures and hash of pdus, removing any from the list that fail checks
pdus[:] = await self._check_sigs_and_hash_and_fetch(
@@ -282,7 +279,6 @@ class FederationClient(FederationBase):
destination: str,
event_id: str,
room_version: RoomVersion,
- outlier: bool = False,
timeout: Optional[int] = None,
) -> Optional[EventBase]:
"""Requests the PDU with given origin and ID from the remote home
@@ -292,9 +288,6 @@ class FederationClient(FederationBase):
destination: Which homeserver to query
event_id: event to fetch
room_version: version of the room
- outlier: Indicates whether the PDU is an `outlier`, i.e. if
- it's from an arbitrary point in the context as opposed to part
- of the current block of PDUs. Defaults to `False`
timeout: How long to try (in ms) each destination for before
moving to the next destination. None indicates no timeout.
@@ -316,8 +309,7 @@ class FederationClient(FederationBase):
)
pdu_list: List[EventBase] = [
- event_from_pdu_json(p, room_version, outlier=outlier)
- for p in transaction_data["pdus"]
+ event_from_pdu_json(p, room_version) for p in transaction_data["pdus"]
]
if pdu_list and pdu_list[0]:
@@ -334,7 +326,6 @@ class FederationClient(FederationBase):
destinations: Iterable[str],
event_id: str,
room_version: RoomVersion,
- outlier: bool = False,
timeout: Optional[int] = None,
) -> Optional[EventBase]:
"""Requests the PDU with given origin and ID from the remote home
@@ -347,9 +338,6 @@ class FederationClient(FederationBase):
destinations: Which homeservers to query
event_id: event to fetch
room_version: version of the room
- outlier: Indicates whether the PDU is an `outlier`, i.e. if
- it's from an arbitrary point in the context as opposed to part
- of the current block of PDUs. Defaults to `False`
timeout: How long to try (in ms) each destination for before
moving to the next destination. None indicates no timeout.
@@ -377,7 +365,6 @@ class FederationClient(FederationBase):
destination=destination,
event_id=event_id,
room_version=room_version,
- outlier=outlier,
timeout=timeout,
)
@@ -435,7 +422,6 @@ class FederationClient(FederationBase):
origin: str,
pdus: Collection[EventBase],
room_version: RoomVersion,
- outlier: bool = False,
) -> List[EventBase]:
"""Takes a list of PDUs and checks the signatures and hashes of each
one. If a PDU fails its signature check then we check if we have it in
@@ -451,7 +437,6 @@ class FederationClient(FederationBase):
origin
pdu
room_version
- outlier: Whether the events are outliers or not
Returns:
A list of PDUs that have valid signatures and hashes.
@@ -466,7 +451,6 @@ class FederationClient(FederationBase):
valid_pdu = await self._check_sigs_and_hash_and_fetch_one(
pdu=pdu,
origin=origin,
- outlier=outlier,
room_version=room_version,
)
@@ -482,7 +466,6 @@ class FederationClient(FederationBase):
pdu: EventBase,
origin: str,
room_version: RoomVersion,
- outlier: bool = False,
) -> Optional[EventBase]:
"""Takes a PDU and checks its signatures and hashes. If the PDU fails
its signature check then we check if we have it in the database and if
@@ -494,9 +477,6 @@ class FederationClient(FederationBase):
origin
pdu
room_version
- outlier: Whether the events are outliers or not
- include_none: Whether to include None in the returned list
- for events that have failed their checks
Returns:
The PDU (possibly redacted) if it has valid signatures and hashes.
@@ -521,7 +501,6 @@ class FederationClient(FederationBase):
destinations=[pdu_origin],
event_id=pdu.event_id,
room_version=room_version,
- outlier=outlier,
timeout=10000,
)
except SynapseError:
@@ -541,13 +520,10 @@ class FederationClient(FederationBase):
room_version = await self.store.get_room_version(room_id)
- auth_chain = [
- event_from_pdu_json(p, room_version, outlier=True)
- for p in res["auth_chain"]
- ]
+ auth_chain = [event_from_pdu_json(p, room_version) for p in res["auth_chain"]]
signed_auth = await self._check_sigs_and_hash_and_fetch(
- destination, auth_chain, outlier=True, room_version=room_version
+ destination, auth_chain, room_version=room_version
)
return signed_auth
@@ -816,7 +792,6 @@ class FederationClient(FederationBase):
valid_pdu = await self._check_sigs_and_hash_and_fetch_one(
pdu=event,
origin=destination,
- outlier=True,
room_version=room_version,
)
@@ -864,7 +839,6 @@ class FederationClient(FederationBase):
valid_pdu = await self._check_sigs_and_hash_and_fetch_one(
pdu=pdu,
origin=destination,
- outlier=True,
room_version=room_version,
)
@@ -1235,7 +1209,7 @@ class FederationClient(FederationBase):
]
signed_events = await self._check_sigs_and_hash_and_fetch(
- destination, events, outlier=False, room_version=room_version
+ destination, events, room_version=room_version
)
except HttpResponseException as e:
if not e.code == 400:
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index 7c81e3651f..11771f3c9c 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -421,9 +421,6 @@ class FederationEventHandler:
Raises:
SynapseError if the response is in some way invalid.
"""
- for e in itertools.chain(auth_events, state):
- e.internal_metadata.outlier = True
-
event_map = {e.event_id: e for e in itertools.chain(auth_events, state)}
create_event = None
@@ -1194,7 +1191,6 @@ class FederationEventHandler:
[destination],
event_id,
room_version,
- outlier=True,
)
if event is None:
logger.warning(
@@ -1223,9 +1219,10 @@ class FederationEventHandler:
"""Persist a batch of outlier events fetched from remote servers.
We first sort the events to make sure that we process each event's auth_events
- before the event itself, and then auth and persist them.
+ before the event itself.
- Notifies about the events where appropriate.
+ We then mark the events as outliers, persist them to the database, and, where
+ appropriate (eg, an invite), awake the notifier.
Params:
room_id: the room that the events are meant to be in (though this has
@@ -1276,7 +1273,8 @@ class FederationEventHandler:
Persists a batch of events where we have (theoretically) already persisted all
of their auth events.
- Notifies about the events where appropriate.
+ Marks the events as outliers, auths them, persists them to the database, and,
+ where appropriate (eg, an invite), awakes the notifier.
Params:
origin: where the events came from
@@ -1314,6 +1312,9 @@ class FederationEventHandler:
return None
auth.append(ae)
+ # we're not bothering about room state, so flag the event as an outlier.
+ event.internal_metadata.outlier = True
+
context = EventContext.for_outlier()
try:
validate_event_for_room_version(room_version_obj, event)
diff --git a/tests/handlers/test_federation.py b/tests/handlers/test_federation.py
index e1557566e4..496b581726 100644
--- a/tests/handlers/test_federation.py
+++ b/tests/handlers/test_federation.py
@@ -373,9 +373,7 @@ class FederationTestCase(unittest.HomeserverTestCase):
destination: str, room_id: str, event_id: str
) -> List[EventBase]:
return [
- event_from_pdu_json(
- ae.get_pdu_json(), room_version=room_version, outlier=True
- )
+ event_from_pdu_json(ae.get_pdu_json(), room_version=room_version)
for ae in auth_events
]
|