Cadena completa medida hoy: el worker depositó 63 artefactos (1,34 GB) en 8 s a 153 MB/s, y el hub los promovió con mv. Respaldo 1542 → 1605, buzón en 0, guardián cuadrando. Contra los 440 kB/s del laptop, 348×. Dos fallos de la prueba, que importan más que el resultado: 1. `ssh` cortaba con «Host key verification failed» porque la granja REUSA IPs y la host key cambia con razón. Como el stderr iba a /dev/null, el error salía como «no obtuve la pública del worker»: culpaba al worker cuando el problema estaba en el known_hosts del laptop. Ahora va por ssh_worker(), que purga la entrada vieja — correcto sólo acá, porque la identidad del worker es su label hcloud, no su llave. 2. verificar-buzon daba «aislado ✓» sin haber probado que escribe. El aviso de host key se comía el head -1, y el testigo se llamaba .btest, que `ls` no muestra. Un testigo invisible no prueba nada. Ahora exige las dos mitades y las dos están verdes: escribe en su buzón, y ../hammer/store no existe para él. Y el progreso de rsync sólo con TTY: sin terminal reescribe con \r y deja miles de copias de la misma línea. 8 segundos bastaron para un log ilegible; en el latido sería cada media hora. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
57 lines
3.8 KiB
Bash
Executable File
57 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# worker-depositar.sh — CORRE EN EL WORKER. Sube al buzón del Storage Box lo que selló y todavía no
|
|
# está respaldado. El laptop no participa: la ruta es worker→box, por dentro de Hetzner.
|
|
#
|
|
# ── POR QUÉ NO LO HACE EL LAPTOP ───────────────────────────────────────────────────────────────
|
|
# Medido el 2026-08-09: el uplink de la oficina da 440 kB/s y el tramo interno de Hetzner 122 MB/s
|
|
# — 280 veces más. Cualquier diseño que haga pasar los bytes por el laptop no se completa nunca.
|
|
# El laptop manda ÓRDENES (la promoción es un `mv`, cero bytes); los DATOS van por acá.
|
|
#
|
|
# ── LAS DOS CREDENCIALES, Y POR QUÉ HACEN FALTA LAS DOS ────────────────────────────────────────
|
|
# `sub1` (sólo lectura, home `hammer`) sirve para PREGUNTAR qué hay ya respaldado. Sin eso el worker
|
|
# resubiría el corpus entero en cada ciclo.
|
|
# `sub2` (escritura, home `incoming`) es el BUZÓN donde deposita. No alcanza a `hammer/store`: el
|
|
# respaldo consolidado no está dentro de su home. Ver `respaldo-subcuenta.sh`.
|
|
#
|
|
# ── UN SOLO rsync CON --files-from, NO UNO POR ARTEFACTO ───────────────────────────────────────
|
|
# El store comparte ficheros entre artefactos por ENLACE DURO. `-H` sólo preserva los enlaces que ve
|
|
# DENTRO de una misma corrida: con un rsync por directorio, cada artefacto viaja como si fuera único
|
|
# y el buzón llega inflado. Una sola invocación con la lista completa los ve todos.
|
|
set -uo pipefail
|
|
STORE="${STORE:-/opt/hammer/store}"
|
|
KEY="${KEY:-/root/.ssh/sb_sub}"
|
|
RO_HOST="${RO_HOST:-u647150-sub1.your-storagebox.de}"; RO_USER="${RO_USER:-u647150-sub1}"
|
|
BZ_HOST="${BZ_HOST:-u647150-sub2.your-storagebox.de}"; BZ_USER="${BZ_USER:-u647150-sub2}"
|
|
SSH_SB="ssh -4 -p 23 -i $KEY -o StrictHostKeyChecking=no -o ServerAliveInterval=30"
|
|
ART='^[0-9a-f]{64}-'
|
|
|
|
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
|
|
ls "$STORE" 2>/dev/null | grep -E "$ART" | sort -u > "$TMP/local.txt"
|
|
$SSH_SB "$RO_USER@$RO_HOST" 'ls store' 2>/dev/null | grep -E "$ART" | sort -u > "$TMP/resp.txt"
|
|
N_L=$(wc -l < "$TMP/local.txt"); N_R=$(wc -l < "$TMP/resp.txt")
|
|
|
|
# Un listado vacío del respaldo es un fallo de red disfrazado de «no hay nada respaldado». Tomarlo
|
|
# por bueno significaría resubir el corpus entero por gusto.
|
|
if [ "$N_R" -eq 0 ]; then
|
|
echo "⚠ el respaldo devolvió 0 artefactos — no deposito (¿enlace caído?)" >&2; exit 1
|
|
fi
|
|
comm -23 "$TMP/local.txt" "$TMP/resp.txt" > "$TMP/nuevos.txt"
|
|
N_N=$(wc -l < "$TMP/nuevos.txt")
|
|
echo "==> store $N_L · respaldo $N_R ⇒ a depositar $N_N"
|
|
[ "$N_N" -eq 0 ] && { echo " nada nuevo"; exit 0; }
|
|
|
|
# `--files-from` con los nombres a secas (son directorios del store) + `-r` para bajar en cada uno.
|
|
# `--info=progress2` SÓLO con terminal: sin TTY reescribe la misma línea con \r y, como nadie
|
|
# interpreta el retorno de carro, el «progreso» se acumula en miles de copias de la misma línea. Un
|
|
# depósito de 8 segundos dejó así un log ilegible; en el latido, cada media hora, sería peor.
|
|
PROG=""; [ -t 1 ] && PROG="--info=progress2"
|
|
# shellcheck disable=SC2086
|
|
rsync -aHr --files-from="$TMP/nuevos.txt" --partial-dir=.rsync-partial $PROG \
|
|
-e "$SSH_SB" "$STORE/" "$BZ_USER@$BZ_HOST:store/" || { echo "⚠ el depósito falló"; exit 1; }
|
|
|
|
# Guardián: recontar el buzón. «rsync salió 0» no es «llegaron N».
|
|
EN_BUZON=$($SSH_SB "$BZ_USER@$BZ_HOST" 'ls store' 2>/dev/null | grep -cE "$ART")
|
|
echo "==> buzón: $EN_BUZON artefactos (depositados esperados: $N_N)"
|
|
[ "$EN_BUZON" -ge "$N_N" ] || { echo "⚠ el buzón tiene MENOS de lo depositado"; exit 1; }
|
|
echo " ahora el hub promueve con scripts/farm/respaldo-promover.sh"
|