[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] Fix stale-state issue with 'xm dom{id,name}'


  • To: Xen Developers <xen-devel@xxxxxxxxxxxxxxxxxxx>
  • From: Dan Smith <danms@xxxxxxxxxx>
  • Date: Wed, 28 Sep 2005 08:35:03 -0700
  • Delivery-date: Wed, 28 Sep 2005 15:33:21 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>

This patch prevents 'xm dom{id,name}' from returning stale information
after a domain has exited.

Xend already called XendDomainInfo.update() before returning
information, but did not check to see if the result indicated that the
domain had disappeared.  So, it updated the domain (which just bails
if the domain is gone) and then returned info from its internal data
structures.  This means that if you run "xm destroy foo", you can then
run "xm domid" or "xm domname" many times, getting stale info.

Instead of modifying Xend's state in a "random place", we just make
sure to throw an error if we know the state is invalid.

This patch causes xm-test 01_shutdown_basic_pos to pass now.  Xm-test
uses domid and domname in many places to determine if a domain is
running or not (as, I would imagine, other higher-level tools might).
Having this information consistent with the actual state is a good
thing.

Signed-off-by: Dan Smith <danms@xxxxxxxxxx>
diff -r ca78d9668fdb tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Wed Sep 28 14:06:48 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Wed Sep 28 08:22:10 2005
@@ -693,7 +693,7 @@
         if not info:
             info = dom_get(self.domid)
             if not info:
-                return
+                return False
             
         self.info.update(info)
         self.validateInfo()
@@ -701,6 +701,8 @@
 
         log.debug("XendDomainInfo.update done on domain %d: %s", self.domid,
                   self.info)
+
+        return True
 
 
     ## private:
diff -r ca78d9668fdb tools/python/xen/xend/server/SrvDomain.py
--- a/tools/python/xen/xend/server/SrvDomain.py Wed Sep 28 14:06:48 2005
+++ b/tools/python/xen/xend/server/SrvDomain.py Wed Sep 28 08:22:10 2005
@@ -21,6 +21,8 @@
 from xen.xend import XendDomain
 from xen.xend import PrettyPrint
 from xen.xend.Args import FormFn
+from xen.xend.XendError import XendError
+from xen.xend.XendLogging import log
 
 from xen.web.SrvDir import SrvDir
 
@@ -221,7 +223,9 @@
         #
         # if op and op[0] in ['vifs', 'vif', 'vbds', 'vbd', 'mem_target_set']:
         #    return self.perform(req)
-        self.dom.update()
+        if not self.dom.update():
+            raise XendError("Domain %s no longer exists" % self.dom.getName())
+
         if self.use_sxp(req):
             req.setHeader("Content-Type", sxp.mime_type)
             sxp.show(self.dom.sxpr(), out=req)
diff -r ca78d9668fdb tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Wed Sep 28 14:06:48 2005
+++ b/tools/python/xen/xm/main.py       Wed Sep 28 08:22:10 2005
@@ -32,6 +32,7 @@
 warnings.filterwarnings('ignore', category=FutureWarning)
 from xen.xend import PrettyPrint
 from xen.xend import sxp
+from xen.xend.XendClient import XendError
 from xen.xm.opts import *
 shorthelp = """Usage: xm <subcommand> [args]
     Control, list, and manipulate Xen guest instances
@@ -385,14 +386,24 @@
     name = args[0]
 
     from xen.xend.XendClient import server
-    dom = server.xend_domain(name)
+    try:
+        dom = server.xend_domain(name)
+    except XendError, e:
+        err("Unable to get info for domain %s" % name)
+        sys.exit(1)
+        
     print sxp.child_value(dom, 'domid')
     
 def xm_domname(args):
     name = args[0]
 
     from xen.xend.XendClient import server
-    dom = server.xend_domain(name)
+    try:
+        dom = server.xend_domain(name)
+    except XendError, e:
+        err("Unable to get info for domain %s" % name)
+        sys.exit(1)
+        
     print sxp.child_value(dom, 'name')
 
 def xm_sched_bvt(args):
@@ -687,7 +698,6 @@
     args = argv[2:]
     if cmd:
         try:
-            from xen.xend.XendClient import XendError
             rc = cmd(args)
             if rc:
                 usage()
-- 
Dan Smith
IBM Linux Technology Center
Open Hypervisor Team
email: danms@xxxxxxxxxx
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.