Perché il mio rsync non consente blocchi di dimensioni> 128 KB?


15

Esecuzione di rsync con un grande * --block-size come questo:

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

Ottengo il seguente errore:

Invalid block length 1048576 [sender]

Entrambe le estremità eseguono CentOS 6.4 a 64 bit. Da Google che ho visto --block-sizeusato con valori molto più alti, perché questo non funziona per me?

* Sto usando blocchi di grandi dimensioni perché sto cercando di aggirare un bug in cui rsync trasforma la CPU per sempre il 44% in un file da 300 GB

rsync 

Risposte:


13

Dalla fonte :

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);
}

Dove :

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

Che è rispettivamente 536870912(512M) e 131072(128k).


La modifica è stata apportata nella versione v3.0.0 e il supporto per è OLD_stato aggiunto nella v3.0.3 . (I collegamenti spiegano alcune delle motivazioni alla base delle modifiche.)

  • [PATCH] Una patch per provare a far gestire file di dimensioni molto grandi senza impantanarsi nella ricerca hashtable sul lato mittente.

  • [PATCH] Risolto il problema con l'invio di file di grandi dimensioni con versioni rsync precedenti gestendo il vecchio limite di dimensione del blocco per i protocolli <29.


1
Sembra esserci ancora un bug in 3.0.x nella gestione della dimensione del blocco in --dry-run. Un comando senza --dry-run può funzionare, ma con esso risulta comunque nel messaggio "Lunghezza blocco non valida NNN [mittente]".
Paul Gear,

Affascinante che ho appena incontrato la sfumatura menzionata da @PaulGear, oltre 3 anni dopo e questo è ancora un problema in Ubuntu 18? v3.1.2
TonyG,

3

La dimensione massima del blocco dipende dalla versione del protocollo rsync.

Con la versione del protocollo inferiore a 30, il massimo era 1 << 29, cioè 536870912 byte (512 M). Ma con il protocollo versione 30 o successiva, il massimo è 1 << 17, che è 128k byte. Quindi dovrai utilizzare una versione precedente se desideri blocchi di dimensioni maggiori.

Fonte: rsync.h

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

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

E: 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());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.