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



-- 
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to