[Bug 1216921] Re: util.ignore_missing() does not work

Louis Bouchard louis.bouchard at canonical.com
Fri Oct 25 14:51:32 UTC 2013


Updated quantal debdiff with typo fixed

** Patch added: "lp1216921_ignoremissing_quantal.debdiff"
   https://bugs.launchpad.net/ubuntu/+source/duplicity/+bug/1216921/+attachment/3891187/+files/lp1216921_ignoremissing_quantal.debdiff

-- 
You received this bug notification because you are a member of Ubuntu
Sponsors Team, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/1216921

Title:
  util.ignore_missing() does not work

Status in Duplicity - Bandwidth Efficient Encrypted Backup:
  Fix Committed
Status in “duplicity” package in Ubuntu:
  Fix Released
Status in “duplicity” source package in Precise:
  In Progress
Status in “duplicity” source package in Quantal:
  In Progress
Status in “duplicity” source package in Raring:
  In Progress

Bug description:
  SRU justification :

  Without this fix, there is a potential for crash during execution of
  duplicity

  Impact :

  Renders duplicity potentially unusable dues to spurious crashes

  Fix :

  Backport upstream fix for this problem merged in 
  https://code.launchpad.net/~mterry/duplicity/ignore-missing

  Test Case :

  A session must be run within the python debugger to systematically
  reproduce the context.

  1) Run a duplicity session as outlined in comment #8 inside the debugger
  2) break at duplicity/path:568 instead of 567
  3) When the program breaks, manually remove the file that ends in "...manifest.gpg"
  4) continue execution

  Without the fix, duplicity will crash with the outlined backtrace.
  With the fix, duplicity will terminate normally.

  Regression :

  Minimal as the modification changes exception handling only for a
  function only used twice to delete files/directories (path.py &
  tempdir.py)

  Description of the problem :

  Duplicity can potentially crash while attempting to delete a file that
  no longer exists.

  Original description

  duplicity version: 0.6.18-0ubuntu3
  python version: 2.7.3
  Distro: ubuntu precise 12.04
  target file system: ftp

  I happen to encounter failed backups with tracebacks like this:

  Traceback (most recent call last):
    File "/usr/bin/duplicity", line 1403, in <module>
       with_tempdir(main)
    File "/usr/bin/duplicity", line 1396, in with_tempdir
       fn()
     File "/usr/bin/duplicity", line 1366, in main
       full_backup(col_stats)
     File "/usr/bin/duplicity", line 504, in full_backup
       sig_outfp.to_remote()
     File "/usr/lib/python2.7/dist-packages/duplicity/dup_temp.py", line 184, in to_remote
       globals.backend.move(tgt) #@UndefinedVariable
     File "/usr/lib/python2.7/dist-packages/duplicity/backend.py", line 364, in move
       source_path.delete()
     File "/usr/lib/python2.7/dist-packages/duplicity/path.py", line 567, in delete
       util.ignore_missing(os.unlink, self.name)
     File "/usr/lib/python2.7/dist-packages/duplicity/util.py", line 116, in ignore_missing
       fn(filename)
   OSError: [Errno 2] No such file or directory: '/BACKUP/.duplycache/duply_foo/duplicity-full-signatures.20130825T140002Z.sigtar.gpg'

  Now running test code like

  #!/usr/bin/env python
  #
  # Do what util.ignore_missing(os.unlink, self.name) tries to do and
  # fails to achieve

  import os
  import sys
  import errno

  if __name__ == "__main__":
          try:
                  os.unlink("/tmp/doesnotexist")
          except Exception:
                  # "type" is a reserved keyword, replaced with "mytype"
                  mytype, value, tb = sys.exc_info()
                  print "-" * 78
                  print "mytype: ", mytype
                  print "value: ", value
                  print "value[0]:", value[0]
                  print "errno.ENOENT: ", errno.ENOENT
                  print "isinstance(mytype, OSError): ", isinstance(mytype, OSError)
                  print "-" * 78
                  if isinstance(mytype, OSError) and value[0] == errno.ENOENT:
                          print "Gotcha!"
                          pass
                  print "Ooops, missed it ..."
                  raise

  will always raise the exception and not ignore it, because
  isinstance(mytype, OSError) is always False.

  What I expect ignore_missing to look like is:

  def ignore_missing(fn, filename):
      """
      Execute fn on filename.  Ignore ENOENT errors, otherwise raise exception.

      @param fn: callable
      @param filename: string
      """
      try:
          fn(filename)
      except OSError, ex:
          if ex.errno == errno.ENOENT:
              pass
          else:
              raise
      else:
          raise

To manage notifications about this bug go to:
https://bugs.launchpad.net/duplicity/+bug/1216921/+subscriptions



More information about the Ubuntu-sponsors mailing list