diff --git a/scripts/reconstruir-corpus.sh b/scripts/reconstruir-corpus.sh index 8b959f53..003cacec 100755 --- a/scripts/reconstruir-corpus.sh +++ b/scripts/reconstruir-corpus.sh @@ -26,7 +26,8 @@ # el 2026-08-10 y se llevó por delante un kernel a medias. # # 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 ROOT="$(cd "$(dirname "$0")/.." && pwd)"; cd "$ROOT" @@ -42,7 +43,21 @@ MIN_LIBRE_GB="${MIN_LIBRE_GB:-40}" ABORT_GB="${ABORT_GB:-15}" 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; } # EL ORDEN IMPORTA, aunque las deps se resuelvan solas. `hammer build` construye recursivamente lo @@ -160,8 +175,23 @@ for f in "${RECETAS[@]}"; do fi 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). - 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 + # `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" fi