diff --git a/scripts/respaldo-storagebox.sh b/scripts/respaldo-storagebox.sh index 66c186bf..64603480 100755 --- a/scripts/respaldo-storagebox.sh +++ b/scripts/respaldo-storagebox.sh @@ -153,7 +153,13 @@ else echo "⚠ este rsync no trae zstd (compress list sin él) ⇒ comprimo con zlib." echo " Es ~la mitad de rendimiento efectivo. Se arregla en recipes/rsync.toml (dep zstd)." fi -RS="rsync -a --partial-dir=.rsync-partial --exclude /.dmerge $PROG $COMPRESION" +# ⚠ `--chmod=Fu+w` NO es cosmético: sin él, un parcial interrumpido queda en el destino con el modo +# del origen —el store es `-r--r--r--` por diseño— y **ningún intento posterior puede reescribirlo**. +# Eso envenena esa ruta PARA SIEMPRE (medido el 2026-09-17: 40 reintentos contra el mismo .ttf). Con +# los ficheros del respaldo escribibles por su dueño, un corte a mitad se retoma en vez de trabarse. +# El precio es que la copia no conserva el bit de sólo-lectura; es un precio bajo: el contenido es lo +# que se respalda, y los permisos del store los reconstruye el propio store. +RS="rsync -a --chmod=Fu+w --partial-dir=.rsync-partial --exclude /.dmerge $PROG $COMPRESION" # ── REINTENTOS: EL ENLACE SE CAE, Y ESO NO ES EXCEPCIONAL ─────────────────────────────────────── # Primera corrida real (2026-08-07): tras subir el cerebro y 2,3 G de store, murió con @@ -172,7 +178,27 @@ reintentar() { "$@" && return 0 rc=$? case "$rc" in - 10|12|23|30|35|255) ;; # red / pipe roto / timeout: insistir + 10|12|30|35|255) ;; # red / pipe roto / timeout: insistir + # ⚠ 23 NO ES NECESARIAMENTE RED, y creerlo costó 40 reintentos inútiles (2026-09-17). El + # respaldo desde la caja se cayó 40 veces seguidas con el MISMO fichero: + # + # open ".../fonts/dejavu/.rsync-partial/DejaVuSans-Oblique.ttf" failed: No such file… (2) + # + # La causa: una transferencia interrumpida el 11-sep dejó ese PARCIAL en el destino con modo + # `-r--r--r--` (el del origen: el store es de sólo lectura por diseño). Ningún intento + # posterior puede reescribirlo, así que el fallo es ETERNO — y el bucle lo llamaba «corte de + # red» y volvía a intentar cada 60 s. Es exactamente la pared que la cabecera de esta función + # dice que no hay que golpear 40 veces. + # + # ⇒ al 23 se le dan TRES intentos, no cuarenta, y al tercero se nombra la causa probable. + 23) + if [ "$intento" -ge 3 ]; then + echo "!! $etiqueta: rsync 23 tres veces seguidas. NO parece red: mirá si quedó un" >&2 + echo "!! parcial de sólo lectura en el destino (\`.rsync-partial/\` dentro del árbol)." >&2 + echo "!! Se borra a mano en el Storage Box y la corrida siguiente pasa." >&2 + return "$rc" + fi + ;; # 24 = «ficheros de origen desaparecieron durante la transferencia». NO es un fallo: pasa # cuando `store-gc.sh` poda artefactos superados mientras el respaldo corre, que es una # combinación NORMAL en este proyecto (el respaldo dura ~19 h y la poda es la válvula del