Add some assertions about outliers (#10773)

I think I have finally teased apart the codepaths which handle outliers, and those that handle non-outliers. 
Let's add some assertions to demonstrate my newfound knowledge.
This commit is contained in:
Richard van der Hoff 2021-09-08 10:41:13 +01:00 committed by GitHub
parent 5724883ac2
commit aacdce8fc0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 83 additions and 76 deletions

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

@ -0,0 +1 @@
Clean up some of the federation event authentication code for clarity.

View File

@ -173,6 +173,9 @@ class FederationEventHandler:
pdu: received PDU pdu: received PDU
""" """
# We should never see any outliers here.
assert not pdu.internal_metadata.outlier
room_id = pdu.room_id room_id = pdu.room_id
event_id = pdu.event_id event_id = pdu.event_id
@ -232,13 +235,7 @@ class FederationEventHandler:
) )
return None return None
# Check that the event passes auth based on the state at the event. This is # Try to fetch any missing prev events to fill in gaps in the graph
# done for events that are to be added to the timeline (non-outliers).
#
# Get missing pdus if necessary:
# - Fetching any missing prev events to fill in gaps in the graph
# - Fetching state if we have a hole in the graph
if not pdu.internal_metadata.is_outlier():
prevs = set(pdu.prev_event_ids()) prevs = set(pdu.prev_event_ids())
seen = await self._store.have_events_in_timeline(prevs) seen = await self._store.have_events_in_timeline(prevs)
missing_prevs = prevs - seen missing_prevs = prevs - seen
@ -885,8 +882,13 @@ class FederationEventHandler:
state: Optional[Iterable[EventBase]], state: Optional[Iterable[EventBase]],
backfilled: bool = False, backfilled: bool = False,
) -> None: ) -> None:
"""Called when we have a new pdu. We need to do auth checks and put it """Called when we have a new non-outlier event.
through the StateHandler.
This is called when we have a new event to add to the room DAG - either directly
via a /send request, retrieved via get_missing_events after a /send request, or
backfilled after a client request.
We need to do auth checks and put it through the StateHandler.
Args: Args:
origin: server sending the event origin: server sending the event
@ -901,6 +903,7 @@ class FederationEventHandler:
notification to clients, and validation of device keys.) notification to clients, and validation of device keys.)
""" """
logger.debug("Processing event: %s", event) logger.debug("Processing event: %s", event)
assert not event.internal_metadata.outlier
try: try:
context = await self._state_handler.compute_event_context( context = await self._state_handler.compute_event_context(
@ -1263,11 +1266,13 @@ class FederationEventHandler:
Possibly incomplete, and possibly including events that are not yet Possibly incomplete, and possibly including events that are not yet
persisted, or authed, or in the right room. persisted, or authed, or in the right room.
Only populated where we may not already have persisted these events - Only populated when populating outliers.
for example, when populating outliers.
backfilled: True if the event was backfilled. backfilled: True if the event was backfilled.
""" """
# claimed_auth_event_map should be given iff the event is an outlier
assert bool(claimed_auth_event_map) == event.internal_metadata.outlier
context = await self._check_event_auth( context = await self._check_event_auth(
origin, origin,
event, event,
@ -1306,15 +1311,16 @@ class FederationEventHandler:
Possibly incomplete, and possibly including events that are not yet Possibly incomplete, and possibly including events that are not yet
persisted, or authed, or in the right room. persisted, or authed, or in the right room.
Only populated where we may not already have persisted these events - Only populated when populating outliers.
for example, when populating outliers, or the state for a backwards
extremity.
backfilled: True if the event was backfilled. backfilled: True if the event was backfilled.
Returns: Returns:
The updated context object. The updated context object.
""" """
# claimed_auth_event_map should be given iff the event is an outlier
assert bool(claimed_auth_event_map) == event.internal_metadata.outlier
room_version = await self._store.get_room_version_id(event.room_id) room_version = await self._store.get_room_version_id(event.room_id)
room_version_obj = KNOWN_ROOM_VERSIONS[room_version] room_version_obj = KNOWN_ROOM_VERSIONS[room_version]