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 1471Shell 173Rust 105Markdown 943545 Definitions

granja: farm-up copiaba work/ ENTERO y podia dejar un worker sin dead-man

Dos fallos que se destaparon montando el primer worker con el lab anclado
(2026-08-11).

1. `--exclude /work` con barra inicial ancla SOLO la entrada `work`, no su
   contenido. Con `--include '/work/'` delante, rsync entraba al directorio y
   sus hijos no casaban con ninguna regla ⇒ se copiaba work/ ENTERO: 3,7 G,
   incluidos los mirrors de git A MEDIO COPIAR porque el propio rsync abortaba
   antes de terminarlos. El worker fallaba cada receta con `git fetch exit
   128`. Un work/ a medias es peor que ninguno: parece que esta. Se ancla con
   `/work/**`.

   Eso mismo causaba el abort: con --delete, rsync moria con «cannot delete
   non-empty directory» sobre los vendor/ de cargo, que quedan de SOLO
   LECTURA. Sin tocar work/, no hay nada que borrar ahi.

2. El `set -e` hacia que ese fallo abortara el script ANTES de armar el
   dead-man switch ⇒ server VIVO que no puede autodestruirse, que es
   exactamente lo que este script declara inadmisible. Ahora el rsync no es
   fatal: avisa y sigue hasta armarlo. El orden ideal es armar el dead-man
   ANTES de cualquier paso que pueda fallar; queda anotado en el codigo.

Verificado en seco contra un worker real: el patron nuevo no toca work/.

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

7279ea8780331d7661daee097fae70588792e2ff · by Sergio · (2 months ago) · parent 1c17f2f25 · browse the tree at this commit

Semantic delta

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

1 files · +17 −2

diff --git a/scripts/farm/farm-up.sh b/scripts/farm/farm-up.sh
index 858b41a4..6b336b2a 100755
--- a/scripts/farm/farm-up.sh
+++ b/scripts/farm/farm-up.sh
@@ -84,12 +84,27 @@ for k in $(seq 1 "$N"); do
   # «lo puse allí, di el bucle por cerrado, y la churn siguió porque hay DOS rutas». Había dos rutas
   # otra vez —`farm-sync` y `farm-up`— y sólo una estaba arreglada. Si aparece una tercera, va con
   # el mismo include.
+  # ⚠ `--exclude /work` NO excluía el contenido, sólo la entrada. Con `--include '/work/'` delante,
+  # rsync entraba al directorio y sus hijos no casaban con ninguna regla ⇒ **se copiaba `work/`
+  # entero**. Medido el 2026-08-11 montando el primer worker con el lab anclado: llegaron 3,7 G de
+  # `work/`, incluidos los mirrors de git A MEDIO COPIAR (el rsync abortó antes de terminarlos), y
+  # el worker fallaba cada receta con `git fetch … exit 128`. Encima, con `--delete`, moría con
+  # «cannot delete non-empty directory» sobre los `vendor/` de cargo, que quedan de SÓLO LECTURA.
+  # `/work/**` sí ancla el contenido. Un `work/` a medias es peor que ninguno: parece que está.
+  set +e
   rsync -az --delete -e "$SSH" \
-    --include '/work/' --include '/work/farm-sellados.txt' \
-    --exclude /work --exclude /store --exclude '/store-*' --exclude /target \
+    --include '/work/' --include '/work/farm-sellados.txt' --exclude '/work/**' \
+    --exclude /store --exclude '/store-*' --exclude /target \
     --exclude /dist --exclude /.dev-fs --exclude /.git --exclude /.scratch \
     --exclude '*.png' --exclude '/content*' \
     ./ "root@$ip:$REMOTE/"
+  rc=$?
+  set -e
+  # NO abortamos si el rsync falla. Lo que viene después es el ARMADO DEL DEAD-MAN, y un `set -e`
+  # aquí dejaba un server VIVO SIN poder autodestruirse — que es justo lo que este script declara
+  # inadmisible. El orden ideal sería armar el dead-man ANTES de cualquier paso que pueda fallar;
+  # mientras eso no se reordene, esto garantiza al menos que se llegue a armarlo.
+  [ "$rc" -ne 0 ] && echo "   ⚠ rsync de código salió $rc — el worker puede tener la cola incompleta; sigo para ARMAR EL DEAD-MAN"
   # el servicio ya arrancó en el boot (baked/enabled); reiniciar fuerza rescan inmediato de la cola
   $SSH root@"$ip" 'systemctl restart hammer-farm' 2>/dev/null || true