Чому мій rsync не дозволяє розмір блоку> 128K?


15

Запуск rsync з великим *, --block-size як це:

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

Я отримую таку помилку:

Invalid block length 1048576 [sender]

На обох кінцях працює 64-бітний CentOS 6.4. Від Googling я бачив, що він --block-sizeвикористовувався зі значно більшими значеннями, чому це не працює для мене?

* Я використовую великий розмір блоку, тому що я намагаюся обійти помилку, де rsync просто повертає процесор назавжди на 44% у файл 300 Гб

rsync 

Відповіді:


13

З джерела :

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

Де :

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

Що становить 536870912(512 М) і 131072(128 к) відповідно.


Ця зміна була зроблена в версії v3.0.0 і підтримка OLD_була додана в 3.0.3 . (Посилання пояснюють деякі обґрунтування змін.)

  • [PATCH] Патч, щоб спробувати зробити так, щоб дійсно великі файли оброблялися, не замикаючись при пошуку хештету на стороні відправника.

  • [PATCH] Виправлено надсилання великих файлів із старими версіями rsync шляхом обробки старого обмеження розміру блоку для протоколів <29.


1
Все ще здається помилка в 3.0.x в обробці розміру блоку під --dry-run. Команда без --dry-run може працювати, але з нею все одно призводить до повідомлення "Недійсна довжина блоку NNN [відправника]".
Пол Гір

Захоплююче, що я щойно наткнувся на нюанс, згаданий @PaulGear, через 3 роки, і це все ще проблема в Ubuntu 18? v3.1.2
TonyG

3

Максимальний розмір блоку залежить від версії протоколу rsync.

При версії протоколу менше 30 макс. 1 << 29Становив 536870912 байт (512 М). Але з версією протоколу 30 або вище, максимум 1 << 17становить 128 кбайт. Тому вам потрібно використовувати більш стару версію, якщо ви хочете збільшити розмір блоків.

Джерело: rsync.h

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

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

І: іо.с

// ...
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());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.