element-hq / element-hq/synapse

Leave event missing from state_after

Open
#18,793 6 comments 4 reactions 0 assignees View on GitHub
A-Leave A-Sync
Dominant language
Python
Stars
4.6k
Forks
600
Avg merge
5d 22h
Merged PRs (30d)
51

Description

### Description

When a client leaves a room on a homeserver where https://github.com/matrix-org/matrix-spec-proposals/pull/4222 is enabled, the leave event doesn't appear in the `state_after` (or `org.matrix.msc4222.state_after`). I believe it should do because `state_after` should duplicate all state events from the timeline section that apply at the end of the point the sync covers.

Response from `beta.matrix.org` (with MSC4222 enabled):
```
"leave": {
"!CdHcMUhjzlGJQr299cjiQZgJNFdQtmAUJlIamKQ7pvg": {
"timeline": {
"events": [
{
"type": "m.room.member",
"sender": "@davetest:beta.matrix.org",
"content": {
"membership": "leave"
},
"state_key": "@davetest:beta.matrix.org",
"origin_server_ts": 1754658410215,
"unsigned": {
"replaces_state": "$gORoiLnG_h2mWrKoW4jhjvvXGFj39ReLdV-fq4w4bOc",
"prev_content": {
"displayname": "dave test",
"membership": "join"
},
"prev_sender": "@davetest:beta.matrix.org",
"membership": "leave",
"age": 120
},
"event_id": "$WseXqR8u9P9M2tpf7wahk_QmEp1ogJexRLL41HS5iAs"
}
],
"prev_batch": "s4436051_1_9238_3990099_16270_238_38684_2677914_0_340",
"limited": false
},
"org.matrix.msc4222.state_after": {
"events": []
},
"account_data": {
"events": []
}
}
}
```
Note that the leave event is in the `timeline` section but not in `state_after`.

From `matrix.org` (without MSC4222):
```
"leave": {
"!QnwqAqEkZlreqGleJe:matrix.org": {
"timeline": {
"events": [
{
"content": {
"membership": "leave"
},
"origin_server_ts": 1754658946055,
"sender": "@dave:matrix.org",
"state_key": "@dave:matrix.org",
"type": "m.room.member",
"unsigned": {
"replaces_state": "$xDKAUL61qiMbA6-5ABYRuHEqy5UhCUfrhZk0xTDjzS8",
"prev_content": {
"avatar_url": "mxc://matrix.org/IssHdyiXMcSnRCxCzqoaocGL",
"displayname": "Dave",
"membership": "join"
},
"prev_sender": "@dave:matrix.org",
"membership": "leave",
"age": 1724
},
"event_id": "$H456wIzEatLxS5chZ7aN72E-JkN0XCuQq9bb1XlqLHE"
}
],
"prev_batch": "s6158096937_757284974_4199159_m3882099430~39.3882099443~72.3882099441~38.3882099445_4412080234_266497694_1516505502_11171079150_0_521298",
"limited": false
},
"state": {
"events": [
{
"content": {
"membership": "leave"
},
"origin_server_ts": 1754658946055,
"sender": "@dave:matrix.org",
"state_key": "@dave:matrix.org",
"type": "m.room.member",
"unsigned": {
"replaces_state": "$xDKAUL61qiMbA6-5ABYRuHEqy5UhCUfrhZk0xTDjzS8",
"prev_content": {
"avatar_url": "mxc://matrix.org/IssHdyiXMcSnRCxCzqoaocGL",
"displayname": "Dave",
"membership": "join"
},
"prev_sender": "@dave:matrix.org",
"age": 1724
},
"event_id": "$H456wIzEatLxS5chZ7aN72E-JkN0XCuQq9bb1XlqLHE"
}
]
},
"account_data": {
"events": []
}
}
}
```
...which is also somewhat odd in that I wouldn't expect the leave event to be in the `state` block because in non-msc4222 mode, state events in the timeline block are added to state and don't need to be duplicated, so that's fun. It's not really what this bug is about, but included for context nonetheless.

This causes rooms to not appear as if the user has left them on clients when using MSC4222.

### Steps to reproduce

- Enable MSC4222 in synapse and find a client that supports it (or sync using `org.matrix.msc4222.use_state_after=true`)
- Leave a room

### Homeserver

beta.matrix.org

### Synapse Version

1.134.0

### Installation Method

I don't know

### Database

Unknown

### Workers

I don't know

### Platform

EMS?

### Configuration

_No response_

### Relevant log output

```shell
None
```

### Anything else that would be useful to know?

_No response_

Contributor guide

Open the contributing guide

Research direction

Start by tracing Synapse's sync response generation for leave rooms and the MSC4222 `state_after` handling, using the supplied beta.matrix.org response as the reproduction. Compare the timeline event with the resulting `state_after` events, then verify that a client using `org.matrix.msc4222.use_state_after=true` sees the room as left.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.