No modo --dry-run
, rsync
determina quais arquivos precisam ser transferidos, mas na verdade não transferem seus dados - porque não há nenhum uso para fazer isso, naturalmente. Isto implica que não realiza delta matching - porque faz parte da lógica de transferência de dados.
A razão para os números refletirem que é ... bem ... que o código mostra estatísticas reais , e não algumas estatísticas "possíveis".
Segue-se uma comparação entre rsync -avvv --log-file=rsync.log --no-whole-file --stats doc doc2
para a pasta doc
na árvore rsync
source, entre --dry-run
e sincronização normal (com timestamps despojados, diferenças PID e estatísticas de heap):
delta-transmission enabled
recv_generator(doc,1)
recv_generator(doc,2)
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
recv_generator(doc/README-SGML,3)
recv_generator(doc/profile.txt,4)
recv_generator(doc/rsync.sgml,5)
send_files(2, doc)
cd+++++++++ doc/
send_files(3, doc/README-SGML)
+send_files mapped doc/README-SGML of size 672
+calling match_sums doc/README-SGML
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/README-SGML
+sender finished doc/README-SGML
send_files(4, doc/profile.txt)
+send_files mapped doc/profile.txt of size 1935
+calling match_sums doc/profile.txt
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/profile.txt
+sender finished doc/profile.txt
send_files(5, doc/rsync.sgml)
+send_files mapped doc/rsync.sgml of size 11843
+calling match_sums doc/rsync.sgml
+sending file_sum
+false_alarms=0 hash_hits=0 matches=0
+>f+++++++++ doc/rsync.sgml
+sender finished doc/rsync.sgml
recv_files(1) starting
recv_files(doc)
recv_files(doc/README-SGML)
+got file_sum
+set modtime of doc/.README-SGML.hkH0u5 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.README-SGML.hkH0u5 to doc/README-SGML
recv_files(doc/profile.txt)
+got file_sum
+set modtime of doc/.profile.txt.Wdf4x9 to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.profile.txt.Wdf4x9 to doc/profile.txt
recv_files(doc/rsync.sgml)
+got file_sum
+set modtime of doc/.rsync.sgml.JSte5H to (1463404939) Mon May 16 16:22:19 2016
+renaming doc/.rsync.sgml.JSte5H to doc/rsync.sgml
generate_files phase=1
+set modtime of doc to (1463404939) Mon May 16 16:22:19 2016
send_files phase=1
recv_files phase=1
generate_files phase=2
send_files phase=2
send files finished
-total: matches=0 hash_hits=0 false_alarms=0 data=0
+total: matches=0 hash_hits=0 false_alarms=0 data=14450
Number of files: 4 (reg: 3, dir: 1)
Number of created files: 4 (reg: 3, dir: 1)
Number of deleted files: 0
Number of regular files transferred: 3
Total file size: 14,450 bytes
Total transferred file size: 14,450 bytes
-Literal data: 0 bytes
+Literal data: 14,450 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes received 793 bytes 378.40 bytes/sec
-total size is 14,450 speedup is 15.27 (DRY RUN)
-[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)
+Total bytes sent: 14,723
+Total bytes received: 1,435
+sent 14,723 bytes received 1,435 bytes 4,616.57 bytes/sec
+total size is 14,450 speedup is 0.89
+[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0)
O seguinte é um diff entre o dry run inicial e um dry run depois que eu 1) fiz uma sincronização real, 2) editei um arquivo, rsync.sgml
. Isso mostra que o delta matching não é feito em uma execução seca:
received 3 names
recv_file_list done
get_local_name count=4 doc2
-created directory doc2
delta-transmission enabled
recv_generator(doc,1)
recv_generator(doc,2)
recv_generator(doc/README-SGML,3)
+doc/README-SGML is uptodate
recv_generator(doc/profile.txt,4)
+doc/profile.txt is uptodate
recv_generator(doc/rsync.sgml,5)
send_files(2, doc)
<...>
Number of files: 4 (reg: 3, dir: 1)
-Number of created files: 4 (reg: 3, dir: 1)
+Number of created files: 0
Number of deleted files: 0
-Number of regular files transferred: 3
-Total file size: 14,450 bytes
-Total transferred file size: 14,450 bytes
+Number of regular files transferred: 1
+Total file size: 14,476 bytes
+Total transferred file size: 11,869 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
-File list generation time: 0.010 seconds
+File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
-Total bytes sent: 153
-Total bytes received: 793
-sent 153 bytes received 793 bytes 1,892.00 bytes/sec
-total size is 14,450 speedup is 15.27 (DRY RUN)
+Total bytes sent: 157
+Total bytes received: 830
+sent 157 bytes received 830 bytes 658.00 bytes/sec
+total size is 14,476 speedup is 14.67 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1196): about to call exit(0) (DRY RUN)
Agora, em relação à sua tarefa - para verificar se há espaço suficiente no destino para a sincronização real.
Como você pode ver no diff,
- arquivos são copiados um por um,
- cada arquivo é gravado em um nome temporário e movido sobre o original
Portanto, a quantidade de espaço necessária no destino é:
-
sum( max(existing_size,new_size) for all files to be synced) + max( (new_size) for all files to be synced)
O primeiro termo é o pior cenário para a quantidade de dados "finais" a qualquer momento, o segundo é o espaço para uma cópia temporária.
Cada tamanho de arquivo pode ser preenchido até um múltiplo de um tamanho de unidade de armazenamento para permitir espaço desperdiçado (se aplicável para o FS de destino e a quantidade total esperada é alta o suficiente para fazer a diferença).