diff --git a/changelog.d/19424.feature b/changelog.d/19424.feature index 732a583f6b..8f241a87b5 100644 --- a/changelog.d/19424.feature +++ b/changelog.d/19424.feature @@ -1 +1 @@ -Add experimental support for MSC4242: State DAGs. Excludes federation support. +Add experimental support for [MSC4242](https://github.com/matrix-org/matrix-spec-proposals/pull/4242): State DAGs. Excludes federation support. \ No newline at end of file diff --git a/rust/src/events/internal_metadata.rs b/rust/src/events/internal_metadata.rs index 8647d27e71..447200d802 100644 --- a/rust/src/events/internal_metadata.rs +++ b/rust/src/events/internal_metadata.rs @@ -60,7 +60,7 @@ enum EventInternalMetadataData { DelayId(Box), TokenId(i64), DeviceId(Box), - CalculatedAuthEventIDs(Vec), + CalculatedAuthEventIDs(Vec), // MSC4242: State DAGs } impl EventInternalMetadataData { diff --git a/synapse/handlers/room_member.py b/synapse/handlers/room_member.py index 81dbf2cb6c..4056555156 100644 --- a/synapse/handlers/room_member.py +++ b/synapse/handlers/room_member.py @@ -2141,8 +2141,9 @@ class RoomMemberMasterHandler(RoomMemberHandler): list(previous_membership_event.auth_event_ids()) + prev_event_ids ) - # Either one is set or the other - assert prev_state_events or auth_event_ids + # State DAG rooms should not have auth events specified + if prev_state_events: + assert auth_event_ids is None # Try several times, it could fail with PartialStateConflictError # in handle_new_client_event, cf comment in except block. max_retries = 5 diff --git a/synapse/storage/schema/main/delta/94/03_state_dag_fwd_extrems.sql b/synapse/storage/schema/main/delta/94/03_state_dag_fwd_extrems.sql index 97ef2bb6e8..bc5c738ba5 100644 --- a/synapse/storage/schema/main/delta/94/03_state_dag_fwd_extrems.sql +++ b/synapse/storage/schema/main/delta/94/03_state_dag_fwd_extrems.sql @@ -34,8 +34,5 @@ CREATE TABLE IF NOT EXISTS msc4242_state_dag_edges( -- one of the `prev_state_events` for this event ID. We must have it since we must have the entire state DAG. -- can be NULL for the create event. prev_state_event_id TEXT REFERENCES events(event_id) - -- calculated depth for this event ID. There is some denormalisation here as we're storing the depth - -- multiple times for each prev_state_event_id. - -- depth BIGINT NOT NULL ); CREATE UNIQUE INDEX msc4242_state_dag_edges_key ON msc4242_state_dag_edges(room_id, event_id, prev_state_event_id);