farm: fix — farm-up tiraba el store HORNEADO de la golden (rm -rf) y el worker medía media distro como deuda
El anclaje del store al volumen hacía `rm -rf $REMOTE/store` antes de symlinkear. Eso borra
justo el catálogo cacheado que es la razón de ser de la imagen golden ("arranca con TODO el
catálogo ⇒ cache-hit instantáneo"). Consecuencia medida hoy: el worker calculó 716 recetas de
deuda donde el hub medía 37, y se puso a reconstruir media distro (fallando, además, porque
sin `go` en el PATH host-side las recetas Go mueren en `go mod vendor`).
Fix: fusionar en vez de borrar. El store es CAS (nombre = hash) ⇒ `mv -n` al volumen es seguro
por construcción: no pisa lo que el volumen ya tiene, y lo horneado queda disponible.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +14 −2
- scripts/farm/farm-up.sh +14 −2
diff --git a/scripts/farm/farm-up.sh b/scripts/farm/farm-up.sh
index bfa3e5e0..414c648e 100755
--- a/scripts/farm/farm-up.sh
+++ b/scripts/farm/farm-up.sh
@@ -83,8 +83,20 @@ for k in $(seq 1 "$N"); do
$SSH root@"$ip" "mkdir -p /mnt/cosecha
mount $dev /mnt/cosecha 2>/dev/null || { mkfs.ext4 -q -F $dev && mount $dev /mnt/cosecha; }
mkdir -p /mnt/cosecha/store /mnt/cosecha/verdicts /mnt/cosecha/logs
- # el store del worker ES el del volumen: sellar YA es persistir
- rm -rf $REMOTE/store 2>/dev/null; ln -sfn /mnt/cosecha/store $REMOTE/store
+ # el store del worker ES el del volumen: sellar YA es persistir.
+ # PERO antes hay que RESCATAR el store HORNEADO en la golden (2026-07-21): esto hacía
+ # \`rm -rf $REMOTE/store\` y tiraba el catálogo cacheado que es la razón de ser de la imagen
+ # golden ('arranca con TODO el catálogo ⇒ cache-hit instantáneo'). Sin él, el worker mide
+ # deuda contra un store casi vacío y se pone a reconstruir media distro: en la tanda del
+ # 2026-07-21 dio 716 recetas de deuda donde el hub medía 37. Es CAS (nombre = hash) ⇒
+ # fusionar es seguro por construcción: \`mv -n\` no pisa lo que el volumen ya tiene.
+ if [ -d $REMOTE/store ] && [ ! -L $REMOTE/store ]; then
+ n=\$(ls $REMOTE/store 2>/dev/null | wc -l)
+ [ \"\$n\" -gt 0 ] && mv -n $REMOTE/store/* /mnt/cosecha/store/ 2>/dev/null
+ echo \" ✓ rescatados \$n artefactos horneados de la golden al volumen\"
+ rm -rf $REMOTE/store
+ fi
+ ln -sfn /mnt/cosecha/store $REMOTE/store
grep -q /mnt/cosecha /etc/fstab || echo '$dev /mnt/cosecha ext4 defaults,nofail 0 0' >> /etc/fstab" >/dev/null 2>&1
if $SSH root@"$ip" 'mountpoint -q /mnt/cosecha && test -L '"$REMOTE"'/store' 2>/dev/null; then
echo " ✓ store anclado al volumen ($( $SSH root@"$ip" 'ls -d /mnt/cosecha/store/*/ 2>/dev/null | wc -l') artefactos ya presentes)"