ทำไม rsync ของฉันไม่อนุญาตขนาดบล็อก> 128K?


15

ใช้ rsync ด้วย* ขนาดใหญ่--block-sizeเช่นนี้:

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

ฉันได้รับข้อผิดพลาดต่อไปนี้:

Invalid block length 1048576 [sender]

ปลายทั้งสองทำงานโดยใช้ 64 บิต CentOS 6.4 จาก Googling ที่ฉันเคยเห็น--block-sizeใช้แล้วด้วยค่าที่สูงกว่ามากเหตุใดจึงไม่ทำงานสำหรับฉัน

* ฉันใช้บล็อกขนาดใหญ่เพราะฉันพยายามแก้ไขข้อผิดพลาดที่ rsync เพิ่งหมุน CPU ตลอดกาล 44% เป็นไฟล์ 300GB

rsync 

คำตอบ:


13

จากแหล่งที่มา :

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

ที่ไหน :

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

ซึ่งคือ536870912(512M) และ131072(128k) ตามลำดับ


การเปลี่ยนแปลงที่ถูกสร้างขึ้นมาในรุ่นv3.0.0และการสนับสนุนOLD_ที่ถูกเพิ่มเข้ามาใน v3.0.3 (ลิงก์อธิบายเหตุผลบางประการที่อยู่เบื้องหลังการเปลี่ยนแปลง)

  • [แพทช์] แพทช์ที่พยายามสร้างไฟล์ที่มีขนาดใหญ่มาก ๆ ได้รับการจัดการโดยไม่ต้องไปยุ่งกับการค้นหา hashtable ด้านผู้ส่ง

  • [PATCH] แก้ไขการส่งไฟล์ขนาดใหญ่ด้วยเวอร์ชั่น rsync ที่เก่ากว่าโดยจัดการขีด จำกัด ขนาดบล็อกเก่าสำหรับโปรโตคอล <29


1
ยังคงมีข้อผิดพลาดใน 3.0.x ในการจัดการขนาดบล็อกภายใต้ --dry-run คำสั่งที่ไม่มี --dry-run สามารถทำงานได้ แต่ยังคงส่งผลให้ข้อความ "ความยาวของบล็อกที่ไม่ถูกต้อง NNN [ผู้ส่ง]"
พอลเกียร์

น่าสนใจที่ฉันเพิ่งพบกับความแตกต่างที่ @PaulGear พูดถึงในอีก 3 ปีต่อมาและนี่ก็ยังเป็นปัญหาใน Ubuntu 18 ด้วยหรือไม่? v3.1.2
TonyG

3

ขนาดบล็อกสูงสุดขึ้นอยู่กับรุ่นโปรโตคอล rsync

ด้วยโปรโตคอลรุ่นน้อยกว่า 30 ค่าสูงสุด1 << 29คือ 536870912 ไบต์ (512M) แต่ด้วยโปรโตคอลรุ่น 30 หรือสูงกว่าค่าสูงสุด1 << 17คือ 128k ไบต์ ดังนั้นคุณจะต้องใช้รุ่นที่เก่ากว่าถ้าคุณต้องการขนาดบล็อกที่ใหญ่กว่า

ที่มา: rsync.h

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

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

และ: 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());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.