diff --git a/scripts/farm/farm-worker-loop.sh b/scripts/farm/farm-worker-loop.sh index e47661f2..7ac297ea 100755 --- a/scripts/farm/farm-worker-loop.sh +++ b/scripts/farm/farm-worker-loop.sh @@ -17,6 +17,12 @@ IDLE_SLEEP="${IDLE_SLEEP:-300}" # --- watchdog de disco: cada 3 min borra work/sources/* que ningún bwrap activo bind-monta # (seguro: sellada=store CAS, en-cola=se re-extrae sola). Evita que el vendoring llene el disco. +# Además, si el disco supera DISK_HIGH%, purga los CACHES Go (GOMODCACHE ~/go/pkg/mod + gocache): +# el `go mod vendor` de las recetas Go acumula ahí decenas de GB sin tope (el vendor/ local de cada +# receta ya tiene lo que el build necesita; el modcache sólo se usa DURANTE el vendor). Si la purga +# pisa un vendor en curso, esa receta reintenta el próximo ciclo (cache-hit el resto). Sin esto, una +# tanda Go grande llena el disco de 80G y el I/O-wait dispara el load (cuello real, no CPU/RAM). +DISK_HIGH="${DISK_HIGH:-82}" ( while :; do sleep 180 @@ -26,6 +32,11 @@ IDLE_SLEEP="${IDLE_SLEEP:-300}" printf '%s\n' "$active" | grep -qxF "$dd" && continue rm -rf "$dd" done + use=$(df --output=pcent "$HAMMER_DIR" 2>/dev/null | tr -dc '0-9') + if [ -n "$use" ] && [ "$use" -ge "$DISK_HIGH" ]; then + echo "$(date -u +%FT%TZ) watchdog: disco ${use}% ≥ ${DISK_HIGH}% ⇒ purgo caches Go" + go clean -modcache 2>/dev/null; go clean -cache 2>/dev/null + fi done ) &