Repository navigation
Open
Description
Windows that the audit behind #420-#432 found, measured or reasoned through, and left without a mechanism. Each one is bounded and each is loud or converges on its own. They are recorded here so nobody has to find them again, and each has the evidence that would reopen it.
Warm pool
| Window | What happens | Size | Reopen when |
|---|---|---|---|
| A warm VM dies before its eviction | A claim gets the dead VM: 200, then 502 on its first call, then recovery cold-restarts it and its memory is gone. docs/deploy.md states this |
With the cocoon event stream, about 0.15-0.2 s. Without it, a median of 4.4 s and up to 10 s | Warm VMs die often enough for these claims to show up in the 502 rate |
Between the warm pop and addClaimLocked |
A VM dying here is not seen by the eviction. With volumes or env, the guest call fails the claim | Microseconds with neither | The same |
onVMSync ordering |
A warm VM claimed between the claims scan and the warm scan is in neither list. The next event or poll catches it | Two statements, only when the stream opens | A VM stays stale past one poll |
Goldens
| Window | What happens | Size | Reopen when |
|---|---|---|---|
| A golden that cannot clone | Claims with no warm VM answer 500 until 8 clones have failed in a row. The golden then retires, claims cold-boot, and the rebuild restores the clone tier | One run after a rollback, warm 0, a claim every 0.5 s: claims 1-8 answered 500 in 0.13-0.15 s, then retirement, 2 cold claims at about 0.6 s, and the clone tier from +7.25 s | A rollout needs no failed claims during a hypervisor switch |
| A healthy golden retires | A node fault that is not a capacity failure can count as 8 clone failures. The cost is one rebuild, at most once per pool per 30 s, with no overlapping builds | The rebuilt golden was ready about 1.7 s after retirement in that run | Retirements show up without a golden fault |
exportGolden replaces a directory under a clone |
os.RemoveAll(final) can race a clone still reading the retired golden, and that clone fails with a 500 |
One claim per in-flight clone, only at a rebuild | These errors appear in the clone-failure log |
Failover and templates
| Window | What happens | Size | Reopen when |
|---|---|---|---|
| An env write during an archive | A write between the row write and the claim taking its checkpoint id reaches the journal but not the row (#422) | Milliseconds. It needs a node loss before the next write | A rotation must survive failover with no retry by the caller |
| Two re-promotes of one template | They serialize at the commit, and the later commit wins. "Later" is the order their prepares finish, not the order they started (#430) | Only two concurrent promotes of one template | A caller depends on the request order |
pool is being reorganized in #419, and that work keeps every behaviour above.
Metadata
Metadata
Assignees
Labels
No labels
Activity
CMGS commentedon Nov 4, 2026
Update after #436, #437 and #438.
Closed: "An env write during an archive". #437 rewrites the row when a write lands while the archive intent is set (
TestAnEnvWriteDuringTheArchiveReachesItsRow).Added, same format:
sandboxdrestart during a hibernate dumpsandboxddoes not adopt that snapshotsandboxdduring a dump does not listen yetrefill_concurrencyslotmax_runningslots are first comeClosereturns nil after a 404 whenLookupfinds no owner, so the claim lasts to its deadline, or to its retention once archivedarchive_delete_after_secondsis 0Follow-up tied to cocoon: once cocoon's capture cancel ships (cocoon #297, merged, not released), a canceled capture waits for the resume for up to 10 minutes.
dumpTermGrace(3 minutes) must then exceed that, or SIGKILL lands first. v0.1.22 does not include this.The moves in #438 kept every behaviour above.
CMGS commentedon Nov 5, 2026
Update after #455 (merged 14b4692). Windows that the post-#447 audit found and kept without a mechanism, in the same format:
vm inspectkeeps failingstarteduntil a node's hourly sweep deletes it; a new move of that claim overwrites astartedrecordclaims.jsonunwritable for over an hour during a moveCMGS commentedon Nov 6, 2026
Windows the static audit of 2026-11-06 (PR #481) reasoned through and left without a mechanism. Each is bounded and loud or self-converging.
503 tenant store down; retryto uncached tenantsAssignwhose reply is lost after commitsendQueuesenddrops during the stop draintun_downreaches the guest; its tun0 carries nothingrewriteArchiveRowafter two refused replacesclearArchiveIntentafter a failed commitCMGS commentedon Nov 6, 2026
Update after #482 (merged 72770b5), which changes one row and adds three windows it kept without a mechanism.
Changed: "
max_runningslots are first come". Witharchive_failover, the wake of an archived claim thatmax_runningordisk_reserverefuses now moves to a peer with room. The owner answers 404, and the client'sLookupfinds the adopter. A hibernated claim, or any claim on a node withoutarchive_failover, still answers 429 with no queue and no reservation. The reopen trigger is unchanged.Added, same format:
Lookupround tripThe gossiped room flag that would replace the quiet period was ruled out on 2026-11-06: the claim redirect already skips peers that are full on
max_running, so the flag would have one user.