gtauri: fix deep-scroll stall + instant viewer
Root causes found via per-event tracing (trace.log) + heartbeats:
1. Decode backlog: single worker at ~300ms/photo could not keep up with
fast long scrolls — phone session ended with a 2400-deep queue
draining at ~3 cells/s (13+ min to catch up). That was the
'scroll far down and nothing loads no matter how long I wait' zone.
- 4 parallel decode workers (~12 photos/s)
- viewport-aware stale drops: prefetch jobs more than 60 rows behind
the viewport are dropped, not decoded (fleeing leaves no backlog)
- Q_CAP bounds the queue; JS 1.5s safety net re-requests
- queue peak in repro test: 42 (was 2405); all 850 decodable
emulator images now load (708 before)
2. Stale-anchor bug: sendAnchor was leading-edge throttled with no
trailing call — if a scroll ended inside the 150ms window the Rust
anchor stayed stale forever, and the worker then dropped fresh
URGENT jobs (tap → full read) as 'off-screen'. Fix: trailing
anchor send; and URGENT jobs are never stale-dropped (only
prefetch work is droppable).
3. Viewer latency: full-res read ran on Chromium's main thread
(wry shouldInterceptRequest is synchronous) — 30-50MB flash read
froze the whole WebView. Now: thumb shown instantly (mem cache,
~1ms), full read queued urgent and done off-main; full-ready event
swaps in the full-res (256MB full-res LRU makes re-opens instant).
Measured click→full-res: 4ms on emulator.
4. Scan: skip OS junk (._* AppleDouble forks, dotfiles) — the phone's
DCIM carried 72 of them, rendering as permanent gray cells.
5. Viewer for a corrupt file now shows 'image unavailable' instead of
'loading…' forever; grid retry timers skip far-off-screen cells.
41
harnesses/gtauri/Cargo.lock
generated
|
|
@ -346,6 +346,12 @@ dependencies = [
|
|||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "color_quant"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||
|
||||
[[package]]
|
||||
name = "combine"
|
||||
version = "4.6.9"
|
||||
|
|
@ -1095,6 +1101,16 @@ dependencies = [
|
|||
"r-efi 6.0.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gif"
|
||||
version = "0.14.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159"
|
||||
dependencies = [
|
||||
"color_quant",
|
||||
"weezl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gio"
|
||||
version = "0.18.4"
|
||||
|
|
@ -1556,11 +1572,24 @@ checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104"
|
|||
dependencies = [
|
||||
"bytemuck",
|
||||
"byteorder-lite",
|
||||
"color_quant",
|
||||
"gif",
|
||||
"image-webp",
|
||||
"moxcms",
|
||||
"num-traits",
|
||||
"png",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "image-webp"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3"
|
||||
dependencies = [
|
||||
"byteorder-lite",
|
||||
"quick-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.3"
|
||||
|
|
@ -2498,6 +2527,12 @@ version = "0.1.30"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea"
|
||||
|
||||
[[package]]
|
||||
name = "quick-error"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.42.0"
|
||||
|
|
@ -4104,6 +4139,12 @@ dependencies = [
|
|||
"windows-core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "weezl"
|
||||
version = "0.1.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
|
|
|
|||
|
|
@ -24,4 +24,4 @@ rusqlite = { version = "0.41", features = ["bundled"] }
|
|||
turbojpeg = { version = "1.5.1", features = ["cmake"] }
|
||||
kamadak-exif = "0.6"
|
||||
sha1 = "0.11"
|
||||
image = { version = "0.25", default-features = false, features = ["png"] }
|
||||
image = { version = "0.25", default-features = false, features = ["png", "webp", "gif"] }
|
||||
|
|
|
|||
BIN
harnesses/gtauri/frontend/dist/img/000.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/001.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/002.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/003.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/004.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/005.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/006.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/007.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/008.jpg
vendored
|
Before Width: | Height: | Size: 15 KiB |
BIN
harnesses/gtauri/frontend/dist/img/009.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/010.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/011.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/012.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/013.jpg
vendored
|
Before Width: | Height: | Size: 15 KiB |
BIN
harnesses/gtauri/frontend/dist/img/014.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/015.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/016.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/017.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/018.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/019.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/020.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/021.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/022.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/023.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/024.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/025.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/026.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/027.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/028.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/029.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/030.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/031.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/032.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/033.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/034.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/035.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/036.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/037.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/038.jpg
vendored
|
Before Width: | Height: | Size: 15 KiB |
BIN
harnesses/gtauri/frontend/dist/img/039.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/040.jpg
vendored
|
Before Width: | Height: | Size: 15 KiB |
BIN
harnesses/gtauri/frontend/dist/img/041.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/042.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/043.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/044.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/045.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/046.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/047.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/048.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/049.jpg
vendored
|
Before Width: | Height: | Size: 21 KiB |
BIN
harnesses/gtauri/frontend/dist/img/050.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/051.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/052.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/053.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/054.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/055.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/056.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/057.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/058.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/059.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/060.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/061.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/062.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/063.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/064.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/065.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/066.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/067.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/068.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/069.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/070.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/071.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/072.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/073.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/074.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/075.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/076.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/077.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/078.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/079.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/080.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/081.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/082.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/083.jpg
vendored
|
Before Width: | Height: | Size: 19 KiB |
BIN
harnesses/gtauri/frontend/dist/img/084.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/085.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/086.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/087.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/088.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/089.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/090.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/091.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/092.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/093.jpg
vendored
|
Before Width: | Height: | Size: 16 KiB |
BIN
harnesses/gtauri/frontend/dist/img/094.jpg
vendored
|
Before Width: | Height: | Size: 17 KiB |
BIN
harnesses/gtauri/frontend/dist/img/095.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |
BIN
harnesses/gtauri/frontend/dist/img/096.jpg
vendored
|
Before Width: | Height: | Size: 20 KiB |
BIN
harnesses/gtauri/frontend/dist/img/097.jpg
vendored
|
Before Width: | Height: | Size: 18 KiB |