[virt-tools-list] [PATCH 2/3] virt-manager: ignore VIR_ERR_NO_DOMAIN when a domain was just deleted

Giuseppe Scrivano gscrivan at redhat.com
Fri Aug 9 12:18:55 UTC 2013


Some callbacks registered by `idle_add' could try to access a domain that
was just deleted.  Detect these cases and don't propagate the exception.

Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
---
NOTE:

The race situation appears quite seldom, for my tests I have created and
deleted a bunch of LXC application containers.  I have noticed this issue
while I was debugging 985291.

 virtManager/details.py | 11 +++++++++--
 virtManager/domain.py  |  2 +-
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/virtManager/details.py b/virtManager/details.py
index 2f7e7d4..cb9ea7a 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -2635,8 +2635,15 @@ class vmmDetails(vmmGObjectUI):
 
         # If the dialog is visible, we want to make sure the XML is always
         # up to date
-        if self.is_visible():
-            self.vm.refresh_xml()
+        try:
+            if self.is_visible():
+                self.vm.refresh_xml()
+        except libvirt.libvirtError, e:
+            if (hasattr(libvirt, "VIR_ERR_NO_DOMAIN") and
+                e.get_error_code() == getattr(libvirt, "VIR_ERR_NO_DOMAIN")):
+                self.close()
+                return
+            raise
 
         # Stats page needs to be refreshed every tick
         if (page == PAGE_DETAILS and
diff --git a/virtManager/domain.py b/virtManager/domain.py
index de0df8a..bd04452 100644
--- a/virtManager/domain.py
+++ b/virtManager/domain.py
@@ -1560,6 +1560,7 @@ class vmmDomain(vmmLibvirtObject):
         """
         try:
             info = self._backend.info()
+            self._update_status(info[0])
         except libvirt.libvirtError, e:
             if (hasattr(libvirt, "VIR_ERR_NO_DOMAIN") and
                 e.get_error_code() == getattr(libvirt, "VIR_ERR_NO_DOMAIN")):
@@ -1567,7 +1568,6 @@ class vmmDomain(vmmLibvirtObject):
                 return
             raise
 
-        self._update_status(info[0])
 
     def _update_status(self, status):
         """
-- 
1.8.3.1




More information about the virt-tools-list mailing list