Warum erlaubt mein rsync keine Blockgröße> 128K?

15

Ausführen von rsync mit einem großen * --block-size wie folgt:

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

Ich erhalte folgenden Fehler:

Invalid block length 1048576 [sender]

Auf beiden Seiten läuft 64bit CentOS 6.4. Von Googeln habe ich gesehen --block-size, mit viel höheren Werten verwendet, warum funktioniert das bei mir nicht?

* Ich verwende eine große Blockgröße, weil ich versuche, einen Fehler zu umgehen, bei dem rsync die CPU für immer um 44% in eine 300-GB-Datei dreht


quelle

Antworten:

13

Aus der Quelle :

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

Wo :

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

Welches ist 536870912(512M) und 131072(128k) jeweils.


Die Änderung wurde in Version 3.0.0 vorgenommen und die Unterstützung für OLD_wurde in Version 3.0.3 hinzugefügt . (Links erläutern einige der Gründe für die Änderungen.)

  • [PATCH] Ein Patch, mit dem versucht wird, wirklich große Dateien zu erstellen, ohne sich bei der Suche nach Absender-Hashtabellen zu verzetteln.

  • [PATCH] Das Senden großer Dateien mit älteren rsync-Versionen wurde behoben, indem die alte Blockgrößenbeschränkung für Protokolle <29 verwendet wurde.

Runium
quelle
1
Es scheint immer noch einen Fehler in 3.0.x bei der Blockgrößenbehandlung unter --dry-run zu geben. Ein Befehl ohne --dry-run kann funktionieren, führt aber trotzdem zur Meldung "Ungültige Blocklänge NNN [Absender]".
Paul Gear
Faszinierend, dass ich über 3 Jahre später auf die von @PaulGear erwähnte Nuance gestoßen bin und dies immer noch ein Problem mit Ubuntu 18 ist? v3.1.2
TonyG
3

Die maximale Blockgröße hängt von der Version des rsync-Protokolls ab.

Bei einer Protokollversion unter 30 war das 1 << 29Maximum 536870912 Byte (512 MB). Ab Protokollversion 30 beträgt die maximale 1 << 17Größe jedoch 128 KB. Wenn Sie also größere Blöcke benötigen, müssen Sie eine ältere Version verwenden.

Quelle: rsync.h

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

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

Und: 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());
Matte
quelle