From 2ee83a493a91b6dd0ce79a8f6e74ac21638cff0a Mon Sep 17 00:00:00 2001 From: Pádraig Brady Date: Thu, 3 Jan 2013 14:25:06 +0000 Subject: improve libguestfs exception handling * nova/virt/disk/vfs/guestfs.py (teardown): Handle specific exceptions when tearing down so that (future) nova bugs aren't masked. Also handle AttributeError so that the relatively new handle() and close() don't cause erroneous debug logs on older versions of libguestfs. (has_file): remove the last use of generic exception catching and use the more specific RuntimeError. Change-Id: Ia7345675d75c1c6727e9254791d44475c0ed9295 --- nova/virt/disk/vfs/guestfs.py | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'nova/virt') diff --git a/nova/virt/disk/vfs/guestfs.py b/nova/virt/disk/vfs/guestfs.py index 66c6849d4..acea8afdf 100644 --- a/nova/virt/disk/vfs/guestfs.py +++ b/nova/virt/disk/vfs/guestfs.py @@ -101,6 +101,7 @@ class VFSGuestFS(vfs.VFS): self.handle.aug_init("/", 0) except RuntimeError, e: + # dereference object and implicitly close() self.handle = None raise exception.NovaException( _("Error mounting %(imgfile)s with libguestfs (%(e)s)") % @@ -111,19 +112,31 @@ class VFSGuestFS(vfs.VFS): def teardown(self): LOG.debug(_("Tearing down appliance")) + try: - self.handle.aug_close() - except Exception, e: - LOG.debug(_("Failed to close augeas %s"), e) - try: - self.handle.shutdown() - except Exception, e: - LOG.debug(_("Failed to shutdown appliance %s"), e) - try: - self.handle.close() - except Exception, e: - LOG.debug(_("Failed to close guest handle %s"), e) - self.handle = None + try: + self.handle.aug_close() + except RuntimeError, e: + LOG.warn(_("Failed to close augeas %s"), e) + + try: + self.handle.shutdown() + except AttributeError: + # Older libguestfs versions haven't an explicit shutdown + pass + except RuntimeError, e: + LOG.warn(_("Failed to shutdown appliance %s"), e) + + try: + self.handle.close() + except AttributeError: + # Older libguestfs versions haven't an explicit close + pass + except RuntimeError, e: + LOG.warn(_("Failed to close guest handle %s"), e) + finally: + # dereference object and implicitly close() + self.handle = None @staticmethod def _canonicalize_path(path): @@ -157,7 +170,7 @@ class VFSGuestFS(vfs.VFS): try: self.handle.stat(path) return True - except Exception, e: + except RuntimeError: return False def set_permissions(self, path, mode): -- cgit