Upgrade to rdiff-backup 1.2.2 introduces problems with symbolic links
Hello.
This problem is fairly well-known, but no useful information about it seems to have been forthcoming on the rdiff-backup mailing list.
http://lists.nongnu.org/archive/html/rdiff-backup-users/2008-12/msg00010.html
rdiff-backup 1.2.2 has some serious problems with symbolic links, which results in aborted and corrupted backups.
Fortunately, the backup can be fixed (on a 1.2.1 host system, at least) with --check-destination-dir, which takes ages to run on large file systems, although the latest attempt at a backup is of course completely lost.
Essentially, I think it's safe to say that one shouldn't upgrade from 1.2.0 or 1.2.1 to 1.2.2 right now.
It's been suggested that 1.2.3 will rectify this problem.
I propose that the version in backports is downgraded to 1.2.1 until then.
rdiff-backup log excerpt:
Exception '[Errno 40] Too many levels of symbolic links' raised of class 'exceptions.IOError':
File "/var/lib/python-support/python2.4/rdiff_backup/robust.py", line 32, in check_common_error
try: return function(*args)
File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 1123, in append
return self.__class__(self.conn, self.base, self.index + (ext,))
File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 868, in __init__
else: self.setdata()
File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 893, in setdata
if self.lstat(): self.conn.rpath.setdata_local(self)
File "/var/lib/python-support/python2.4/rdiff_backup/rpath.py", line 1470, in setdata_local
if Globals.eas_conn: rpath.data['ea'] = ea_get(rpath)
File "/var/lib/python-support/python2.4/rdiff_backup/eas_acls.py", line 584, in rpath_ea_get
ea.read_from_rp(rp)
File "/var/lib/python-support/python2.4/rdiff_backup/eas_acls.py", line 59, in read_from_rp
try: attr_list = rp.conn.xattr.listxattr(rp.path, rp.issym())
Exception '[Errno 40] Too many levels of symbolic links' raised of class 'exceptions.IOError':
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 302, in error_check_Main
try: Main(arglist)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 322, in Main
take_action(rps)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 278, in take_action
elif action == "backup": Backup(rps[0], rps[1])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 341, in Backup
backup.Mirror_and_increment(rpin, rpout, incdir)
File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 51, in Mirror_and_increment
DestS.patch_and_increment(dest_rpath, source_diffiter, inc_rpath)
File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 241, in patch_and_increment
for diff in rorpiter.FillInIter(source_diffiter, dest_rpath):
File "/var/lib/python-support/python2.4/rdiff_backup/rorpiter.py", line 177, in FillInIter
for rp in rpiter:
File "/var/lib/python-support/python2.4/rdiff_backup/iterfile.py", line 382, in next
while not type: type, data = ""> File "/var/lib/python-support/python2.4/rdiff_backup/iterfile.py", line 414, in _get
if not self.buf: self.buf += self.file.read()
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 516, in read
return self.connection.VirtualFile.readfromid(self.id, length)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 448, in __call__
return apply(self.connection.reval, (self.name,) + args)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 370, in reval
if isinstance(result, Exception): raise result
Traceback (most recent call last):
File "/usr/bin/rdiff-backup", line 23, in ?
rdiff_backup.Main.error_check_Main(sys.argv[1:])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 302, in error_check_Main
try: Main(arglist)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 322, in Main
take_action(rps)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 278, in take_action
elif action == "backup": Backup(rps[0], rps[1])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 341, in Backup
backup.Mirror_and_increment(rpin, rpout, incdir)
File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 51, in Mirror_and_increment
DestS.patch_and_increment(dest_rpath, source_diffiter, inc_rpath)
File "/var/lib/python-support/python2.4/rdiff_backup/backup.py", line 241, in patch_and_increment
for diff in rorpiter.FillInIter(source_diffiter, dest_rpath):
File "/var/lib/python-support/python2.4/rdiff_backup/rorpiter.py", line 177, in FillInIter
for rp in rpiter:
File "/var/lib/python-support/python2.4/rdiff_backup/iterfile.py", line 382, in next
while not type: type, data = ""> File "/var/lib/python-support/python2.4/rdiff_backup/iterfile.py", line 414, in _get
if not self.buf: self.buf += self.file.read()
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 516, in read
return self.connection.VirtualFile.readfromid(self.id, length)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 448, in __call__
return apply(self.connection.reval, (self.name,) + args)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line 370, in reval
if isinstance(result, Exception): raise result
IOError: [Errno 40] Too many levels of symbolic links
Fatal Error: Lost connection to the remote system
--
Jan
Reply to: