corpus: el vigia de disco miraba un solo sistema de ficheros

Media `df` sobre el repo y nada mas. Pero las recetas Rust no gastan solo ahi:
`cargo vendor` copia DESDE `~/.cargo/registry`, que en gioser esta en `/` (74 G)
y no en `/mnt/vvv` (255 G). Hoy eso eran 138 G libres segun el vigia y 19 G de
verdad — luz verde mientras el que se llenaba era el otro, y llenar `/` no
rompe una tanda, rompe la maquina.

Ahora toma el MINIMO de los dos FS (el del repo y el de CARGO_HOME). Si
comparten FS, `df` devuelve lo mismo dos veces y es inocuo.

La purga tambien se queda corta y crece:
- `work/repos/*`, los clones --mirror de gitea de las hub-only. Se re-clonan.
- `$CARGO_HOME/registry` como ULTIMO recurso y CON GUARDA: el act-runner de
  tawasuyu corre como el mismo usuario y comparte ese ~/.cargo. Purgarlo con un
  `cargo` ajeno en vuelo le arranca los ficheros a SU compilador. Se pregunta
  por el codigo de salida de `pgrep`, no por su stdout.

De paso queda dicho en la cabecera que CARGO_HOME se vigila: en gioser el
driver se lanza con el suyo propio dentro del volumen, y asi hammer deja de
gastar `/`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xd5DComN9Nu47TBpYMBHBn
This commit is contained in:
Sergio
2026-08-20 16:52:57 +00:00
co-authored by Claude Opus 5
parent bc9f199993
commit 4996807db0
+33 -3
View File
@@ -26,7 +26,8 @@
# el 2026-08-10 y se llevó por delante un kernel a medias. # el 2026-08-10 y se llevó por delante un kernel a medias.
# #
# Uso: scripts/reconstruir-corpus.sh [--seco] # Uso: scripts/reconstruir-corpus.sh [--seco]
# Env: MIN_LIBRE_GB (def 25) umbral de purga · ABORT_GB (def 10) aborta antes de llenar el disco # Env: MIN_LIBRE_GB (def 40) umbral de purga · ABORT_GB (def 15) aborta antes de llenar el disco
# CARGO_HOME (def ~/.cargo) — se VIGILA su sistema de ficheros además del del repo
set -uo pipefail set -uo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT" ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT"
@@ -42,7 +43,21 @@ MIN_LIBRE_GB="${MIN_LIBRE_GB:-40}"
ABORT_GB="${ABORT_GB:-15}" ABORT_GB="${ABORT_GB:-15}"
SECO=0; [ "${1:-}" = "--seco" ] && SECO=1 SECO=0; [ "${1:-}" = "--seco" ] && SECO=1
libre_gb() { df -BG --output=avail "$ROOT" 2>/dev/null | tail -1 | tr -dc 0-9; } # ── EL VIGÍA MIRA DOS SISTEMAS DE FICHEROS, NO UNO ──────────────────────────────────────────────
# Medía sólo el FS del repo, y las recetas Rust no gastan sólo ahí: `cargo vendor` copia DESDE
# `~/.cargo/registry`, que en gioser está en `/` (74 G) y no en `/mnt/vvv` (255 G). El 2026-08-20 eso
# era 138 G libres en el repo y 19 G en `/`, o sea que el vigía habría dado luz verde mientras el que
# se llenaba de verdad era el otro — y llenar `/` no rompe una tanda, rompe la máquina. Se toma el
# MÍNIMO de los dos. Si comparten FS, `df` devuelve lo mismo dos veces y esto es inocuo.
CARGO_H="${CARGO_HOME:-$HOME/.cargo}"
avail_gb() { df -BG --output=avail "$1" 2>/dev/null | tail -1 | tr -dc 0-9; }
libre_gb() {
local a b
a=$(avail_gb "$ROOT"); b=$(avail_gb "$CARGO_H")
[ -z "${a:-}" ] && a=999999
[ -z "${b:-}" ] && b=999999
[ "$a" -le "$b" ] && echo "$a" || echo "$b"
}
ts() { date -u +%Y-%m-%dT%H:%M:%SZ; } ts() { date -u +%Y-%m-%dT%H:%M:%SZ; }
# EL ORDEN IMPORTA, aunque las deps se resuelvan solas. `hammer build` construye recursivamente lo # EL ORDEN IMPORTA, aunque las deps se resuelvan solas. `hammer build` construye recursivamente lo
@@ -160,8 +175,23 @@ for f in "${RECETAS[@]}"; do
fi fi
if [ "${l:-0}" -lt "$MIN_LIBRE_GB" ]; then if [ "${l:-0}" -lt "$MIN_LIBRE_GB" ]; then
# Seguro por construcción: acá NO hay ningún build corriendo (somos el único, y en serie). # Seguro por construcción: acá NO hay ningún build corriendo (somos el único, y en serie).
echo " [$(ts)] libre ${l} G < ${MIN_LIBRE_GB} ⇒ purgo work/sources" | tee -a "$LOG" echo " [$(ts)] libre ${l} G < ${MIN_LIBRE_GB} ⇒ purgo work/sources y work/repos" | tee -a "$LOG"
rm -rf work/sources/* 2>/dev/null rm -rf work/sources/* 2>/dev/null
# `work/repos` son los clones `--mirror` de gitea de las recetas hub-only. Se re-clonan; el coste
# es red, no trabajo perdido.
rm -rf work/repos/* 2>/dev/null
# El registry de cargo es lo ÚLTIMO, y va con guarda: el act-runner de tawasuyu corre como el
# mismo usuario y comparte este `~/.cargo`. Purgarlo con un `cargo` ajeno en vuelo le arranca los
# ficheros a SU compilador — el mismo accidente del kernel a medias, sólo que en el vecino. Se
# pregunta por el CÓDIGO DE SALIDA de `pgrep`, nunca por su stdout.
if [ "$(libre_gb)" -lt "$MIN_LIBRE_GB" ]; then
if pgrep -x cargo >/dev/null 2>&1 || pgrep -x rustc >/dev/null 2>&1; then
echo " sigue corto, pero hay cargo/rustc ajeno en vuelo ⇒ NO toco $CARGO_H/registry" | tee -a "$LOG"
else
echo " sigue corto ⇒ purgo $CARGO_H/registry (caché, se re-descarga)" | tee -a "$LOG"
rm -rf "$CARGO_H"/registry/cache/* "$CARGO_H"/registry/src/* 2>/dev/null
fi
fi
echo " libre tras purgar: $(libre_gb) G" | tee -a "$LOG" echo " libre tras purgar: $(libre_gb) G" | tee -a "$LOG"
fi fi