Mengapa rsync saya tidak mengizinkan ukuran blok> 128K?

15

Menjalankan rsync dengan * besar --block-sizeseperti ini:

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

Saya mendapatkan kesalahan berikut:

Invalid block length 1048576 [sender]

Kedua ujungnya menjalankan 64bit CentOS 6.4. Dari Googling yang pernah saya lihat --block-sizedigunakan dengan nilai yang jauh lebih tinggi, mengapa ini tidak berhasil bagi saya?

* Saya menggunakan ukuran blok besar karena saya mencoba mengatasi bug di mana rsync hanya memutar CPU selamanya 44% menjadi file 300GB


sumber

Jawaban:

13

Dari sumber :

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

Dimana :

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

Yaitu 536870912(512M) dan 131072(128k).


Perubahan tersebut dilakukan dalam versi v3.0.0 dan dukungan untuk OLD_itu ditambahkan dalam v3.0.3 . (Tautan menjelaskan beberapa alasan di balik perubahan tersebut.)

  • [PATCH] Patch untuk mencoba membuat file yang sangat besar ditangani tanpa macet di pencarian hashtable sisi pengirim.

  • [PATCH] Memperbaiki pengiriman file besar dengan versi rsync yang lebih lama dengan menangani batas ukuran blok lama untuk protokol <29.

Runium
sumber
1
Tampaknya masih ada bug di 3.0.x dalam penanganan ukuran blok di bawah --dry-run. Perintah tanpa --dry-run dapat bekerja, tetapi dengan itu masih menghasilkan pesan "Panjang blok NNN [pengirim]" yang tidak valid.
Paul Gear
Menarik bahwa saya baru saja menemukan nuansa yang disebutkan oleh @PaulGear, lebih dari 3 tahun kemudian dan ini masih merupakan masalah di Ubuntu 18 dengan? v3.1.2
TonyG
3

Ukuran blok maksimum tergantung pada versi protokol rsync.

Dengan versi protokol kurang dari 30, maks adalah 1 << 29, yaitu 536870912 byte (512M). Tetapi dengan protokol versi 30 atau lebih, maks adalah 1 << 17, yaitu 128k byte. Jadi, Anda harus menggunakan versi yang lebih lama jika Anda ingin ukuran blok yang lebih besar.

Sumber: rsync.h

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

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

Dan: 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());
Tikar
sumber