rsync: --no-whole-file não funciona se uma linha adicionada à cauda do arquivo

0

Minha pergunta está relacionada à pergunta por que o rsync não faz a transferência delta .

Primeiro, crio um arquivo de 1GB e transfiro para a pasta /target usando o rsync. Mais tarde, adicionei s doo string à cauda desse arquivo. Quando transfiro o mesmo arquivo para a pasta /target , observo que o arquivo completo foi transferido em vez de transferir apenas sua seção atualizada.

[Q] Como eu poderia forçar o rsync a fazer delta transferir apenas a seção atualizada do arquivo? É possível ou minha única opção é transferir todo o arquivo novamente?

Exemplo:

$ mkdir target
$ fallocate -l 1G target/temp_1GB_file
$ rsync --inplace --no-whole-file  --size-only --progress temp_1GB_file doo
temp_10GB_file
  1073741824 100%  227.30MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131163 bytes  received 229425 bytes  48078.40 bytes/sec
total size is 1073741824  speedup is 2977.75

$ echo 'doo' >> temp_10GB_file
$ rsync --no-whole-file  --size-only --progress temp_1GB_file doo # Here complete file has been transferred all over again.
  temp_10GB_file
  1073741828 100%  226.44MB/s    0:00:04 (xfer#1, to-check=0/1)

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74
    
por alper 15.05.2018 / 14:23

2 respostas

2

Você não transferiu o arquivo inteiro:

sent 131171 bytes  received 229418 bytes  48078.53 bytes/sec
total size is 1073741828  speedup is 2977.74

A saída detalhada mostra que apenas uma parte do arquivo foi transferida na segunda chamada para rsync .

rsync inicia um subprocesso para o remetente e um para o receptor, e estes enviam somas de verificação e dados entre si.

rsync blocos de checksums do arquivo. Por padrão, o tamanho do bloco depende do tamanho do arquivo. Se uma soma de verificação para um bloco for incompatível entre o emissor e o receptor, os dados do bloco são transferidos. O último bloco foi modificado pela adição de uma string, de modo que teve que ser transferido.

Veja também a opção -B no manual rsync .

    
por 15.05.2018 / 15:29
1

Você não transferiu todo o arquivo, mas a origem e o destino foram lidos na íntegra para determinar as diferenças.

Com --no-whole-file você trocou um simples "substitua o arquivo copiando em sua totalidade" por um mais complexo "leia a fonte e calcule suas somas de verificação; leia o destino e calcule suas somas de verificação; atualize as diferenças".

Em um sistema que tenho aqui, demorou mais tempo para executar a segunda operação do que apenas sobrescrever com o original. (Os tempos têm uma variação de cerca de +/- 3 segundos em várias tentativas.)

  • 29 segundos para copiar o original
  • 28 segundos para copiar o original atualizado com o padrão --whole-file
  • 59 segundos para comparar e copiar o original atualizado com --no-whole-file

Existem (boas) razões pelas quais rsync às vezes não usa o algoritmo de transferência delta.

    
por 20.05.2018 / 14:33

Tags