Por que meu rsync não permite block-size128K?

14

A executar o rsync com um * --block-size assim:

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

Eu recebo o seguinte erro:

Invalid block length 1048576 [sender]

Ambas as extremidades estão rodando 64bits CentOS 6.4. Do Google Eu vi --block-size usado com valores muito mais altos, por que isso não está funcionando para mim?

* Eu estou usando um tamanho de bloco grande porque estou tentando contornar um bug onde o rsync apenas gira a CPU para sempre 44% em um arquivo de 300GB

    
por Jack Douglas 15.06.2013 / 09:56

2 respostas

13

De a 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 para OLD_ foi adicionado na v3.0.3 . (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 sobrecarregar na pesquisa de hashtable do lado do remetente.

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

por 15.06.2013 / 11:08
4

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

Com versão de protocolo menor que 30, o máximo foi 1 << 29 , ou seja, 536870912 bytes (512M). Mas com a versão de protocolo 30 ou superior, o máximo é 1 << 17 , que é 128k bytes. Então você precisará usar uma versão mais antiga se quiser 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());
    
por 15.06.2013 / 11:04

Tags