Pourquoi mon rsync n'autorise-t-il pas une taille de bloc> 128 Ko?

15

Exécution de rsync avec un grand * --block-size comme ceci:

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

J'obtiens l'erreur suivante:

Invalid block length 1048576 [sender]

Les deux extrémités exécutent 64 bits CentOS 6.4. De Google que j'ai vu --block-sizeutilisé avec des valeurs beaucoup plus élevées, pourquoi cela ne fonctionne-t-il pas pour moi?

* J'utilise une grande taille de bloc parce que j'essaie de contourner un bogue où rsync fait tourner le processeur pour toujours à 44% dans un fichier de 300 Go


la source

Réponses:

13

De la source :

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)

Ce qui est 536870912(512M) et 131072(128k) respectivement.


La modification a été apportée dans la version v3.0.0 et la prise en charge de a OLD_été ajoutée dans la v3.0.3 . (Les liens expliquent certaines des raisons des changements.)

  • [PATCH] Un correctif pour essayer de gérer des fichiers très volumineux sans s'enliser dans la recherche de table de hachage côté expéditeur.

  • [PATCH] Correction de l'envoi de fichiers volumineux avec des versions rsync plus anciennes en gérant l'ancienne limite de taille de bloc pour les protocoles <29.

Runium
la source
1
Il semble toujours y avoir un bogue dans 3.0.x dans la gestion de la taille des blocs sous --dry-run. Une commande sans --dry-run peut fonctionner, mais avec elle, le message "Longueur de bloc NNN [expéditeur]" invalide.
Paul Gear
Fascinant que je viens de rencontrer la nuance mentionnée par @PaulGear, plus de 3 ans plus tard et c'est toujours un problème avec Ubuntu 18? v3.1.2
TonyG
3

La taille de bloc maximale dépend de la version du protocole rsync.

Avec une version de protocole inférieure à 30, le maximum était de 1 << 29536870912 octets (512 Mo). Mais avec la version 30 ou supérieure du protocole, le maximum est 1 << 17, qui est de 128k octets. Vous devrez donc utiliser une version plus ancienne si vous souhaitez des tailles de bloc plus grandes.

Source: rsync.h

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

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

Et: 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());
Tapis
la source