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 

回答:


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.3でサポートOLD_追加されました。(リンクは、変更の背後にある理論的根拠のいくつかを説明しています。)

  • [PATCH]送信者側のハッシュテーブル検索で行き詰まることなく、本当に大きなファイルを処理しようとするパッチ。

  • [パッチ]プロトコル<29の古いブロックサイズの制限を処理することにより、古いrsyncバージョンの大きなファイルの送信を修正しました。


1
--dry-runの下でのブロックサイズの処理には3.0.xのバグがあるようです。--dry-runのないコマンドでも機能しますが、それでも「Invalid block length NNN [sender]」メッセージが表示されます。
ポール・ギア

@PaulGearが言及したニュアンスに3年以上触れたばかりで、これがUbuntu 18の問題であることに興味をそそられますか?v3.1.2
トニーG

3

最大ブロックサイズは、rsyncプロトコルのバージョンによって異なります。

プロトコルバージョンが30未満の場合、最大は1 << 29536870912バイト(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.