fix(forgejo): cap deploy and publisher scratch at 10Gi #772
No reviewers
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!772
Loading…
Reference in a new issue
No description provided.
Delete branch "aos/claude/runner-scratch-10gi"
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?
Why
Fourteen deploy and publisher pools at a 24Gi
emptyDirsizeLimitpermitted 336 GiB of scratch on a 479.55 GiB filesystem. The disk cannot honour that, so the cap was decorative: the node reached 89.6 percent before any single pool got near its own limit.The
dindephemeral-storagerequest of 12Gi was the sharper problem. A request is a scheduling reservation, not a ceiling, so the fleet reserved 168 GiB of node ephemeral storage whether or not it was used.What
emptyDirsizeLimitdindephemeral-storage limitdindephemeral-storage requestVolume cap and container limit are kept equal so both trip at the same point instead of one masking the other. The guard in
scripts/check-forgejo-runner-config.pyis updated for the deploy and publisher checks only.Is 10Gi enough
Roughly triple what the busiest pool needs. Now that #770 recycles nightly, growth is bounded to one pod-day rather than a whole pod lifetime. The worst observed rate was
factory-game-v3at 22.28 GiB over 8 days, under 3 GiB per day.The pools to watch are the build-from-context rollouts,
factory-game-v3andgalaxy-gen, which rundocker buildin the DinD sidecar. If one ever needs more than 10Gi of Docker scratch inside a single day it will be evicted mid-job rather than silently ballooning. That is the intended tradeoff, and the eviction is the signal.Scope
General pools stay at 24Gi. They share a base with ser8's active runners, a different disk with different headroom, so changing them is a separate decision.
The image-build runner uses a disposable
local-pathPVC rather than anemptyDirand is untouched.Rendered
deploy/_flux/appsconfirms the split: 13 pools at 10Gi, 3 general pools at 24Gi. Thirteen rather than fourteen becauseforgejo-runner-deploy-sirens-discord-opshas no manifest, tracked in #771.Rollout note
These are pod-template fields, so Flux applying this rolls all 13 StatefulSets within its 10-minute reconcile window. That interrupts any in-flight deploy job and wipes scratch as a side effect. Worth merging when the deploy lane is quiet.
Verification
pre-commit run --all-filespasses, including the Forgejo runner config guard and the storage lifecycle guardward exec forgejo-runner-recycle-teststatic stage passes:forgejo runner recycle manifest: okExec format erroron the amd64 kubectl, unchanged frommainand untouched by this diffContext
Node is currently at 74.05 percent, status ok, down from 89.65 percent critical, after Kai's attended rollout restart. This change keeps the ceiling from being able to put it back.