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>
This commit is contained in:
+16
-3
@@ -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."
|
||||
|
||||
Reference in New Issue
Block a user