¿Por qué mi rsync no permite el tamaño de bloque> 128K?


15

Ejecutando rsync con un gran * --block-size como este:

rsync -avvz --rsh 'ssh -c arcfour' --block-size 1048576 --inplace --progress example.com:/big.file /big.file

Obtuve el siguiente error:

Invalid block length 1048576 [sender]

Ambos extremos están ejecutando CentOS 6.4 de 64 bits. En Google he visto que se --block-sizeusan con valores mucho más altos, ¿por qué esto no funciona para mí?

* Estoy usando un tamaño de bloque grande porque estoy tratando de evitar un error en el que rsync solo gira la CPU para siempre un 44% en un archivo de 300 GB

rsync 

Respuestas:


13

De la fuente :

int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;

sum->blength = read_int(f);
if (sum->blength < 0 || sum->blength > max_blength) {
    rprintf(FERROR, "Invalid block length %ld [%s]\n",
        (long)sum->blength, who_am_i());
    exit_cleanup(RERR_PROTOCOL);
}

Donde :

#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)
#define MAX_BLOCK_SIZE ((int32)1 << 17)

Que es 536870912(512M) y 131072(128k) respectivamente.


El cambio se realizó en la versión v3.0.0 y OLD_se agregó soporte para v3.0.3 . (Los enlaces explican algunos de los fundamentos de los cambios).

  • [PATCH] Un parche para intentar hacer que los archivos realmente grandes se manejen sin atascarse en la búsqueda de tabla hash del remitente.

  • [PATCH] Se corrigió el envío de archivos grandes con versiones rsync anteriores al manejar el límite de tamaño de bloque anterior para los protocolos <29.


1
Todavía parece haber un error en 3.0.x en el manejo del tamaño de bloque bajo --dry-run. Un comando sin --dry-run puede funcionar, pero aún así da como resultado el mensaje "Longitud de bloque no válida NNN [remitente]".
Paul Gear

Fascinante que acabo de encontrar el matiz mencionado por @PaulGear, más de 3 años después y ¿esto sigue siendo un problema en Ubuntu 18 con? v3.1.2
TonyG

3

El tamaño máximo de bloque depende de la versión del protocolo rsync.

Con una versión de protocolo inferior a 30, el máximo era 1 << 29, es decir, 536870912 bytes (512M). Pero con la versión de protocolo 30 o superior, el máximo es 1 << 17, que es de 128k bytes. Por lo tanto, deberá usar una versión anterior si desea bloques de mayor tamaño.

Fuente: rsync.h

#define MAX_BLOCK_SIZE ((int32)1 << 17)

/* For compatibility with older rsyncs */
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)

Y: io.c

// ...
int32 max_blength = protocol_version < 30 ? OLD_MAX_BLOCK_SIZE : MAX_BLOCK_SIZE;
// ...
if (sum->blength < 0 || sum->blength > max_blength) {
  rprintf(FERROR, "Invalid block length %ld [%s]\n",
                  (long)sum->blength, who_am_i());
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.