atagen

macltok

public
Star0
Watch0

Commit aced11e80b47

tarball

atagen <boss@atagen.co>2026-10-27 00:42 UTC

3 files changed+46-19
room: probe an open room for events a non-limited sync skipped

A device build lost two remote messages for good while Cinny and FluffyChat on classic /sync showed them, which fits tuwunel's simplified sliding sync under-reporting limited. An open room now asks the fork (dc40ad30) to look behind the newest dropped sync token on open and every 30s. That is one /messages page only when such a token was recorded, nothing otherwise.
Modified file: Cargo.lock+10 additions−10 deletions
@@ -2217,7 +2217,7 @@ dependencies = [
22172217 [[package]]
22182218 name = "matrix-sdk"
22192219 version = "0.18.0"
2220-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2220+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
22212221 dependencies = [
22222222 "anymap2",
22232223 "aquamarine",
@@ -2280,7 +2280,7 @@ dependencies = [
22802280 [[package]]
22812281 name = "matrix-sdk-base"
22822282 version = "0.18.0"
2283-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2283+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
22842284 dependencies = [
22852285 "as_variant",
22862286 "assert_matches",
@@ -2310,7 +2310,7 @@ dependencies = [
23102310 [[package]]
23112311 name = "matrix-sdk-common"
23122312 version = "0.18.0"
2313-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2313+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
23142314 dependencies = [
23152315 "eyeball-im",
23162316 "futures-core",
@@ -2333,7 +2333,7 @@ dependencies = [
23332333 [[package]]
23342334 name = "matrix-sdk-crypto"
23352335 version = "0.18.0"
2336-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2336+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
23372337 dependencies = [
23382338 "aes",
23392339 "aquamarine",
@@ -2374,7 +2374,7 @@ dependencies = [
23742374 [[package]]
23752375 name = "matrix-sdk-indexeddb"
23762376 version = "0.18.0"
2377-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2377+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
23782378 dependencies = [
23792379 "async-trait",
23802380 "base64",
@@ -2406,7 +2406,7 @@ dependencies = [
24062406 [[package]]
24072407 name = "matrix-sdk-sqlite"
24082408 version = "0.18.0"
2409-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2409+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
24102410 dependencies = [
24112411 "as_variant",
24122412 "async-trait",
@@ -2433,7 +2433,7 @@ dependencies = [
24332433 [[package]]
24342434 name = "matrix-sdk-store-encryption"
24352435 version = "0.18.0"
2436-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2436+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
24372437 dependencies = [
24382438 "base64",
24392439 "blake3",
@@ -2454,7 +2454,7 @@ dependencies = [
24542454 [[package]]
24552455 name = "matrix-sdk-test"
24562456 version = "0.18.0"
2457-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2457+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
24582458 dependencies = [
24592459 "as_variant",
24602460 "ctor",
@@ -2477,7 +2477,7 @@ dependencies = [
24772477 [[package]]
24782478 name = "matrix-sdk-test-macros"
24792479 version = "0.18.0"
2480-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2480+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
24812481 dependencies = [
24822482 "quote",
24832483 "syn 2.0.119",
@@ -2486,7 +2486,7 @@ dependencies = [
24862486 [[package]]
24872487 name = "matrix-sdk-ui"
24882488 version = "0.18.0"
2489-source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=f4492538e13dc0ca0a16717a962416a796415fb5#f4492538e13dc0ca0a16717a962416a796415fb5"
2489+source = "git+ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk?rev=dc40ad30111d649def7f985305d30beba96aa3be#dc40ad30111d649def7f985305d30beba96aa3be"
24902490 dependencies = [
24912491 "as_variant",
24922492 "async-rx",
Modified file: Cargo.toml+9 additions−9 deletions
@@ -26,11 +26,11 @@ indexeddb = [
2626 futures-util = { version = "0.3.31", default-features = false, features = ["std"] }
2727 http = "1"
2828 imbl = { version = "6.1.0", default-features = false }
29-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false, features = ["e2e-encryption"] }
30-matrix-sdk-base = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false }
31-matrix-sdk-crypto = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false }
32-matrix-sdk-store-encryption = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", optional = true }
33-matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false }
29+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false, features = ["e2e-encryption"] }
30+matrix-sdk-base = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false }
31+matrix-sdk-crypto = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false }
32+matrix-sdk-store-encryption = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", optional = true }
33+matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false }
3434 ruma = { version = "0.16.0", default-features = false, features = ["unstable-msc2545", "unstable-msc4095"] }
3535 serde = { version = "1.0.219", features = ["derive", "rc"], optional = true }
3636 serde_json = { version = "1.0.143", features = ["raw_value"] }
@@ -54,8 +54,8 @@ js-sys = { version = "0.3.105", optional = true }
5454 # tantivy 0.26's merger reads Instant::now() whenever debug logging is on, and that panics in
5555 # wasm. both caps, since a release_max_level a host sets would otherwise win in release
5656 log = { version = "0.4.29", features = ["max_level_info", "release_max_level_info"] }
57-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false, features = ["js"] }
58-matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false, features = ["js"] }
57+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false, features = ["js"] }
58+matrix-sdk-ui = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false, features = ["js"] }
5959 # the sdk's own wasm reqwest leaves out stream, which the bounded media download needs
6060 reqwest = { version = "0.13.1", default-features = false, features = ["stream"] }
6161 uuid = { version = "1", features = ["js"] }
@@ -73,8 +73,8 @@ web-sys = { version = "0.3.105", optional = true, features = [
7373 tokio = { version = "1.47.1", features = ["rt"] }
7474
7575 [target.'cfg(not(target_family = "wasm"))'.dev-dependencies]
76-matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5", default-features = false, features = ["testing"] }
77-matrix-sdk-test = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "f4492538e13dc0ca0a16717a962416a796415fb5" }
76+matrix-sdk = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be", default-features = false, features = ["testing"] }
77+matrix-sdk-test = { git = "ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk", rev = "dc40ad30111d649def7f985305d30beba96aa3be" }
7878 tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "signal", "time"] }
7979 wiremock = "0.6.5"
8080
Modified file: src/engine/room.rs+27 additions
@@ -223,8 +223,14 @@ impl RoomActor {
223223 if matches!(self.room.state(), RoomState::Left | RoomState::Banned) {
224224 return None;
225225 }
226+ timelines.work.spawn(probe_sync_hole(self.room.clone()));
227+ let mut probe = Box::pin(matrix_sdk::sleep::sleep(PROBE_INTERVAL));
226228 loop {
227229 tokio::select! {
230+ () = &mut probe => {
231+ timelines.work.spawn(probe_sync_hole(self.room.clone()));
232+ probe = Box::pin(matrix_sdk::sleep::sleep(PROBE_INTERVAL));
233+ }
228234 Some(info) = room_info.next() => {
229235 if matches!(info.state(), RoomState::Left | RoomState::Banned) {
230236 tracing::debug!(room_id = %self.room_id, "room actor stopped because we left the room");
@@ -277,6 +283,27 @@ impl RoomActor {
277283 }
278284 }
279285
286+/// a server that under-reports `limited` hides skipped events behind a sync token the sdk drops,
287+/// so an open room looks behind the newest one now and then. without one recorded it costs nothing
288+const PROBE_INTERVAL: std::time::Duration = std::time::Duration::from_secs(30);
289+
290+async fn probe_sync_hole(room: Room) {
291+ let result = async {
292+ let (cache, _handles) = room.event_cache().await?;
293+ cache.probe_sync_hole().await
294+ }
295+ .await;
296+ match result {
297+ Ok(Some(found)) if found > 0 => {
298+ tracing::info!(room_id = %room.room_id(), found, "history gap probe: new events");
299+ }
300+ Ok(_) => {}
301+ Err(error) => {
302+ tracing::debug!(room_id = %room.room_id(), %error, "history gap probe failed")
303+ }
304+ }
305+}
306+
280307 async fn build_timeline(
281308 room: &Room,
282309 focus: TimelineFocus,