Probleme de restauration et de profondeur de récursion avec rdiff-backup et python
C’est un problème qui ne m’était jamais encore arrivé, aujourd’hui, lors de la demande de restauration d’un fichier datant du mois de juillet par un client utilisant une ancienne version de rdiff-backup, j’ai rencontré ce problème :
Fatal Error: Could not find rdiff-backup repository at servers/xxxx/home/userclient/data/www/tmp/unfichier.php
C’est un problème que j’ai déjà rencontré une ou deux fois par le passé et qui nécessite généralement de faire un check, et parfois réparer ou supprimer un fichier corrompu.
Je lance donc la commande :
rdiff-backup --check-destination-dir /datastore/servers/xxxx/home
Après plusieurs minutes de travail, j’obtiens le message d’erreur suivant :
Exception 'maximum recursion depth exceeded' raised of class '<type 'exceptions.RuntimeError'>':
Cette erreur est suivie de centaines de lignes de type :
File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 304, in error_check_Main
try: Main(arglist)
File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 324, in Main
take_action(rps)
File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 282, in take_action
elif action == "check-destination-dir": CheckDest(rps[0])
File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 872, in CheckDest
dest_rp.conn.regress.Regress(dest_rp)
File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 71, in Regress
Lorsque l’on rencontre ce message d’erreur lors de l’exécution d’un script python, cela indique habituellement que notre programme (ici rdiff-backup) a dépassé la profondeur maximale de récursivité autorisée. Ceci arrive parfois sur des systèmes de fichiers avec une mauvaise utilisation des liens symboliques.
Pourtant, dans ce cas précis, il n’y a aucune raison d’être face à une « récursion infinie ».
Concentrons-nous donc sur une solution directement au niveau de rdiff-backup :
Sur un script maison, l’idée serait de fixer une nouvelle limite de récursivité via (10000 dans l’exemple ci-dessous) via un :
import sys
sys.setrecursionlimit(10000)
Il suffirait donc d’ajouter cet élément en début de script. Cei étant dit, ne s’agissant pas ici d’un script « maison », je préfère utiliser une approche dans laquelle l’intégrité de la commande rdiff-backup est préservée. Une manière simple d’exécuter cela sans modifier le code de la commande est d’utiliser directement python pour la lancer en ajoutant ce qui nous intéresse :
python -c "import sys; sys.setrecursionlimit(10000); import rdiff_backup.Main; rdiff_backup.Main.error_check_Main(['--check-destination-dir', '/datastore/servers/xxx/home'])"
L’opération a pu se dérouler jusqu’à la fin. Une fois terminé, les restaurations de sauvegardes demandées ont correctement pu être exécutées.
Christophe Casalegno / Brain 0verride
Vous pouvez me suivre sur : Telegram | YouTube | Twitter | Facebook | LinkedIn | Twitch
Laisser un commentaire