Dlaczego mój rsync nie pozwala na rozmiar bloku> 128 KB?

15

Uruchamianie rsync z dużą * --block-size taką:

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

Otrzymuję następujący błąd:

Invalid block length 1048576 [sender]

Na obu końcach działa 64-bitowy CentOS 6.4. Od Googlinga, który widziałem --block-sizeużywany z dużo wyższymi wartościami, dlaczego to nie działa dla mnie?

* Używam dużego rozmiaru bloku, ponieważ próbuję obejść błąd, w którym rsync po prostu obraca procesor na zawsze 44% do pliku 300 GB


źródło

Odpowiedzi:

13

Ze źródła :

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

Gdzie :

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

Który jest odpowiednio 536870912(512M) i 131072(128k).


Zmiana została wprowadzona w wersji 3.0.0, a obsługa wersji OLD_została dodana w wersji 3.0.3 . (Linki wyjaśniają niektóre uzasadnienia zmian).

  • [PATCH] Łatka, która próbuje sprawić, że naprawdę duże pliki będą obsługiwane bez zagłębiania się w wyszukiwanie hashtable po stronie nadawcy.

  • [PATCH] Naprawiono wysyłanie dużych plików ze starszymi wersjami rsync, obsługując stary limit wielkości bloku dla protokołów <29.

Runium
źródło
1
W wersji 3.0.x wydaje się nadal występować błąd w obsłudze rozmiaru bloku w opcji --dry-run. Polecenie bez opcji --dry-run może działać, ale nadal powoduje wyświetlenie komunikatu „Nieprawidłowa długość bloku NNN [nadawca]”.
Paul Gear,
Fascynujące, że właśnie natknąłem się na niuans wspomniany przez @PaulGear, ponad 3 lata później i nadal jest to problem w Ubuntu 18? v3.1.2
TonyG
3

Maksymalny rozmiar bloku zależy od wersji protokołu rsync.

W przypadku wersji protokołu mniejszej niż 30 maksymalna wynosiła 1 << 29536870912 bajtów (512M). Ale w przypadku protokołu w wersji 30 lub nowszej maksymalna wartość 1 << 17wynosi 128 KB. Musisz więc użyć starszej wersji, jeśli chcesz mieć większe rozmiary bloków.

Źródło: rsync.h

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

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

I: 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());
Mata
źródło