Почему мой rsync не позволяет размер блока> 128 КБ?

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. Из Google, который я видел, --block-sizeиспользовал гораздо более высокие значения, почему это не работает для меня?

* Я использую большой размер блока, потому что я пытаюсь обойти ошибку, при которой rsync просто раскручивает процессор на 44% навсегда в файл объемом 300 ГБ.


источник

Ответы:

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(512M) и 131072(128k) соответственно.


Изменение было внесено в версию v3.0.0, а поддержка vOLD_ была добавлена ​​в v3.0.3 . (Ссылки объясняют некоторые причины изменений.)

  • [PATCH] Патч, чтобы попытаться заставить действительно большие файлы обрабатываться без сбоев в хеш-таблице поиска отправителя.

  • [PATCH] Исправлена ​​отправка больших файлов со старыми версиями rsync путем обработки старого ограничения на размер блока для протоколов <29.

Runium
источник
1
Кажется, в 3.0.x все еще есть ошибка в обработке размера блока в --dry-run. Команда без --dry-run может работать, но при этом все равно выдает сообщение «Недопустимая длина блока NNN [отправитель]».
Пол Гир
Интересно, что я только что столкнулся с нюансом, упомянутым @PaulGear, спустя 3 года, и это все еще проблема в Ubuntu 18 с? v3.1.2
TonyG
3

Максимальный размер блока зависит от версии протокола rsync.

При версии протокола менее 30 максимальное значение составило 1 << 29536870912 байт (512M). Но с протоколом версии 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)

И: 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());
Мат
источник