Runner recycle misses two consumers: stranded docker-lib PVC and an unlabelled discord-ops runner #868
Labels
No labels
burndown-2026-06
burndown-2026-08
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/advocate
role/director
role/exec
role/frontend
role/gamedev
role/human
role/platform
role/qa
role/science
role/sysadmin
state
ambient
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/infrastructure#868
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found while relieving a live disk emergency on kai-server at 2026-08-19T05:17Z, where kubelet was reporting
ImageGCFailedand could not free the 27.7 GB it wanted.deploy/forgejo-runner-recycle.ymlselects oncoilyco.io/runner-scratch=recycle. Two scratch consumers sit outside that selector, for two different reasons.1.
docker-lib-forgejo-runner-build-0is stranded, 6.95 GBforgejo-runner-buildisspec.replicas: 0and still declares adocker-libvolumeClaimTemplate. The PVC survives at roughly 6.95 GB with no pod bound to it.This is not label drift. Adding the recycle label would change nothing, because the recycle action is
rollout restartand there is no pod to restart. The scratch is only wiped on pod start, so a scaled-to-zero runner holds its cache indefinitely.Either the runner is retired, in which case the PVC should go with it, or it is dormant and expected to return, in which case the cache is stale anyway. Deleting the PVC is destructive and irreversible, so it wants an attended operator and a current backup, not a nightly job.
2.
forgejo-runner-deploy-sirens-discord-opsis genuinely unlabelledspec.replicas: 1, running adindsidecar, nocoilyco.io/runner-scratchlabel. Its emptyDir scratch has never been recycled. Its pod had been up since 2026-08-19T01:16Z and survived the manual sweep for that reason.The manifest header says scoped overlays inherit the label through
nameSuffix, so this one appears to have been built off a path that does not. Worth checking whether the overlay is the odd one out or whether the inheritance claim is weaker than the comment states.forgejo-runner-tap-writer-scopedis also unlabelled and that is correct: it mounts no scratch, exactly as the header documents.Evidence
Filesystem before and after a manual sweep of the labelled set: 84.74 percent used with 1.31 GB to the critical threshold, then 77.56 percent used with 38.30 GB to critical. Roughly 37 GB reclaimed, and the two consumers above contributed none of it.
Acceptance
docker-lib-forgejo-runner-build-0PVC, and the reclaim measured if it is deleted.forgejo-runner-deploy-sirens-discord-opseither carries the label or has a comment saying why it must not.Both halves still live, ten days on. Verified 2026-08-29 ~04:20Z. This issue now owns the whole unmounted-PVC inventory.
1.
docker-lib-forgejo-runner-build-0is still strandedpvc_phase: Bound,pv_phase: Bound,pod_mounts: [],reclaim_policy: Delete, requested 10 GiB. Measured 5,995,282,432 bytes and that is a lower bound, because the scan timed out at 30,449 entries.Filed at 6.95 GB, measured at 5.99 GB or more today. Nothing has bound to it and nothing has reclaimed it. The reasoning in the body holds unchanged: the recycle action is
rollout restart, there is no pod to restart, so the label would still change nothing.2.
forgejo-runner-deploy-sirens-discord-opsis still outside the selectorThe evidence is now cleaner than a label read, because the recycle itself separates them. Pod ages after the 2026-08-28T16:15Z run:
forgejo-runner-deploy-sirens-discord-ops-0: 6d3hSix days without a recycle while twelve siblings were recycled twelve hours ago.
forgejo-runner-tap-writer-scoped-0sits at 9d9h and that remains correct, exactly as the body says, because it mounts no scratch.3. #846 was closed on half its content, and this is the other half
#846 is titled "kai-server local-path storage is 163 GB, with ~16 GB in unmounted runner PVCs and three PVs stuck Released". It was closed in the #981 sweep on the Released-PV half, which is genuinely fixed: 43 volumes, every one
Bound, zeroReleased.The ~16 GB unmounted half was never addressed. Measured today across the
forgejonamespace, every PVC below isBoundwithpod_mounts: []:The eleven divide into three groups, and they are not one decision:
data-forgejo-runner-{0..3}and-flight-deck-{0,1}, 9.21 GB. These are the scaled-zero general runners the ser8 migration left behind. #693 rollout step 7 explicitly says to retain them until a stated rollback window closes. Not junk, and not this issue's call. Re-anchored on #693.docker-lib-forgejo-runner-build-0, 5.99 GB. Part 1 above. The single largest reclaim available and the one this issue was filed for.data-*claims, 255 MB total. Registration state for retired or renamed runners. Cheap to leave, cheap to take.So the reclaim actually available to an attended operator today is the 5.99 GB in part 1, not the headline 15.4 GB. The rest is either spoken for by #693 or rounding.
Not reopening #846. Its Released-PV finding is genuinely resolved and its 163 GB headline is stale. Its live remainder is the inventory above, which now lives here where the stranded-PVC decision already sat. One issue owns PVC reclaim instead of two.
Acceptance, restated against today
docker-lib-forgejo-runner-build-0, and the reclaim measured if it is deleted. Deletion is destructive and irreversible, so it wants an attended operator and a current backup. No change made today.forgejo-runner-deploy-sirens-discord-opscarries the recycle label or a comment saying why it must not.