From 8c720e54278321438ce7cc78d4aa04cdb4f3518e Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Wed, 4 Nov 2026 13:53:55 +0100 Subject: [PATCH] fix: Store to-device messages before syncs can read their count --- changelog.d/+to-device-count-race.bugfix.md | 1 + src/service/users/device.rs | 24 +++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 changelog.d/+to-device-count-race.bugfix.md diff --git a/changelog.d/+to-device-count-race.bugfix.md b/changelog.d/+to-device-count-race.bugfix.md new file mode 100644 index 000000000..57b847f00 --- /dev/null +++ b/changelog.d/+to-device-count-race.bugfix.md @@ -0,0 +1 @@ +Fix to-device messages, including room keys, sometimes being lost before delivery. Contributed by @eleboucher. diff --git a/src/service/users/device.rs b/src/service/users/device.rs index 6933ea715..be666d7ca 100644 --- a/src/service/users/device.rs +++ b/src/service/users/device.rs @@ -216,17 +216,19 @@ impl super::Service { event_type: &str, content: serde_json::Value, ) { - let count = self.services.globals.next_count().unwrap(); - - let key = (target_user_id, target_device_id, count); - self.db.todeviceid_events.put( - key, - Json(json!({ - "type": event_type, - "sender": sender, - "content": content, - })), - ); + let event = Json(json!({ + "type": event_type, + "sender": sender, + "content": content, + })); + self.services + .globals + .next_count_with(|count| { + self.db + .todeviceid_events + .put((target_user_id, target_device_id, count), event); + }) + .unwrap(); self.services.sync.wake(target_user_id).await; }