내 rsync가 128K보다 큰 블록 크기를 허용하지 않는 이유는 무엇입니까?

내 rsync가 128K보다 큰 블록 크기를 허용하지 않는 이유는 무엇입니까?

다음과 같이 big *를 --block-size 사용하여 rsync를 실행합니다 .

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더 높은 값이 사용되는 것을 확인했는데 이것이 나에게 적합하지 않은 이유는 무엇입니까?

*CPU를 44% 영원히 회전시키는 rsync의 버그를 300GB 파일로 수정하려고 하기 때문에 더 큰 블록 크기를 사용하고 있습니다.

답변1

~에서원천:

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)과 (128k)입니다 131072.


버전이 변경되었습니다.v3.0.0그리고 지원 OLD_v3.0.3에 추가됨. (링크에서는 이러한 변경 사항에 대한 몇 가지 이론적 근거를 설명합니다.)

  • [패치] 보낸 사람 해시 테이블 검색에서 정체되지 않고 처리할 대용량 파일을 가져오기 위한 패치입니다.

  • [패치] 프로토콜의 레거시 블록 크기 제한 <29를 처리하여 이전 rsync 버전을 사용하여 대용량 파일을 전송할 때 발생하는 문제를 수정했습니다.

답변2

최대 블록 크기는 rsync 프로토콜 버전에 따라 다릅니다.

프로토콜 버전이 30 미만인 경우 최대값은 1 << 29536870912바이트(512M)입니다. 단, 프로토콜 버전 30 이상에서는 최대값이 1 << 17128k바이트입니다. 따라서 더 큰 블록 크기를 원한다면 이전 버전을 사용해야 합니다.

원천: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());

관련 정보