Etapa G (granja): watchdog protege árboles calientes — cura corrupción de deps transitivas
El watchdog de disco purgaba work/sources/* protegiendo solo árboles bind-montados por bwrap (prot.1) o cuyo nombre coincide con la receta en vuelo (prot.2). Una dep transitiva (cairo bajo pango/gtk4) se extrae host-side ANTES del bwrap y con nombre que no coincide con la receta ⇒ el rm -rf competía con el tar y dejaba el árbol a medias: 'Cannot mkdir' durante la extracción, luego 'Directory not empty' para siempre (falla rápido antes de bwrap, nunca se recupera). Prot.3: no purgar árboles modificados hace <2 min (extrayéndose ahora); los fríos se purgan y re-extraen limpio. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Semántico sayk'uy
Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.
1 qillqakuna · +6 −0
diff --git a/scripts/farm/farm-worker-loop.sh b/scripts/farm/farm-worker-loop.sh
index 1ada8a8a..0bf6bf83 100755
--- a/scripts/farm/farm-worker-loop.sh
+++ b/scripts/farm/farm-worker-loop.sh
@@ -38,6 +38,12 @@ DISK_HIGH="${DISK_HIGH:-82}"
printf '%s\n' "$active" | grep -qxF "$dd" && continue
nm=$(basename "$dd"); nm=${nm%-*} # work/sources/<name>-<sha40> → <name> (el sha no trae '-')
printf '%s\n' "$building" | grep -qxF "$nm" && continue
+ # Protección 3: árbol CALIENTE (modificado hace <2 min) ⇒ se está extrayendo AHORA. Una dep
+ # transitiva (p.ej. cairo bajo pango/gtk4) se extrae host-side ANTES del bwrap y con un nombre
+ # que NO coincide con la receta en vuelo ⇒ protecciones 1 y 2 no la cubren. Sin esto, el rm -rf
+ # compite con el tar y deja el árbol a medias ("Cannot mkdir" / luego "Directory not empty" para
+ # siempre). Un árbol en frío (extracción ya fallida/terminada) queda purgable ⇒ se re-extrae limpio.
+ [ -n "$(find "$dd" -mmin -2 -print -quit 2>/dev/null)" ] && continue
rm -rf "$dd"
done
use=$(df --output=pcent "$HAMMER_DIR" 2>/dev/null | tr -dc '0-9')