From 442a319499b201f56368306c0afeb59818d299ca Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 5 Sep 2026 03:49:56 +0000 Subject: [PATCH] =?UTF-8?q?lab=20re-pineado=20con=20lld=20(d1e341d5)=20?= =?UTF-8?q?=E2=80=94=20y=20el=20sha=20=C2=ABdeterminista=C2=BB=20lo=20ensu?= =?UTF-8?q?ciaba=20un=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Al ir a re-pinear la imagen para propagar el `lld` a la granja, hub y worker empaquetaron a shas DISTINTOS. La imagen se creó para que el sha VERIFIQUE, así que un desacuerdo ahí no se pinea: se mide. Los dos rootfs son idénticos: 9550 entradas con la misma lista de ficheros, los mismos tamaños, y CERO diferencias de metadato (modo, nlink, destino de symlink) en las 8778 entradas de fichero y symlink. La única diferencia de contenido en todo el rootfs era `var/log/apk.log`, donde apk anota la FECHA de cada operación — o sea que dos labs equivalentes empaquetaban distinto sólo porque las instalaciones ocurrieron en momentos distintos. Un sha que no se puede reproducir desde un rootfs equivalente no verifica nada, que es justo lo que este fichero existe para dar. Se excluye ese log del tar (no todo `var/log`: cambio mínimo; apk lo recrea solo). Con la exclusión, hub y worker dan el MISMO tar: 179d04f054f28d8dafe7c626d6b8c686a33a00a96715ee544a9bcf6f62cf586d. ⇒ LA GRANJA YA ESTABA SINCRONIZADA Y AHORA SE PUEDE DEMOSTRAR, sin correr `--traer` en un worker que está construyendo firefox — reemplazarle el rootfs a mitad de build habría sido la forma cara de descubrir lo mismo. Nueva imagen publicada: hammer/lab/lab-d1e341d5….tar.zst (310 M), pin actualizado en bootstrap-devfs.sh. Queda en el comentario cómo comparar dos máquinas: se compara el TAR y no el `.tar.zst`, porque el sha comprimido depende de la versión de zstd de cada máquina y dos labs idénticos con zstd distintos darían un falso desacuerdo. --- scripts/bootstrap-devfs.sh | 2 +- scripts/lab-image.sh | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/scripts/bootstrap-devfs.sh b/scripts/bootstrap-devfs.sh index 53525d84..8afdc83b 100755 --- a/scripts/bootstrap-devfs.sh +++ b/scripts/bootstrap-devfs.sh @@ -79,7 +79,7 @@ mkdir -p "$DEVFS" "$TOOLS" "$CACHE" "$WORK" # `--from-scratch` recupera el camino viejo (minirootfs + apk). Es como se FABRICA una imagen nueva: # ./scripts/bootstrap-devfs.sh --from-scratch && ./scripts/lab-image.sh --crear # y después se pinea el sha nuevo acá abajo. Reconstruir el corpus es el precio de ese cambio. -LAB_IMAGE_SHA256="${LAB_IMAGE_SHA256:-8ae9792aa66477457bf2f69287838fb68707964904a81e5f70d08feed9ec9ca2}" +LAB_IMAGE_SHA256="${LAB_IMAGE_SHA256:-d1e341d5dd434a11e2290b0340069ce4a83563eac8e4481f379b4951b1162045}" if [[ $FROM_SCRATCH -eq 0 ]] && [[ ! -f "$ROOTFS/bin/busybox" ]]; then log "rootfs: trayendo la imagen pineada del lab" diff --git a/scripts/lab-image.sh b/scripts/lab-image.sh index 6035c595..221c5853 100755 --- a/scripts/lab-image.sh +++ b/scripts/lab-image.sh @@ -48,9 +48,31 @@ REMOTO="hammer/lab" log() { printf '\033[1;34m==>\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m✓\033[0m %s\n' "$*"; } +# ── POR QUÉ SE EXCLUYE `var/log/apk.log` (2026-09-05) ─────────────────────────────────────────── +# El tar es determinista a propósito (ver la cabecera), pero `apk` escribe en ese log una línea con +# la FECHA de cada operación. O sea: dos rootfs con exactamente los mismos paquetes, los mismos +# ficheros, los mismos modos y los mismos hardlinks empaquetan a shas DISTINTOS, sólo porque las +# instalaciones ocurrieron en momentos distintos. Eso rompe justo lo que este fichero existe para +# dar: si el sha no se puede reproducir desde un rootfs equivalente, no verifica nada. +# +# Medido el día que se añadió `lld` al lab: hub y worker quedaron con listas de ficheros IDÉNTICAS +# (9550 entradas), metadatos idénticos (modo, nlink, destino de symlink: 0 diferencias) y **una sola +# diferencia de contenido en todo el rootfs**: `var/log/apk.log`. Con esa exclusión los dos labs +# empaquetan igual y se puede DEMOSTRAR que la granja está sincronizada sin reemplazarle el rootfs a +# un worker que está construyendo. +# +# Se excluye el log y no todo `var/log` a propósito: cambio mínimo dirigido. `apk` lo recrea solo en +# la siguiente operación. +# +# COMPARAR DOS MÁQUINAS SIN REEMPLAZARLE EL ROOTFS A NINGUNA — corré esto en las dos y compará: +# tar --sort=name --mtime=@1 --owner=0 --group=0 --numeric-owner \ +# --exclude alpine/var/log/apk.log -C .dev-fs -cf - alpine | sha256sum +# Se compara el TAR y no el `.tar.zst`: el sha comprimido depende de la versión de zstd de cada +# máquina, así que dos labs idénticos con zstd distintos darían un falso desacuerdo. empaquetar() { # $1 = destino [ -d "$ROOTFS" ] || { echo "no existe $ROOTFS — corré bootstrap-devfs.sh primero" >&2; exit 1; } tar --sort=name --mtime=@1 --owner=0 --group=0 --numeric-owner \ + --exclude alpine/var/log/apk.log \ -C "$DEVFS" -cf - alpine \ | zstd -19 -T0 -q -o "$1" -f }