tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1411Shell 141Markdown 85Rust 842918 Definitions

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>

7119d3f2177ba2e3722e51a9bcbcc8492f606a33 · by Sergio · (9 d ago) · parent 449390733 · browse the tree at this commit

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