store-gc: decía «espacio: superados ·» y «libres: Available → Available» — dos bugs que salen en takana
Corrido por primera vez en la caja (una máquina busybox, no GNU), el recolector funcionó —337 artefactos borrados y verificados, 26,8 G liberados— pero sus dos NÚMEROS salieron vacíos: ==> espacio: superados · huérfanos ==> 337 artefactos borrados y VERIFICADOS (0 sobrevivientes) · libres: Available → Available 1. `du -sch --files0-from=-` es de GNU coreutils y busybox NO lo tiene ⇒ `espacio()` devolvía vacío. Un número que falta se lee como un número chico: sin él nadie puede decidir si vale la pena correrlo, que es justo para lo que está el dry-run. Ahora `xargs du -sk` + awk, que anda en los dos mundos. 2. `df -h /home` estaba CABLEADO, y el store casi nunca vive ahí: en gioser es un bind-mount del volumen y en una caja takana es `/store`, su propia partición. En la caja no hay `/home`, así que `tail -1` se quedó con la CABECERA y el resultado fue «Available → Available». Se mide `$STORE`. Medido de verdad con `df` a mano: /store pasó de 84,7 G usados (91 %) a 57,9 G (62 %) — 26,8 G liberados, 1657 → 1320 artefactos. Y el control que importa después de un gc: los 11 enlaces de `/usr/bin` que apuntan DENTRO del store siguen resolviendo y los 21 entes siguen corriendo. ⚠ Vale anotar la advertencia que el propio gc imprime y que en esa caja no se puede satisfacer: «sin .config legible ⇒ NO se protege ningún kernel por esta vía». El default (sólo superados) no toca lo vigente, pero `--huerfanos` en una máquina que arranca de su store hay que pensarlo dos veces. 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 · +16 −3
- scripts/store-gc.sh +16 −3
diff --git a/scripts/store-gc.sh b/scripts/store-gc.sh
index b8048267..5742441f 100755
--- a/scripts/store-gc.sh
+++ b/scripts/store-gc.sh
@@ -156,8 +156,18 @@ if movidos:
PYK
espacio() { # du sobre una lista de dirs, tolerante a lista vacía
+ # ⚠ `du --files0-from=-` es de GNU coreutils y **busybox no lo tiene** (medido en la caja takana
+ # el 2026-09-17): devolvía vacío, así que el gc anunciaba «espacio: superados · huérfanos » y
+ # nadie podía saber si valía la pena correrlo. Un número que falta se lee como un número chico.
+ # `xargs du -sk` anda en los dos mundos; el total lo suma awk, en KiB, y se imprime humano.
[ -s "$1" ] || { echo "0"; return; }
- sed "s|^|$STORE/|" "$1" | tr '\n' '\0' | du -sch --files0-from=- 2>/dev/null | tail -1 | cut -f1
+ sed "s|^|$STORE/|" "$1" \
+ | xargs -d '\n' du -sk 2>/dev/null \
+ | awk '{t+=$1} END {
+ if (t=="") {print "?"; exit}
+ if (t>1048576) printf "%.1fG\n", t/1048576;
+ else if (t>1024) printf "%.0fM\n", t/1024;
+ else printf "%dK\n", t }'
}
echo "==> espacio: superados $(espacio "$TMP/superados.txt") · huérfanos $(espacio "$TMP/huerfanos.txt")"
@@ -176,7 +186,7 @@ fi
MANIFIESTO="work/store-gc-$(date +%Y-%m-%dT%H%M%S).txt"
mkdir -p work; cp "$OBJETIVO" "$MANIFIESTO"
echo "==> manifiesto de lo borrado: $MANIFIESTO"
-ANTES=$(df -h /home 2>/dev/null | tail -1 | awk '{print $4}')
+ANTES=$(df -h "$STORE" 2>/dev/null | tail -1 | awk "{print \$4}")
sed "s|^|$STORE/|" "$OBJETIVO" | xargs rm -rf
# ── GUARDIÁN: NO reportar «borrado» sin comprobarlo ─────────────────────────────────────────────
@@ -193,7 +203,10 @@ sed "s|^|$STORE/|" "$OBJETIVO" | xargs rm -rf
QUEDAN=0
while IFS= read -r l; do [ -e "$STORE/$l" ] && QUEDAN=$((QUEDAN+1)); done < "$OBJETIVO"
PEDIDOS=$(wc -l < "$OBJETIVO")
-AHORA=$(df -h /home 2>/dev/null | tail -1 | awk '{print $4}')
+# ⚠ `df -h /home` estaba CABLEADO, y el store casi nunca vive ahí: en gioser es un bind-mount del
+# volumen y en una caja takana es `/store`, su propia partición. O sea que el «libres: antes →
+# después» medía un sistema de ficheros que el gc ni toca. Se mide el del STORE.
+AHORA=$(df -h "$STORE" 2>/dev/null | tail -1 | awk '{print $4}')
if [ "$QUEDAN" -gt 0 ]; then
echo "!! BORRADO INCOMPLETO: $QUEDAN de $PEDIDOS artefactos SIGUEN en $STORE."
echo "!! No te fíes del espacio libre de abajo. Reintentá en PRIMER PLANO y volvé a verificar."