diff --git a/scripts/farm/cosecha-cron.sh b/scripts/farm/cosecha-cron.sh index 2aee5b33..ca23d076 100755 --- a/scripts/farm/cosecha-cron.sh +++ b/scripts/farm/cosecha-cron.sh @@ -68,7 +68,19 @@ else continue fi # 2. RECOGE: store sellado worker→laptop (CAS, merge seguro). - if rsync -az --exclude /.dmerge -e "$SSH" "root@$ip:$REMOTE/store/" "$ROOT/store/" 2>&1 | tail -2; then + # ── ⚠ EXCLUIR LO YA PODADO, O LA POda SE DESHACE SOLA ───────────────────────────────────── + # El worker NO se poda nunca, así que conserva los artefactos superados y este rsync los + # devolvía enteros. Con el latido cada 30 min, una poda de 24 G quedaba deshecha en menos de + # una hora: medido el 2026-08-07, tres podas seguidas borraron LOS MISMOS 362 artefactos. + # + # El mismo arreglo está en `farm-sync.sh` — y ahí estuvo el error de método: lo puse allí, di el + # bucle por cerrado, y la churn siguió porque **hay DOS rutas que bajan el store** y el latido + # usa ésta. Arreglar una de dos copias y declarar victoria es peor que no arreglar: el síntoma + # se atenúa lo justo para dejar de mirar. Si aparece una tercera copia, va con el mismo exclude. + LEDGER="$ROOT/work/store-gc-superados.txt" + EXCL="" + [ -s "$LEDGER" ] && EXCL="--exclude-from=$LEDGER" + if rsync -az --exclude /.dmerge $EXCL -e "$SSH" "root@$ip:$REMOTE/store/" "$ROOT/store/" 2>&1 | tail -2; then echo " cosecha ✓" else echo " ⚠ cosecha falló — sigo" diff --git a/scripts/farm/farm-down.sh b/scripts/farm/farm-down.sh index 07caa31b..206f81c8 100755 --- a/scripts/farm/farm-down.sh +++ b/scripts/farm/farm-down.sh @@ -47,7 +47,14 @@ while read -r name ip; do fi echo "==> cosechando store de $name ($ip)" - if rsync -az -e "$SSH" "root@$ip:$REMOTE/store/" "$ROOT/store/"; then + # ⚠ `--exclude-from` del registro de podados: el worker NO se poda, así que devolvería los + # artefactos superados y desharía la poda (24 G por vuelta). Misma protección que en + # `cosecha-cron.sh`, `farm-sync.sh` y `store-gc.sh` — son CUATRO rutas que bajan el store del + # worker y la protección tiene que estar en las cuatro. Se descubrió tras arreglar sólo una y + # comprobar que la churn seguía. + LEDGER_GC="$ROOT/work/store-gc-superados.txt" + EXCL_GC=""; [ -s "$LEDGER_GC" ] && EXCL_GC="--exclude-from=$LEDGER_GC" + if rsync -az $EXCL_GC -e "$SSH" "root@$ip:$REMOTE/store/" "$ROOT/store/"; then echo "==> destruyendo $name" if hcloud server delete "$name" >/dev/null 2>&1; then harvested=$((harvested + 1)) diff --git a/scripts/farm/harvest-go.sh b/scripts/farm/harvest-go.sh index aec44f5c..d8f8dd54 100755 --- a/scripts/farm/harvest-go.sh +++ b/scripts/farm/harvest-go.sh @@ -68,7 +68,14 @@ git pull --rebase --autostash origin main 2>&1 | tail -2 || echo "$(STAMP) WARN: # 2. bajar el store sellado del worker. echo "$(STAMP) bajando store del worker…" -rsync -az -e "$SSH" "$VPS:$REMOTE/store/" "$STORE/" 2>&1 | tail -1 || { echo "$(STAMP) ERROR: rsync store falló"; exit 1; } +# ⚠ `--exclude-from` del registro de podados: el worker NO se poda, así que devolvería los +# artefactos superados y desharía la poda (24 G por vuelta). Misma protección que en +# `cosecha-cron.sh`, `farm-sync.sh` y `store-gc.sh` — son CUATRO rutas que bajan el store del +# worker y la protección tiene que estar en las cuatro. Se descubrió tras arreglar sólo una y +# comprobar que la churn seguía. +LEDGER_GC="$(cd "$(dirname "$0")/../.." && pwd)/work/store-gc-superados.txt" +EXCL_GC=""; [ -s "$LEDGER_GC" ] && EXCL_GC="--exclude-from=$LEDGER_GC" +rsync -az $EXCL_GC -e "$SSH" "$VPS:$REMOTE/store/" "$STORE/" 2>&1 | tail -1 || { echo "$(STAMP) ERROR: rsync store falló"; exit 1; } mkdir -p "$REVIEW" promoted=""; rejected=""; skipped=""