debdiff for precise

** Description changed:

- duplicity version: 0.6.18-0ubuntu3 
+ 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'
+   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
+         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.
+     """
+     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:
+     @param fn: callable
+     @param filename: string
+     """
+     try:
+         fn(filename)
+     except OSError, ex:
+         if ex.errno == errno.ENOENT:
              pass
          else:
              raise
      else:
          raise

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

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

Title:
  util.ignore_missing() does not work

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

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to