farm: JOBS=1 en el worker-loop mientras el ADR 0012 esté sin decidir

`build-farm.sh` usa `xargs -P$JOBS`; con >1, dos recetas que comparten dep disparan la carrera del
árbol de fuentes del ADR 0012 y el árbol queda roto para siempre. Se vio a escala: al invalidar
libdrm, 118 de las 205 recetas KDE pasaron de cache-hit a rebuild real y ~93 murieron con
"/src/.zwrap/cc is not a full path to an existing compiler tool" — el wrapper de zig que la receta
deja en el ÁRBOL DE FUENTE, barrido por el fetch concurrente de otra receta sobre el mismo qtbase.
El reintento serial de build-farm tampoco las recupera: el árbol ya quedó inconsistente.

La caché estaba ocultando la carrera, no evitándola. Serializar es la única mitigación correcta
hasta que el ADR 0012 elija salida.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-22 18:15:38 -04:00
co-authored by Claude Opus 4.8
parent 4e9b6327ed
commit 25e3878331
+11 -1
View File
@@ -12,7 +12,17 @@ set -uo pipefail
HAMMER_DIR="${HAMMER_DIR:-/opt/hammer}"
cd "$HAMMER_DIR"
. "$HOME/.cargo/env" 2>/dev/null || true
JOBS="${JOBS:-$(nproc)}"
# JOBS=1 MIENTRAS EL ADR 0012 ESTÉ SIN DECIDIR (2026-07-22). `build-farm.sh` usa `xargs -P$JOBS`, y
# con >1 dos recetas que compartan dep disparan la carrera del árbol de fuentes: ambas hacen fetch
# del mismo `work/sources/<dep>-<sha>`, una borra mientras la otra usa, y el árbol queda ROTO PARA
# SIEMPRE. Se vio a escala: al invalidar libdrm, 118 de las 205 recetas KDE tuvieron que reconstruir
# de verdad (antes eran cache-hits que ocultaban el problema) y ~93 murieron con
# "/src/.zwrap/cc is not a full path to an existing compiler tool" — el wrapper de zig que la receta
# deja EN EL ÁRBOL DE FUENTE, barrido por el fetch concurrente de otra receta sobre el mismo qtbase.
# El reintento serial de build-farm tampoco las salva, porque el árbol ya quedó inconsistente.
# Serializar es la única mitigación correcta hasta que el ADR 0012 elija (lock por árbol / árbol
# privado / caché inmutable + copia). Subirlo otra vez sin resolver eso reintroduce el bug.
JOBS="${JOBS:-1}"
IDLE_SLEEP="${IDLE_SLEEP:-300}"
# Fichero de lock compartido con campana-deuda.sh (mismo path en los dos, o no hay exclusión).
LOCK_FARM="${LOCK_FARM:-$HAMMER_DIR/work/.farm-build.lock}"