Repository navigation
Sprite storage wedges while VM stays running: all disk I/O hangs, exec unusable, /checkpoints and /services hang forever — twice in 8 days #230
Description
Symptom
A sprite's disk I/O wedges permanently below the filesystem while the VM stays running. Everything that touches the overlay hangs forever; the supervisor keeps answering HTTP and refreshing its lease, so from the outside the sprite looks healthy while being completely unusable. The only remedy we have found is sprite destroy, i.e. total loss of the disk.
This has now happened twice in 8 days to the same workload, on two different sprites with different volumes:
- 2026-08-24 (supervisor 0.0.1-rc47), org
junchao-yan, region sjc. Resolved bysprite destroyat ~14:20 UTC. - 2026-09-01 (supervisor 0.0.1-rc48), org
junchao-yan, spritebuzz-agent-276883e88d5a, idsprite-1a3bd078-3c45-4637-8b95-dc320b271ebd, created 2026-08-27. Wedge onset between 13:05 and 17:33 UTC. This sprite is in the wedged state right now — tell us if you want it preserved for inspection, otherwise we will destroy it to restore service.
Observed state (both occurrences)
GET /v1/sprites/{name}→ status steadyrunning(no cold/warm flapping); lease refreshes succeed on schedule (refreshCountadvancing).GET /v1/sprites/{name}/exec(session list) answers instantly.GET /v1/sprites/{name}/checkpointsandGET /v1/sprites/{name}/serviceshang forever (0 bytes, >25 s, repeatable).- Supervisor
/logsshows each incoming exec request and then nothing — no session start, no error, no container event.
Exec behavior differed by page-cache warmth:
- 08-24 (VM up ~8 h, cache warm): exec sessions were created,
bashspawned, builtins worked — but any command touching a cold file entered uninterruptible D-state, immune to the supervisor's SIGTERM→SIGKILL. Evencatof a tiny file never returned. ~27 zombie exec sessions accumulated from client retries. - 09-01 (VM re-entered running at 17:33 UTC, cache cold): even
bashcannot spawn — no exec session is created at all; the client getsError: connection closedafter ~45 s (gateway timeout). SDK callers see their own budgets expire (exec did not finish within 30s).
Storage-layer evidence from sibling sprites, same org
- A sibling sprite logged a burst of JuiceFS staging errors during its suspend flush (2026-08-27 02:57 UTC):
Open staging file /dev/fly_vol/juicefs/cache/<uuid>/rawstaging/chunks/0/57/…: invalid file size 0, data length <N>(cached_store.go:1038,uploadStagingFile) — dozens of chunks, each with a zero-length staging file that should have held data. - A third incident on 2026-08-22 (different sprite, same org) was overlay corruption presenting as a container crash-loop:
dumpe2fson the preserved snapshot showed first error__ext4_find_entry err=EIO(a failed read from the loop image) followed by 75EFSBADCRCdirectory-checksum errors — storage failing under the filesystem.
Workload correlate (possible repro direction)
The affected agent workload is fsync-heavy small writes: a coding-agent CLI journaling continuously to a SQLite database on the overlay (measured ~10k rows / 5.5 min), plus frequent suspend/resume cycles (~15 auto-checkpoints/day), each running the checkpoint-clone + staging-flush path. The wedge has followed this workload across two different sprites/volumes; sibling sprites without the SQLite churn have not wedged. This looks adjacent to #229 (sustained heavy I/O → overlay unmount + SIGKILL) but the failure mode here is a silent permanent hang, not a kill.
What we need
- Root cause on the staging/overlay write path (
rawstagingchunks withinvalid file size 0looks like the smoking gun). - Detection: a sprite in this state reports
runningand holds its lease, so nothing platform-side notices it is dead. - A disk-preserving recovery path — filed separately as a companion issue, since today the only exit is
destroy.
Activity
yjc801 commentedon Sep 1, 2026
Update: we needed the agent back, so the wedged sprite (
buzz-agent-276883e88d5a,sprite-1a3bd078-3c45-4637-8b95-dc320b271ebd) has now been destroyed — it is no longer available for live inspection. The observed-state details and timestamps above are all we have; happy to run diagnostics on a future occurrence before destroying if you tell us what you'd want captured.yjc801 commentedon Sep 2, 2026
Another occurrence, same org (
junchao-yan), different sprite:buzz-agent-143bd5c0ffcf(sprite-b0c63a69-9955-4ee6-9f75-a454bf065cec), created 2026-08-24 14:20Z.sprite execat 2026-09-02 05:16:21Z resumed it, and it came up already wedged: status stayedrunningfor over an hour, noexecever returned (30 s time-boxed attempts, repeatedly), and the supervisor/logswere 100 consecutiveERROR Open staging file /dev/fly_vol/juicefs/cache/<id>/rawstaging/chunks/…entries at 05:29Z./checkpointsstill answered in ~1 s (listed a fresh auto checkpoint stamped at the resume time) and/execlisted one stale session; only new execs and the filesystem were dead.So that's two wedges in this org in two days (the other being
buzz-agent-276883e88d5aabove), both surfacing on resume-from-suspend. Happy to provide more detail if it helps.