Minha pergunta está relacionada a por que o rsync não faz a pergunta de transferência delta.
Primeiro, crio um arquivo de 1 GB e transfiro para a /target
pasta usando o rsync. Mais tarde, adicionei uma doo
string ao final desse arquivo. Quando transfiro o mesmo arquivo para a /target
pasta, observo que o arquivo completo foi transferido em vez de transferir apenas sua seção atualizada.
[P] Como eu poderia forçar o rsync a fazer a transferência delta apenas da seção atualizada do arquivo? É possível ou minha única opção é transferir o arquivo completo 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
Você não transferiu o arquivo inteiro:
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 outro para o destinatário, e estes enviam checksums e dados entre si.rsync
blocos de somas de verificação 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 remetente e o destinatário, todo o bloco será transferido. O último bloco foi modificado adicionando uma string, de modo que teve que ser transferido. É por isso que você vê 131171 bytes sendo transferidos em vez de apenas o número de bytes realmente alterados no arquivo (o tamanho do bloco é de cerca de 130 KB para esse arquivo específico).Veja também a
-B
opção norsync
manual.Você não transferiu o arquivo inteiro, mas a origem e o destino foram lidos em sua totalidade para determinar as diferenças.
Com
--no-whole-file
você trocou um simples "substituir o arquivo copiando-o em sua totalidade" por um mais complexo "ler a fonte e calcular suas somas de verificação; ler o destino e calcular suas somas de verificação; atualizar as diferenças".Em um sistema que tenho aqui, demorou mais para executar a segunda operação do que apenas substituir o original. (Os tempos têm uma variação de cerca de +/- 3 segundos em várias tentativas.)
--whole-file
--no-whole-file
Existem (boas) razões pelas quais
rsync
às vezes não usa o algoritmo de transferência delta.