From 606ce6b57ec3d7104d8c5690e4a92bc59a3f116a Mon Sep 17 00:00:00 2001 From: Kegan Dougal <7190048+kegsay@users.noreply.github.com> Date: Mon, 9 Mar 2026 15:50:10 +0000 Subject: [PATCH] Additional review comments: non-test files --- synapse/event_auth.py | 11 +++++------ synapse/storage/databases/main/events.py | 4 +++- synapse/storage/databases/main/purge_events.py | 4 ++++ .../schema/main/delta/93/04_state_dag_fwd_extrems.sql | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/synapse/event_auth.py b/synapse/event_auth.py index 20fe55f9b5..9af3f6740a 100644 --- a/synapse/event_auth.py +++ b/synapse/event_auth.py @@ -215,7 +215,7 @@ async def check_state_independent_auth_rules( # we should have all the prev state events by now, so if we do not, that suggests # a synapse programming error known_prev_state_event_ids = set(prev_state_events) - raise RuntimeError( + raise AssertionError( f"Event {event.event_id} has unknown prev_state_events " + f"{len(prev_state_events)} != {len(prev_state_events_ids)} " + f"{prev_state_events_ids - known_prev_state_event_ids} missing " @@ -538,11 +538,10 @@ def _check_create(event: "EventBase") -> None: raise AuthError(403, "Create event has prev events") # State DAGs 1.2 If it has any prev_state_events, reject. - if ( - event.room_version.msc4242_state_dags - and cast(FrozenEventVMSC4242, event).prev_state_events - ): - raise AuthError(403, "Create event has prev state events") + if event.room_version.msc4242_state_dags: + assert isinstance(event, FrozenEventVMSC4242) + if len(event.prev_state_events) > 0: + raise AuthError(403, "Create event has prev state events") if event.room_version.msc4291_room_ids_as_hashes: # 1.2 If the create event has a room_id, reject diff --git a/synapse/storage/databases/main/events.py b/synapse/storage/databases/main/events.py index 87a674f5a8..2df1b0a6d4 100644 --- a/synapse/storage/databases/main/events.py +++ b/synapse/storage/databases/main/events.py @@ -2996,12 +2996,14 @@ class PersistEventsStore: }, ) return + assert len(event.prev_state_events) > 0 self.db_pool.simple_upsert_many_txn( txn, table="msc4242_state_dag_edges", key_names=["room_id", "event_id", "prev_state_event_id"], key_values=[ - (event.room_id, event.event_id, prev_state_event) for prev_state_event in event.prev_state_events + (event.room_id, event.event_id, prev_state_event) + for prev_state_event in event.prev_state_events ], value_names=(), value_values=(), diff --git a/synapse/storage/databases/main/purge_events.py b/synapse/storage/databases/main/purge_events.py index d55ea5cf7d..fe8079c201 100644 --- a/synapse/storage/databases/main/purge_events.py +++ b/synapse/storage/databases/main/purge_events.py @@ -71,6 +71,10 @@ purge_room_tables_with_room_id_column = ( # so must be deleted first. "sliding_sync_joined_rooms", "sliding_sync_membership_snapshots", + # Note: msc4242_state_dag_forward_extremities/edges have a foreign key to the `events` table + # so must be deleted first. + "msc4242_state_dag_forward_extremities", + "msc4242_state_dag_edges", "events", "federation_inbound_events_staging", "receipts_graph", diff --git a/synapse/storage/schema/main/delta/93/04_state_dag_fwd_extrems.sql b/synapse/storage/schema/main/delta/93/04_state_dag_fwd_extrems.sql index a91b49d5ad..2fdb96b25c 100644 --- a/synapse/storage/schema/main/delta/93/04_state_dag_fwd_extrems.sql +++ b/synapse/storage/schema/main/delta/93/04_state_dag_fwd_extrems.sql @@ -17,7 +17,7 @@ CREATE TABLE IF NOT EXISTS msc4242_state_dag_forward_extremities( event_id TEXT NOT NULL REFERENCES events(event_id) ON DELETE CASCADE, -- it doesn't make sense to reference the same event multiple times, and this uniqueness -- index is also used to delete events once they are no longer forward extremities. - UNIQUE (event_id, room_id) + UNIQUE (event_id) ); -- When creating events, we want to select all forward extremities for a room which this index helps with. CREATE INDEX msc4242_state_dag_room ON msc4242_state_dag_forward_extremities(room_id);