From 514ae4413514d668b585b1cc6794470d853277da Mon Sep 17 00:00:00 2001 From: sergio Date: Fri, 7 Aug 2026 07:44:54 -0400 Subject: [PATCH] =?UTF-8?q?store-gc:=20guardi=C3=A1n=20=E2=80=94=20no=20re?= =?UTF-8?q?portar=20=C2=ABborrado=C2=BB=20sin=20comprobarlo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El script informó «364 artefactos borrados · libres: 24G → 48G» y no había borrado ninguno: los 364 de su propio manifiesto seguían enteros en el store. `xargs rm -rf` salió con 0 y el echo se lo creyó. Se reprodujo: corriéndolo en SEGUNDO PLANO el borrado no se materializa; en primer plano sí. Da igual la causa: un rm que devuelve 0 no es prueba de que el fichero se fue. La válvula de escape del disco estaba rota EN SILENCIO y encima reportaba éxito, que es peor que fallar — el disco llegó al 98% mientras yo creía haber liberado 24G. Ahora recuenta sobre el filesystem y sale distinto de cero si sobrevivió algo. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/store-gc.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/scripts/store-gc.sh b/scripts/store-gc.sh index a9e88a92..6638530b 100755 --- a/scripts/store-gc.sh +++ b/scripts/store-gc.sh @@ -110,4 +110,26 @@ mkdir -p work; cp "$OBJETIVO" "$MANIFIESTO" echo "==> manifiesto de lo borrado: $MANIFIESTO" ANTES=$(df -h /home 2>/dev/null | tail -1 | awk '{print $4}') sed "s|^|$STORE/|" "$OBJETIVO" | xargs rm -rf -echo "==> $(wc -l < "$OBJETIVO") artefactos borrados · libres: $ANTES → $(df -h /home 2>/dev/null | tail -1 | awk '{print $4}')" + +# ── GUARDIÁN: NO reportar «borrado» sin comprobarlo ───────────────────────────────────────────── +# 2026-08-07: este script informó «364 artefactos borrados · libres: 24G → 48G» y NO había borrado +# NINGUNO — los 364 del manifiesto seguían enteros en el store, y los 24G que se liberaron esa vez +# vinieron de otro lado. `xargs rm -rf` salió con 0 y el `echo` de abajo se lo creyó. (Se reprodujo: +# corriendo el script en SEGUNDO PLANO el borrado no se materializa; en primer plano sí. Da igual la +# causa: un `rm` que devuelve 0 no es prueba de que el fichero se fue.) +# +# Consecuencia real: la válvula de escape del disco estaba rota EN SILENCIO, y encima reportaba éxito, +# que es peor que fallar. El disco llegó al 98%. +# +# Por eso ahora se RECUENTA sobre el filesystem y el script sale distinto de cero si sobrevivió algo. +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}') +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." + echo "==> libres: $ANTES → $AHORA" + exit 1 +fi +echo "==> $PEDIDOS artefactos borrados y VERIFICADOS (0 sobrevivientes) · libres: $ANTES → $AHORA"