--- Begin Message ---
Package: rdiff-backup
Version: 1.2.2-1~bpo40+1
Severity: grave
Justification: renders package unusable
Note: Both source and target system use Debian stable with a
backported version of rdiff-backup.
The problem occured after upgrading the backup source system to
rdiff-backup 1.2.2 from 1.2.1.
The backup target system was still running 1.2.1, but the problem is
reproducible when both systems are running 1.2.2. This means that the
backup target system's version of rdiff-backup is irrelevant to the
problem.
With the current situation, it is impossible to perform backups with
rdiff-backup.
Suggested action: rollback the version in testing to 1.2.1, wait for
a possible fix in 1.2.3.
Detailed problem report:
Backup command used, with options:
su $customer -c "rdiff-backup -v3 --print-statistics $CMD_EXTRA \
--remote-schema 'cstream -v 0 -t 10000000 | \
ssh %s '\''rdiff-backup --server'\'' | \
cstream -v 0 -t 10000000' $includes $excludes \
$remote_u...@$remote_host::/ $tdir"
$REMOTE_USER=root, and $customer is a user (not superuser).
$CMD_EXTRA may contain e.g. "--force", depending on the circumstances.
$includes is a list of directories to include.
$excludes=/
$tdir is the target directory (the backup repository, if you will).
Here's what I see happening, step for step:
1. The backup process is started.
2. Warnings start appearing on the form "Warning: listattr('/cdrom'):
[Errno 2] No such file or directory" for directories that are NOT in the
include list.
3. After approximately 180 such errors, the exception "'[Errno 40] Too
many levels of symbolic links' raised of class 'exceptions.IOError'"
is raised.
4. The backup target is in an unusable state, but can be "fixed" by
running "rdiff-backup --check-destination-dir", which results in the
warning "Warning: Access Control List file not found".
Apparently, "dead" symbolic links are dereferenced in 1.2.2, and then
rdiff-backup tries to run listattr() on the dereferenced link. It
apparently forgets to reset the link recursion counter in the process.
The error situation seems similar to one reported on the
rdiff-backup-users mailing list, but which there is no response to:
http://lists.nongnu.org/archive/html/rdiff-backup-users/2008-12/msg00010.html
Mid-truncated log output (version 1.2.2 of rdiff-backup used on both systems):
Warning: listattr('/cdrom'): [Errno 2] No such file or directory
Warning: listattr('/etc/alternatives/irc'): [Errno 2] No such file or directory
Warning: listattr('/etc/rc0.d/K06vprocunhide'): [Errno 2] No such file or
directory
Warning: listattr('/etc/rc2.d/S95vprocunhide'): [Errno 2] No such file or
directory
Warning: listattr('/etc/rc6.d/K06vprocunhide'): [Errno 2] No such file or
directory
(...)
Warning: listattr('/home/tmp/usr/share/autoconf2.13/acconfig.h'): [Errno 2] No
such file or directory
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 304, in
error_check_Main
try: Main(arglist)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 324, in
Main
take_action(rps)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 280, in
take_action
elif action == "backup": Backup(rps[0], rps[1])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 343, 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 = self._get()
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
518, in read
return self.connection.VirtualFile.readfromid(self.id, length)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line
450, 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 30, in ?
rdiff_backup.Main.error_check_Main(sys.argv[1:])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 304, in
error_check_Main
try: Main(arglist)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 324, in
Main
take_action(rps)
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 280, in
take_action
elif action == "backup": Backup(rps[0], rps[1])
File "/var/lib/python-support/python2.4/rdiff_backup/Main.py", line 343, 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 = self._get()
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
518, in read
return self.connection.VirtualFile.readfromid(self.id, length)
File "/var/lib/python-support/python2.4/rdiff_backup/connection.py", line
450, 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
-- System Information:
Debian Release: 4.0
APT prefers stable
APT policy: (500, 'stable')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.18-6-vserver-686
Locale: LANG=en_US, LC_CTYPE=no_NO.ISO_8859-1 (charmap=ISO-8859-1)
Versions of packages rdiff-backup depends on:
ii libc6 2.3.6.ds1-13etch8 GNU C Library: Shared libraries
ii librsync1 0.9.7-1 Library which implements the rsync
ii python 2.4.4-2 An interactive high-level object-o
ii python-support 0.5.6 automated rebuilding support for p
Versions of packages rdiff-backup recommends:
ii python-pylibacl 0.2.1-3.1 module for manipulating POSIX.1e A
ii python-pyxattr 0.2.1-1.1 module for manipulating filesystem
-- no debconf information
--- End Message ---