Neden rsync 128K'den büyük blok boyutuna izin vermiyor?


15

Rsync'i böyle büyük bir * ile çalıştırmak --block-size:

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

Aşağıdaki hatayı alıyorum:

Invalid block length 1048576 [sender]

Her iki uç da 64bit CentOS 6.4 çalıştırıyor. --block-sizeÇok daha yüksek değerlerle kullanıldığını gördüğüm Googling'den , bu neden benim için çalışmıyor?

* Büyük bir blok boyutu kullanıyorum çünkü rsync'in CPU'yu sadece% 44'ünü 300GB'lık bir dosyaya döndürdüğü bir hata etrafında çalışıyorum

rsync 

Yanıtlar:


13

Gönderen kaynağı :

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

Nerede :

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

Hangisi sırasıyla 536870912(512M) ve 131072(128k).


Değişim versiyonu yapıldı V3.0.0 ve destek OLD_oldu V3.0.3 eklendi . (Bağlantılar, değişikliklerin arkasındaki mantığı açıklıyor.)

  • [PATCH] Gönderen tarafı karma aramada gerçekten büyük dosyaların işlenmesini önlemek için bir yama.

  • [PATCH] <29 protokolleri için eski blok boyutu sınırını kullanarak eski rsync sürümlerine sahip büyük dosyaların gönderilmesi düzeltildi.


1
Hala - kuru çalışma altında blok boyutu işlemede 3.0.x bir hata var gibi görünüyor. --Dry-run içermeyen bir komut çalışabilir, ancak yine de "Geçersiz blok uzunluğu NNN [gönderen]" iletisiyle sonuçlanır.
Paul Gear

@PaulGear'ın bahsettiği nüansla 3 yıl sonra karşılaştığım büyüleyici ve bu hala Ubuntu 18'de bir sorun mu var? v3.1.2
TonyG

3

Maksimum blok boyutu rsync protokol sürümüne bağlıdır.

Protokol versiyonu 30'dan az olduğunda, maksimum 1 << 29, yani 536870912 bayt (512M) idi. Ancak protokol sürümü 30 veya üstü ile, 1 << 17128k bayt olan maks . Bu nedenle, daha büyük blok boyutları istiyorsanız daha eski bir sürüm kullanmanız gerekir.

Kaynak: rsync.h

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

/* For compatibility with older rsyncs */
#define OLD_MAX_BLOCK_SIZE ((int32)1 << 29)

Ve: 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());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.