fix(granja): purgar la caché del compilador pedía presión de verdad, no un porcentaje
`DISK_HIGH` es un PORCENTAJE, y en un disco de 196 G el 82 % deja **35 G libres** — de sobra para cualquier build. Con sólo el porcentaje, el disco pasa días en la banda 82–95 % y el watchdog purga las caches cada 3 minutos: **ningún build vuelve a tener la caché de zig caliente**. Y eso lo empeoré yo el 2026-10-10 al añadir zig a la purga. Go sólo afecta a las recetas Go; **zig es el camino caliente del corpus entero** (`compiler = "zig-cc"`), así que amplifiqué una estructura que ya estaba ahí. Medido hoy: 19 disparos en una hora. Ahora la purga de caches exige las DOS cosas —porcentaje alto **y** poco espacio absoluto— con un suelo de 15 GiB, holgado para el árbol de fuentes más gordo medido (2,7 G del monorepo) y para los builds grandes. El mensaje dice los gigas libres y no sólo el %, porque «86 %» no deja ver que sobraban 86 G. ⚠ **No se toca el reaper de `work/sources`**: podar un árbol frío es barato y hacerlo a menudo es correcto. Lo que no puede ser frecuente es tirar la caché del compilador. Mezclar las dos decisiones en un mismo umbral era el daño. Control: 86 % con 100 G libres ⇒ no purga; 86 % con 10 G libres ⇒ purga. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +21 −3
diff --git a/scripts/farm/farm-worker-loop.sh b/scripts/farm/farm-worker-loop.sh
index 17b2f14d..cdda9dbb 100755
--- a/scripts/farm/farm-worker-loop.sh
+++ b/scripts/farm/farm-worker-loop.sh
@@ -141,8 +141,26 @@ SUELO_FRIO_MIN="${SUELO_FRIO_MIN:-120}"
[ -n "$(find "$dd" -mmin -"$suelo" -print -quit 2>/dev/null)" ] && continue
rm -rf "$dd"
done
+ # ── ⚠ PURGAR CACHES PIDE PRESIÓN DE VERDAD, NO UN PORCENTAJE ──────────────────────────────
+ # `DISK_HIGH` es un PORCENTAJE, y en un disco de 196 G el 82 % deja **35 G libres**: de sobra
+ # para cualquier build. Con sólo el porcentaje, el disco pasa días en la banda 82-95 % y este
+ # bloque purga las caches cada 3 minutos — o sea que **ningún build vuelve a tener la caché de
+ # zig caliente**. Eso lo empeoré yo el 2026-10-10 al añadir zig a la purga: Go sólo afecta a las
+ # recetas Go; zig es el camino caliente del corpus ENTERO.
+ #
+ # Medido el 2026-10-13: 19 disparos en una hora. ⇒ la purga exige las DOS cosas, porcentaje alto
+ # **y** poco espacio ABSOLUTO. El suelo son 15 GiB, que es holgado para el árbol de fuentes más
+ # gordo medido (2,7 G del monorepo) y para los builds grandes, y deja la purga para cuando de
+ # verdad aprieta.
+ #
+ # ⚠ NO se toca el reaper de `work/sources` de arriba: podar un árbol frío es barato y hacerlo a
+ # menudo es correcto. Lo que no puede ser frecuente es tirar la caché del compilador. Mezclar
+ # las dos decisiones en un umbral es lo que hacía daño.
+ CACHE_SUELO_GIB="${CACHE_SUELO_GIB:-15}"
+ libres_gib=$(df --output=avail -BG "$HAMMER_DIR" 2>/dev/null | tr -dc '0-9')
set -- $(_presion "$HAMMER_DIR"); use="$1"; medidor="$2"
- if [ -n "$use" ] && [ "$use" -ge "$DISK_HIGH" ]; then
+ if [ -n "$use" ] && [ "$use" -ge "$DISK_HIGH" ] \
+ && { [ -z "$libres_gib" ] || [ "$libres_gib" -lt "$CACHE_SUELO_GIB" ]; }; then
# OJO: `go clean -modcache`/`-cache` borran ~/go/pkg/mod y ~/.cache/go-build ENTEROS. Ambos los
# usa `go mod vendor` (modcache p/ módulos, go-build p/ verificar el grafo). Si la purga corre
# mientras un vendor está activo —o en la VENTANA justo antes de que arranque (otra receta de la
@@ -152,9 +170,9 @@ SUELO_FRIO_MIN="${SUELO_FRIO_MIN:-120}"
# un `go mod vendor` visible en este instante): difiero al próximo tick / al gap idle entre
# ciclos. El sandbox `go install` usa GOCACHE=/src + -mod=vendor ⇒ no toca estas caches del host.
if pgrep -f 'go mod vendor' >/dev/null 2>&1 || pgrep -f 'release/(takana|hammer).* build ' >/dev/null 2>&1; then
- echo "$(date -u +%FT%TZ) watchdog: ${medidor} al ${use}% ≥ ${DISK_HIGH}% pero hay build en vuelo ⇒ difiero purga caches Go"
+ echo "$(date -u +%FT%TZ) watchdog: ${medidor} al ${use}% y ${libres_gib:-?}G libres (< ${CACHE_SUELO_GIB}G) pero hay build en vuelo ⇒ difiero purga caches Go"
else
- echo "$(date -u +%FT%TZ) watchdog: ${medidor} al ${use}% ≥ ${DISK_HIGH}% ⇒ purgo caches Go y zig"
+ echo "$(date -u +%FT%TZ) watchdog: ${medidor} al ${use}% y ${libres_gib:-?}G libres (< ${CACHE_SUELO_GIB}G) ⇒ purgo caches Go y zig"
go clean -modcache 2>/dev/null; go clean -cache 2>/dev/null
# ── Y EL CACHE DE ZIG, que es el que de verdad tumbó esta caja (2026-10-07) ──────────────
# Este watchdog purgaba Go y de zig no sabía nada, y **zig es el compilador de TODO el