granja: dos fallos que se repetían idénticos, que es la firma de que nadie reintenta

1. build-farm.sh — vulkan-loader fallaba con «io: File name too long (os
   error 36)» en TODOS los ciclos y sella sin una queja ejecutado en serie
   (comprobado a mano en el worker). La firma no estaba en la lista de
   colisiones del reintento serial, así que nunca se reintentaba: fallaba,
   contaba como deuda, y al ciclo siguiente fallaba igual.

   Un fallo que se repite IDÉNTICO no es intermitente: es uno que nadie
   está reintentando.

   Se añade la firma, pero el defecto de fondo era que faltarla fuese MUDO
   — la lista sólo puede crecer si alguien se entera de que se quedó corta.
   Ahora lo no reintentado se dice, con las primeras 120 letras del log.

2. farm-up.sh — no sembraba work/farm-sellados.txt. Un worker recién
   creado arrancaba con el manifiesto rancio horneado en la golden: 1172
   contra 1241 del hub, así que reconstruía lo que el hub ya tenía sellado
   (vulkan-loader entre ellos, y encima fallando).

   Es el mismo error de método que farm-sync.sh ya se documentó a sí mismo:
   «lo puse allí, di el bucle por cerrado, y la churn siguió porque hay DOS
   rutas». Había dos otra vez y sólo una estaba arreglada.

Tras el arreglo las cuatro colas dan 1/1 construyen (0 fallan) y el perfil
escritorio-kde cierra 162/162.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-09 22:28:30 -04:00
co-authored by Claude Opus 5
parent ddc8561e07
commit 6a92bd3d19
2 changed files with 26 additions and 1 deletions
+15 -1
View File
@@ -106,7 +106,21 @@ for s in "$FARM"/status/*.fail; do
[ -f "$s" ] || continue
n=$(basename "$s" .fail); log="$FARM/log/$n.log"; f="$QUEUE/$n.toml"
[ -f "$f" ] || continue
grep -qiE "Some other Meson process|already using this build directory|Directory not empty|No such file or directory|gdkconfig\.h" "$log" 2>/dev/null || continue
# ── `File name too long` TAMBIÉN es colisión (2026-08-09) ────────────────────────────────────
# `vulkan-loader` fallaba con «io: File name too long (os error 36)» en TODOS los ciclos de la
# granja y sella sin una queja ejecutado en serie — comprobado a mano en el worker. La firma no
# estaba en esta lista, así que nunca se reintentaba: fallaba, se contaba como deuda, y al ciclo
# siguiente volvía a fallar igual. Un fallo que se repite idéntico cada vez no es un fallo
# intermitente, es uno que nadie está reintentando.
if ! grep -qiE "Some other Meson process|already using this build directory|Directory not empty|No such file or directory|gdkconfig\.h|File name too long|os error 36" "$log" 2>/dev/null; then
# ── Y LO QUE NO SE REINTENTA, SE DICE ────────────────────────────────────────────────────────
# El defecto de fondo no era la firma que faltaba sino que faltarla fuese MUDO: la lista sólo
# puede crecer si alguien se entera de que se quedó corta. Sin esta línea, la única señal de que
# una receta es reintentable era que a alguien se le ocurriera correrla a mano.
printf " · %-18s no reintentado (firma no reconocida: %s)\n" "$n" \
"$(head -c 120 "$log" 2>/dev/null | tr '\n' ' ' | tr -s ' ')"
continue
fi
H=$("$HAMMER" --store "$STORE" build "$f" 2>"$log" | tail -1 || true)
if [ "${H#b3:}" != "$H" ] && [ -n "$H" ]; then
rm -f "$s"; echo "$H" > "$FARM/status/$n.ok"; printf " ✓ (reintento serial) %-18s %s\n" "$n" "$H"
+11
View File
@@ -74,7 +74,18 @@ for k in $(seq 1 "$N"); do
until $SSH root@"$ip" true 2>/dev/null; do sleep 3; done
echo " alineando cola con el laptop (rsync código + recipes)…"
# ── EL MANIFIESTO VIAJA ACÁ TAMBIÉN, Y ESTE ERA EL AGUJERO ────────────────────────────────────
# `farm-sync.sh` ya mandaba `work/farm-sellados.txt` para que el worker no rehiciera lo que el hub
# tiene. Este fichero NO, así que un worker recién creado arrancaba con el manifiesto RANCIO que
# venía horneado en la golden. Medido el 2026-08-09: worker 1172 vs hub 1241 ⇒ el worker construía
# `vulkan-loader` en TODOS los ciclos aunque el hub ya lo tenía sellado, y encima fallaba.
#
# Es literalmente el error de método que este repo ya se documentó a sí mismo en `farm-sync.sh`:
# «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.
rsync -az --delete -e "$SSH" \
--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*' \