Por que meu rsync não permite tamanho de bloco> 128K?

15

Executando o rsync com um grande * --block-size como este:

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

Estou tendo o erro a seguir:

Invalid block length 1048576 [sender]

Ambas as extremidades estão executando o CentOS 6.4 de 64 bits. No Google, eu já vi --block-sizeusado com valores muito mais altos, por que isso não está funcionando para mim?

* Estou usando um tamanho de bloco grande porque estou tentando solucionar um bug em que o rsync gira a CPU para sempre 44% em um arquivo de 300 GB


fonte

Respostas:

13

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

Onde :

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

Qual é 536870912(512M) e 131072(128k), respectivamente.


A alteração foi feita na versão v3.0.0 e o suporte OLD_foi adicionado na v3.0.3 . (Os links explicam algumas das razões por trás das mudanças.)

  • [PATCH] Um patch para tentar fazer com que arquivos realmente grandes sejam manipulados sem atolar na pesquisa de hashtable do lado do remetente.

  • [PATCH] Corrigido o envio de arquivos grandes com versões mais antigas do rsync, manipulando o antigo limite de tamanho de bloco para protocolos <29.

Runium
fonte
1
Ainda parece haver um bug no 3.0.x no processamento de tamanho de bloco em --dry-run. Um comando sem --dry-run pode funcionar, mas com ele ainda resulta na mensagem "Comprimento do bloco inválido NNN [remetente]".
Paul Gear
Fascinante que eu acabei de encontrar a nuance mencionada pelo @PaulGear, mais de 3 anos depois e isso ainda é um problema no Ubuntu 18? v3.1.2
TonyG
3

O tamanho máximo do bloco depende da versão do protocolo rsync.

Com a versão do protocolo menor que 30, o máximo era 1 << 29, ou seja, 536870912 bytes (512M). Mas com a versão 30 ou superior do protocolo, o máximo 1 << 17é 128 bytes. Portanto, você precisará usar uma versão mais antiga se desejar tamanhos de bloco maiores.

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());
Esteira
fonte