为什么我的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。从谷歌搜索中,我看到--block-size使用了更高的值,为什么这对我不起作用?

* 我使用的是大块数据块,因为我正试图解决一个错误,即rsync会将CPU永久旋转44%到300GB文件中

rsync 

Answers:


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版本中进行了更改,并在v3.0.3OLD_添加了对它的支持。(链接说明了更改背后的一些基本原理。)

  • [补丁]一个补丁,试图使真正的大文件得到处理,而不会陷入发件人端哈希表搜索的困境。

  • [PATCH]通过处理协议<29的旧块大小限制,修复了使用较早的rsync版本发送大文件的问题。


1
在--dry-run下,3.0.x中的块大小处理似乎仍然存在一个错误。没有--dry-run的命令可以使用,但仍然会导致显示“ Invalid block length NNN [sender]”消息。
Paul Gear

令人着迷的是,三年后我刚刚遇到@PaulGear提到的细微差别,而这在Ubuntu 18中仍然是一个问题吗?v3.1.2
TonyG '19

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());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.