Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
48e1e73
MSC4242: State DAGs (CSAPI)
kegsay Feb 3, 2026
dc3db60
Changelog
kegsay Feb 3, 2026
fc4975f
AssertEqual not plural because https://github.com/twisted/twisted/iss…
kegsay Feb 3, 2026
b69986d
Merge branch 'develop' into kegan/4242-csapi
kegsay Mar 9, 2026
c561c0d
Swap Optional for |: https://github.com/element-hq/synapse/pull/19424…
kegsay Mar 9, 2026
3dff3ac
Additional comments per code review
kegsay Mar 9, 2026
aa46122
Apply suggestions from code review
kegsay Mar 9, 2026
2f82a5b
Review comments in persist_events.py
kegsay Mar 9, 2026
606ce6b
Additional review comments: non-test files
kegsay Mar 9, 2026
7311f92
Review comments in events/builder.py
kegsay Mar 9, 2026
85fa59e
Update synapse/handlers/admin.py
kegsay Mar 9, 2026
332fd2d
Update synapse/handlers/message.py
kegsay Mar 9, 2026
4ea71e0
Update synapse/state/__init__.py
kegsay Mar 9, 2026
7a1be81
More code review (non-test files)
kegsay Mar 9, 2026
d96737b
Review comments: test code and a few extras
kegsay Mar 10, 2026
c9d8d9f
Update synapse/events/__init__.py
kegsay Mar 10, 2026
2f8fece
Update synapse/handlers/admin.py
kegsay Mar 10, 2026
bc91229
Update synapse/storage/controllers/persist_events.py
kegsay Mar 10, 2026
6ecf821
Update synapse/storage/controllers/persist_events.py
kegsay Mar 10, 2026
ecc9860
Update synapse/event_auth.py
kegsay Mar 10, 2026
a0711ef
Review comments
kegsay Mar 10, 2026
85fc75c
Use shortstr for consistency with other log messages
kegsay Mar 10, 2026
f790d3a
Linting
kegsay Mar 10, 2026
206c77a
Review comments
kegsay Mar 17, 2026
0b155b7
Review comments
kegsay Mar 17, 2026
cdf9054
Merge branch 'develop' into kegan/4242-csapi
kegsay Mar 17, 2026
3a51f74
Exclude MSC4242 room versions whilst this branch doesn't have fed su…
kegsay Mar 17, 2026
d59f31a
Linting
kegsay Mar 17, 2026
b45dd7f
Review comments
kegsay Apr 8, 2026
7ade815
Review comments
kegsay Apr 8, 2026
058a1df
Review comments
kegsay Apr 8, 2026
7ac0b75
Merge branch 'develop' into kegan/4242-csapi
kegsay Apr 8, 2026
23caef3
Ensure state DAG rooms do not federate
kegsay Apr 8, 2026
fa6059e
Only add MSC4242 room version when experimental flag is set
kegsay Apr 14, 2026
8a4fd52
Review comments
kegsay Apr 14, 2026
b1b7f3f
Review comments
kegsay Apr 15, 2026
bdfe367
Merge branch 'develop' into kegan/4242-csapi
kegsay Apr 15, 2026
49d392c
Merge branch 'develop' into kegan/4242-csapi
kegsay Apr 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/19424.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add experimental support for [MSC4242](https://github.com/matrix-org/matrix-spec-proposals/pull/4242): State DAGs. Excludes federation support.
151 changes: 150 additions & 1 deletion contrib/grafana/synapse.json
Original file line number Diff line number Diff line change
Expand Up @@ -6809,6 +6809,155 @@
],
"title": "Stale extremity dropping",
"type": "timeseries"
},
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"description": "For a given percentage P, the number X where P% of events were persisted to rooms with X state DAG forward extremities or fewer.",
"fieldConfig": {
"defaults": {
"links": []
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 50
},
"id": 181,
"options": {
"alertThreshold": true
},
"pluginVersion": "9.2.2",
"targets": [
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"expr": "histogram_quantile(0.5, rate(synapse_storage_msc4242_state_dag_forward_extremities_persisted_bucket{server_name=\"$server_name\"}[$bucket_size]) and on (instance, job, index) (synapse_storage_events_persisted_events_total > 0))",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "50%",
"refId": "A"
},
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"expr": "histogram_quantile(0.75, rate(synapse_storage_msc4242_state_dag_forward_extremities_persisted_bucket{server_name=\"$server_name\"}[$bucket_size]) and on (instance, job, index) (synapse_storage_events_persisted_events_total > 0))",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "75%",
"refId": "B"
},
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"expr": "histogram_quantile(0.90, rate(synapse_storage_msc4242_state_dag_forward_extremities_persisted_bucket{server_name=\"$server_name\"}[$bucket_size]) and on (instance, job, index) (synapse_storage_events_persisted_events_total > 0))",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "90%",
"refId": "C"
},
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"expr": "histogram_quantile(0.99, rate(synapse_storage_msc4242_state_dag_forward_extremities_persisted_bucket{server_name=\"$server_name\"}[$bucket_size]) and on (instance, job, index) (synapse_storage_events_persisted_events_total > 0))",
"format": "time_series",
"intervalFactor": 1,
"legendFormat": "99%",
"refId": "D"
}
],
"title": "Events persisted, by number of state DAG forward extremities in room (quantiles)",
"type": "timeseries"
},
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"description": "Colour reflects the number of events persisted to rooms with the given number of state DAG forward extremities, or fewer.",
"fieldConfig": {
"defaults": {
"custom": {
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"scaleDistribution": {
"type": "linear"
}
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 50
},
"id": 127,
"options": {
"calculate": false,
"calculation": {},
"cellGap": 1,
"cellValues": {},
"color": {
"exponent": 0.5,
"fill": "#5794F2",
"min": 0,
"mode": "opacity",
"reverse": false,
"scale": "exponential",
"scheme": "Oranges",
"steps": 128
},
"exemplars": {
"color": "rgba(255,0,255,0.7)"
},
"filterValues": {
"le": 1e-9
},
"legend": {
"show": true
},
"rowsFrame": {
"layout": "auto"
},
"showValue": "never",
"tooltip": {
"show": true,
"yHistogram": true
},
"yAxis": {
"axisPlacement": "left",
"decimals": 0,
"reverse": false,
"unit": "short"
}
},
"pluginVersion": "9.2.2",
"targets": [
{
"datasource": {
"uid": "${DS_PROMETHEUS}"
},
"expr": "rate(synapse_storage_msc4242_state_dag_forward_extremities_persisted_bucket{server_name=\"$server_name\"}[$bucket_size]) and on (instance, job, index) (synapse_storage_events_persisted_events_total > 0)",
"format": "heatmap",
"intervalFactor": 1,
"legendFormat": "{{le}}",
"refId": "A"
}
],
"title": "Events persisted, by number of state DAG forward extremities in room (heatmap)",
"type": "heatmap"
}
],
"title": "Extremities",
Expand Down Expand Up @@ -7711,4 +7860,4 @@
"uid": "000000012",
"version": 1,
"weekStart": ""
}
}
33 changes: 33 additions & 0 deletions rust/src/events/internal_metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ enum EventInternalMetadataData {
DelayId(Box<str>),
TokenId(i64),
DeviceId(Box<str>),
CalculatedAuthEventIDs(Vec<String>), // MSC4242: State DAGs
}

impl EventInternalMetadataData {
Expand Down Expand Up @@ -140,6 +141,10 @@ impl EventInternalMetadataData {
pyo3::intern!(py, "device_id"),
o.into_pyobject(py).unwrap_infallible().into_any(),
),
EventInternalMetadataData::CalculatedAuthEventIDs(o) => (
pyo3::intern!(py, "calculated_auth_event_ids"),
o.into_pyobject(py).unwrap().into_any(),
),
}
}

Expand Down Expand Up @@ -218,6 +223,11 @@ impl EventInternalMetadataData {
.map(String::into_boxed_str)
.with_context(|| format!("'{key_str}' has invalid type"))?,
),
"calculated_auth_event_ids" => EventInternalMetadataData::CalculatedAuthEventIDs(
value
.extract()
.with_context(|| format!("'{key_str}' has invalid type"))?,
),
_ => return Ok(None),
};

Expand Down Expand Up @@ -395,6 +405,10 @@ impl EventInternalMetadataInner {
get_property_opt!(self, DelayId).map(|s| s.deref())
}

pub fn get_calculated_auth_event_ids(&self) -> Option<&Vec<String>> {
get_property_opt!(self, CalculatedAuthEventIDs)
}

pub fn get_token_id(&self) -> Option<i64> {
get_property_opt!(self, TokenId).copied()
}
Expand Down Expand Up @@ -456,6 +470,10 @@ impl EventInternalMetadataInner {
pub fn set_device_id(&mut self, obj: String) {
set_property!(self, DeviceId, obj.into_boxed_str());
}

pub fn set_calculated_auth_event_ids(&mut self, obj: Vec<String>) {
set_property!(self, CalculatedAuthEventIDs, obj);
}
}

#[pyclass(frozen)]
Expand Down Expand Up @@ -722,6 +740,21 @@ impl EventInternalMetadata {
Ok(())
}

/// The calculated auth event IDs, if it was set when the event was created.
#[getter]
fn get_calculated_auth_event_ids(&self) -> PyResult<Vec<String>> {
let guard = self.read_inner()?;
attr_err(
guard.get_calculated_auth_event_ids().cloned(),
"calculated_auth_event_ids",
)
}
#[setter]
fn set_calculated_auth_event_ids(&self, obj: Vec<String>) -> PyResult<()> {
self.write_inner()?.set_calculated_auth_event_ids(obj);
Ok(())
}

/// The delay ID, set only if the event was a delayed event.
#[getter]
fn get_delay_id(&self) -> PyResult<String> {
Expand Down
Loading
Loading