đ la granja molĂa UNA receta por cola y por ciclo â el `xargs -I{}` recibĂa la cola entera junta
Medido hoy al encolar `lld21` junto a `rust`: el ciclo decĂa «2 recetas en recipes/incoming» y
construĂa UNA. La causa estĂĄ en el filtro de «ya sellado en el hub»: acumula en `filtrada` uniendo
con ESPACIOS, y mĂĄs abajo la cola se le pasa a `xargs -I{}`, que trata **una lĂnea = un elemento**.
Unidas por espacios, N recetas llegan como UN SOLO argumento:
printf '%s\n' " a.toml b.toml c.toml" | xargs -I{} sh -c 'echo [$1]' _ {}
recibe: [a.toml b.toml c.toml] â uno solo
â la fase paralela fallaba SIEMPRE con «No such file», y la fase 1b âel reintento serialâ salvaba
exactamente UNA receta: la Ășltima, porque `basename` de esa ristra da el Ășltimo nombre. El log
parecĂa normal, con su â seguido de un â (reintento serial), y ese patrĂłn estĂĄ en TODAS las colas
(yambar, spidermonkey, rustâŠ). O sea que el reintento serial, que existe para conciliar colisiones
de concurrencia, venĂa tapando el bug desde que se escribiĂł el filtro.
El arreglo son dos lĂneas: acumular con salto de lĂnea y descartar la lĂnea vacĂa con la que arranca
el acumulador (una lĂnea vacĂa tambiĂ©n es un elemento para `xargs -I{}`). Probado en chiquito, en
los dos sentidos: antes 1 elemento, después 3.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +14 â2
- scripts/build-farm.sh +14 â2
diff --git a/scripts/build-farm.sh b/scripts/build-farm.sh
index d60712d0..3e7ad811 100755
--- a/scripts/build-farm.sh
+++ b/scripts/build-farm.sh
@@ -68,14 +68,26 @@ if [ -s "$SELLADOS" ]; then
[ -n "$n" ] || n=$(basename "$f" .toml)
H=$("$HAMMER" --store "$STORE" hash "$f" 2>/dev/null | tail -1 | sed 's/^b3://')
if [ -n "$H" ] && grep -qx "$H-$n" "$SELLADOS"; then saltadas=$((saltadas+1)); continue; fi
- filtrada="$filtrada $f"
+ # â SALTO DE LĂNEA Y NO ESPACIO, y esto era un BUG que costĂł throughput en silencio
+ # (medido 2026-09-16): mĂĄs abajo la cola se le pasa a `xargs -I{}`, que trata **una lĂnea = un
+ # elemento**. Unidas por espacios, N recetas llegaban como UN SOLO argumento: la fase paralela
+ # fallaba siempre con «No such file» y la fase 1b âel reintento serialâ salvaba EXACTAMENTE UNA,
+ # la Ășltima, porque `basename` de esa ristra da el Ășltimo nombre. O sea que la granja molĂa
+ # **una receta por cola y por ciclo** en vez de la cola entera, y el log parecĂa normal: un â
+ # seguido de un â (reintento serial). Se vio al encolar `lld21` junto a `rust` y descubrir que
+ # el ciclo decĂa «2 recetas» y construĂa una.
+ filtrada="$filtrada
+$f"
done
[ "$cerradas" -gt 0 ] && echo " ($cerradas CERRADAS por decisiĂłn â ver la cabecera de cada receta)"
[ "$saltadas" -gt 0 ] && echo " (saltadas $saltadas ya selladas en el hub â ver la nota del sync unidireccional)"
queue="$filtrada"
[ -n "$(echo $queue)" ] || { echo "nada que hacer en $QUEUE: todo sellado en el hub"; exit 0; }
fi
-n_total=$(printf '%s\n' "$queue" | wc -l | tr -d ' ')
+# `grep -v` porque el acumulador del filtro arranca con una lĂnea vacĂa, y una lĂnea vacĂa es un
+# elemento mĂĄs para `xargs -I{}`: construirĂa la receta "" y ensuciarĂa el conteo.
+queue=$(printf '%s\n' "$queue" | grep -v '^[[:space:]]*$' || true)
+n_total=$(printf '%s\n' "$queue" | grep -c . || true)
echo "==> GRANJA: $n_total recetas en $QUEUE, $JOBS workers en paralelo"
# ââ Fase 1: BUILD en paralelo. Cada worker construye una receta y deja su status (.ok con hash | .fail