element-hq / element-hq/synapse

Incorrect member count in room summary after accepting invite

Open
#19,865 0 comments 6 reactions 0 assignees View on GitHub
A-Room-Summary
Dominant language
Python
Stars
4.6k
Forks
600
Avg merge
5d 22h
Merged PRs (30d)
51

Description

### Description

The `m.joined_member_count` can be wrong right after accepting an invite. It is easy to reproduce and this only fixes itself after someone sends a new member event.

### Steps to reproduce

You need two users.

- User A creates a group chat and invites User B
- User B receives an invite in sync (only with invite state, there is no member count yet)
- User B accepts the invite
- User B receives a new sync with the same room in `join` where `m.joined_member_count` is 1
- User A instead receives a new sync with the room in `join` where `m.joined_member_count` is 2

So User A and User B have a different member count in the same room (while the count from User A is correct and User B is wrong!)

### Homeserver

janian.de

### Synapse Version

1.154.0

### Installation Method

Docker (matrixdotorg/synapse)

### Database

PostgreSQL

### Workers

Single process

### Platform

Ubuntu 24.04 Hetzner VM

### Configuration

_No response_

### Relevant log output

From the sync response right after accepting an invite (Member count is 1 but should be 2):

```shell

{
"rooms": {
"join": {
"!TXwfEcXzNXVbqihCrt:janian.de": {
"timeline": {
"events": [
{
"content": {
"avatar_url": "mxc://famedly.de/pTTETNZXJlBHiSSdShaSOvPq",
"displayname": "Christian Kußowski",
"membership": "join"
},
"origin_server_ts": 1781763356972,
"sender": "@krille:famedly.de",
"state_key": "@krille:famedly.de",
"type": "m.room.member",
"unsigned": {
"replaces_state": "$VEasxWNw7pX9Zh_UZchrGSGL8hHGhY40HxvTXQQ4x7k",
"prev_content": {
"avatar_url": "mxc://famedly.de/pTTETNZXJlBHiSSdShaSOvPq",
"displayname": "Christian Kußowski",
"membership": "invite"
},
"prev_sender": "@cat:janian.de",
"membership": "join"
},
"event_id": "$mb83ei8-ah5YNiAYEtdsLKGCrZBzdyqZ34ZB6WcXYJc"
}
],
"prev_batch": "s5199023_190618437_999_28960045_6144102_183464_7110526_18091553_0_1033_2_1_1",
"limited": true
},
"state": {
"events": [
{
"type": "m.room.history_visibility",
"sender": "@cat:janian.de",
"content": {
"history_visibility": "shared"
},
"state_key": "",
"origin_server_ts": 1781763344632,
"unsigned": {},
"event_id": "$GgB85SN_WJTHxV4msRsxeupMlCxrGigjs53Gzg-3i8k"
},
{
"type": "m.room.encryption",
"sender": "@cat:janian.de",
"content": {
"algorithm": "m.megolm.v1.aes-sha2"
},
"state_key": "",
"origin_server_ts": 1781763344633,
"unsigned": {},
"event_id": "$YAMCEUCngc84gHTvxM0dQH9YDalglZOD8rU-nhs5gmM"
},
{
"type": "m.room.join_rules",
"sender": "@cat:janian.de",
"content": {
"join_rule": "invite"
},
"state_key": "",
"origin_server_ts": 1781763344632,
"unsigned": {},
"event_id": "$l0nPGq9twUXqVynd5Kv9dyMhNimwc22NMAry0sOGbhc"
},
{
"type": "m.room.power_levels",
"sender": "@cat:janian.de",
"content": {
"ban": 50,
"events": {
"m.room.avatar": 50,
"m.room.canonical_alias": 50,
"m.room.encryption": 100,
"m.room.history_visibility": 100,
"m.room.name": 50,
"m.room.power_levels": 100,
"m.room.server_acl": 100,
"m.room.tombstone": 100
},
"events_default": 0,
"historical": 100,
"invite": 0,
"kick": 50,
"redact": 50,
"state_default": 50,
"users": {
"@cat:janian.de": 100
},
"users_default": 0
},
"state_key": "",
"origin_server_ts": 1781763344618,
"unsigned": {},
"event_id": "$NtwPRef5N7zqE-JWRmFwUTV-igJzcLK1e3QrdnylIA4"
},
{
"type": "m.room.guest_access",
"sender": "@cat:janian.de",
"content": {
"guest_access": "can_join"
},
"state_key": "",
"origin_server_ts": 1781763344633,
"unsigned": {},
"event_id": "$UEkb5zcicI87wpthaOZHlmidk7X4_xYIKwq-tFXDM0Y"
},
{
"type": "m.room.create",
"sender": "@cat:janian.de",
"content": {
"creator": "@cat:janian.de",
"room_version": "10"
},
"state_key": "",
"origin_server_ts": 1781763344506,
"unsigned": {},
"event_id": "$X9P8dibAhC8_b37uf1_bh2PeP_Uc471-micSBzkmM-s"
},
{
"type": "m.room.name",
"sender": "@cat:janian.de",
"content": {
"name": "membercount"
},
"state_key": "",
"origin_server_ts": 1781763344634,
"unsigned": {},
"event_id": "$4fH1b6Evle2smauXn2VjrmXC0Ix_pMJF7nvlxqBUJxY"
},
{
"content": {
"avatar_url": "mxc://famedly.de/pTTETNZXJlBHiSSdShaSOvPq",
"displayname": "Christian Kußowski",
"membership": "invite"
},
"origin_server_ts": 1781763352036,
"sender": "@cat:janian.de",
"state_key": "@krille:famedly.de",
"type": "m.room.member",
"unsigned": {},
"event_id": "$VEasxWNw7pX9Zh_UZchrGSGL8hHGhY40HxvTXQQ4x7k"
}
]
},
"account_data": {
"events": []
},
"ephemeral": {
"events": []
},
"unread_notifications": {
"notification_count": 0,
"highlight_count": 0
},
"summary": {
"m.joined_member_count": 1,
"m.invited_member_count": 0
}
}
}
}
}
```

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

_No response_

Contributor guide

Open the contributing guide

Research direction

Reproduce the two-user invite and acceptance flow, then inspect the sync response handling for the room's m.joined_member_count after the invitee joins. Compare the invitee's join sync with the inviter's response and verify that both report 2 immediately, without requiring a later member event.

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
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.