gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1182Shell 87Rust 63Markdown 541592 Definitions

store-gc + farm-sync: cortar el BUCLE DE CHURN de 24 G que hacía inútil la poda

Podé el store por la mañana: 362 artefactos superados, 24 G. Lo volví a podar por la tarde:
362 artefactos, 24 G. Comparados los dos manifiestos, **solapamiento del 100%: son los
MISMOS 362**. No era casualidad ni recuento nuevo — es un bucle.

LA CAUSA no estaba en el gc sino en `farm/farm-sync.sh`, que bajaba el store del worker
ENTERO sin filtro. El worker nunca se poda, así que conservaba los superados y nos los
devolvía en cada cosecha. Podar → cosechar → vuelven → podar. El disco pagaba 24 G por
vuelta y el gc informaba éxito cada vez, lo que es peor que fallar: parecía que se avanzaba.

Es la misma familia de fallo que el gc que reportaba borrados falsos, sólo que un nivel más
arriba: entonces el borrado no ocurría, ahora ocurre y se deshace solo. En los dos casos el
mensaje de éxito era cierto y engañoso a la vez.

EL ARREGLO es darle memoria al sistema. `store-gc.sh` acumula lo podado en
`work/store-gc-superados.txt` y `farm-sync.sh` lo usa como `--exclude-from` al bajar el
store del worker. Es seguro porque el store es CAS: los nombres `<hash>-<paquete>` son
inmutables y un artefacto superado no vuelve a ser vigente salvo que una receta retroceda —
y si retrocediera, se reconstruye, que es barato.

Disco: 159 G → 182 G tras la poda de hoy, y esta vez debería quedarse.

De paso, en el respaldo: rsync 24 («ficheros del origen desaparecieron») NO es un fallo, es
justo lo que pasa al podar mientras se sube. El bucle de reintentos lo tomaba por error real
y habría parado el respaldo entero por algo inofensivo — y encima cuando el disco aprieta,
que es cuando menos conviene quedarse sin copia.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

6263d24788379ad5013a86919ed329b82fb87d07 · by sergio · (2 months ago) · parent 89c02db63 · browse the tree at this commit

Semantic delta

No definition changed: this change is text, documentation or data.

2 files · +27 −1

diff --git a/scripts/farm/farm-sync.sh b/scripts/farm/farm-sync.sh
index 29e7e03a..36e6ec50 100755
--- a/scripts/farm/farm-sync.sh
+++ b/scripts/farm/farm-sync.sh
@@ -27,7 +27,24 @@ rsync -az --delete -e "$SSH" \
   ./ "$VPS:$REMOTE/"
 
 echo "==> 2. bajando artefactos sellados del worker"
-rsync -az -e "$SSH" "$VPS:$REMOTE/store/" ./store/
+# ── ⚠ NO BAJAR LO QUE YA PODAMOS: era un BUCLE DE CHURN DE 24 G ────────────────────────────────
+# Medido el 2026-08-07: `store-gc.sh` borró 362 artefactos superados (24 G) por la mañana y por la
+# tarde volvió a borrar **los mismos 362** — solapamiento del 100%. No era casualidad: este rsync
+# bajaba el store del worker ENTERO, y el worker nunca se poda, así que conservaba los superados y
+# nos los devolvía en cada cosecha. Podar → cosechar → vuelven → podar. El disco pagaba 24 G por
+# vuelta y la métrica de espacio libre mentía sobre el progreso.
+#
+# El registro `work/store-gc-superados.txt` es la unión de todos los manifiestos de poda: nombres
+# `<hash>-<paquete>` de artefactos que YA decidimos que sobran. Como el store es CAS —los nombres
+# son inmutables y un artefacto superado no vuelve a ser vigente salvo que una receta retroceda—
+# excluirlos es seguro; y si una receta retrocediera, su artefacto se reconstruye, que es barato.
+LEDGER="work/store-gc-superados.txt"
+if [ -s "$LEDGER" ]; then
+  echo "    (excluyendo $(wc -l < "$LEDGER") artefactos ya podados — ver la nota del bucle de churn)"
+  rsync -az -e "$SSH" --exclude-from="$LEDGER" "$VPS:$REMOTE/store/" ./store/
+else
+  rsync -az -e "$SSH" "$VPS:$REMOTE/store/" ./store/
+fi
 
 if [ "${2:-}" = "--no-promote" ]; then
   echo "✓ store sincronizado (sin promote)"; exit 0
diff --git a/scripts/store-gc.sh b/scripts/store-gc.sh
index 6638530b..c8684e06 100755
--- a/scripts/store-gc.sh
+++ b/scripts/store-gc.sh
@@ -132,4 +132,13 @@ if [ "$QUEDAN" -gt 0 ]; then
   echo "==> libres: $ANTES → $AHORA"
   exit 1
 fi
+# ── REGISTRO ACUMULADO, para que lo podado NO VUELVA ───────────────────────────────────────────
+# 2026-08-07: se podaron 362 artefactos (24 G) por la mañana y por la tarde volvieron a aparecer LOS
+# MISMOS 362 — solapamiento del 100%. La causa no estaba acá sino en `farm/farm-sync.sh`, que bajaba
+# el store del worker entero; el worker no se poda, así que nos devolvía lo borrado en cada cosecha.
+# Podar → cosechar → vuelven. Este registro es la memoria que le faltaba al sistema: `farm-sync` lo
+# usa como `--exclude-from`. Sin él, el gc es una rueda de hámster que informa éxito cada vez.
+LEDGER="work/store-gc-superados.txt"
+cat "$OBJETIVO" "$LEDGER" 2>/dev/null | sort -u > "$LEDGER.tmp" && mv "$LEDGER.tmp" "$LEDGER"
+echo "==> registro acumulado: $(wc -l < "$LEDGER") artefactos que NO deben volver ($LEDGER)"
 echo "==> $PEDIDOS artefactos borrados y VERIFICADOS (0 sobrevivientes) · libres: $ANTES → $AHORA"