forked from unom/punktfunk
The capacity lever, taken: home-runner-1's LXC rootfs went 123 G -> 175 G
(`pct resize 116 rootfs +50G` on home-node-1, online, no downtime, thin pool had
~607 G spare). Free space went 77 G -> 124 G, which is the part that actually
gives three concurrent Rust builds room; the 10-minute prune is now a backstop
rather than the only thing standing between a push-storm and ENOSPC.
MIN_FREE_GB stays at 45. It is deliberately an absolute floor, not a percentage:
what three concurrent target/ dirs need does not change when the disk is resized,
but a percentage threshold silently does — 80% meant ~25 G free before and ~35 G
now. That is exactly why the percentage alone was the wrong instrument.
Also replaces the multi-line `{ …; } || { …; }` burst condition with two flat
tests into a flag. Same semantics, and shellcheck parses it — the brace-group
form across a line break did not survive an edit to the comment above it.
Truth-tabled: quiet at 25%/124G, fires on either signal alone, and stays quiet
when df returns nothing rather than treating an empty reading as pressure.
Deployed to home-runner-1; deployed md5 matches the repo.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
22 lines
1.0 KiB
SYSTEMD
22 lines
1.0 KiB
SYSTEMD
# Runs docker-prune.service every 10 min. It was every 30, and that is how the burst guard never
|
|
# fired once: three concurrent Rust builds fill the disk and drain it again well inside a 30-minute
|
|
# window, so the poll kept landing on a healthy `df` while jobs died of ENOSPC in between. (An arch
|
|
# build failed with `as: BFD assertion fail` — assembler noise for "can't write, No space left on
|
|
# device" — and by the time anyone looked, the disk was back to 37% used.)
|
|
#
|
|
# Ten minutes is a backstop, not the fix. The fix was capacity: the LXC rootfs went 123 G -> 175 G
|
|
# on 2026-07-29 (`pct resize 116 rootfs +50G` on home-node-1), which is what actually gives three
|
|
# concurrent builds room. RandomizedDelaySec stays low so the guard is prompt.
|
|
# Persistent=true catches up after downtime. Install: see the header of docker-prune.service.
|
|
|
|
[Unit]
|
|
Description=Run docker-prune every 10 min (CI runner disk hygiene + cache cap + burst guard)
|
|
|
|
[Timer]
|
|
OnCalendar=*:0/10
|
|
RandomizedDelaySec=30
|
|
Persistent=true
|
|
|
|
[Install]
|
|
WantedBy=timers.target
|