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

[Xen-changelog] Added diagnosis tool for broken domains.



# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 4ba11726df733522f0eb5aca5b068672b8670466
# Parent  857b79d279935d4eeb6b5ec6732a49c748c4151a
Added diagnosis tool for broken domains.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>

diff -r 857b79d27993 -r 4ba11726df73 tools/python/xen/util/diagnose.py
--- /dev/null   Wed Oct 19 12:37:16 2005
+++ b/tools/python/xen/util/diagnose.py Wed Oct 19 12:59:22 2005
@@ -0,0 +1,148 @@
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# Copyright (c) 2005 XenSource Ltd
+
+
+import re
+import sys
+
+from xen.xend import sxp
+
+from xen.xend.XendClient import server
+from xen.xend.XendError import XendError
+from xen.xend.xenstore.xstransact import xstransact
+
+import xen.xend.XendProtocol
+
+
+domain = None
+domid = None
+deviceClass = None
+device = None
+frontendPath = None
+backendPath = None
+
+
+def diagnose(dom):
+    global domain
+    global domid
+    global dompath
+    
+    try:
+        domain = server.xend_domain(dom)
+        state = sxp.child_value(domain, 'state')
+        domid = int(sxp.child_value(domain, 'domid'))
+        name = sxp.child_value(domain, 'name')
+        dompath = '/local/domain/%d' % domid
+
+        print "Domain ID is %d." % domid
+        print "Domain name is %s." % name
+
+        if not state:
+            raise XendError("Cannot find state")
+
+        if state.find('c') != -1:
+            print "Domain has crashed."
+
+        diagnose_console()
+
+        diagnose_devices()
+    except xen.xend.XendProtocol.XendError, exn:
+        print exn
+
+
+def diagnose_console():
+    port    = xstransact.Read(dompath + '/console/port')
+    ringref = xstransact.Read(dompath + '/console/ring-ref')
+    tty     = xstransact.Read(dompath + '/console/tty')
+
+    if not port:
+        print "Console port is missing; Xend has failed."
+    if not ringref:
+        print "Console ring-ref is missing; Xend has failed."
+    if not tty:
+        print "Console tty is missing; Xenconsoled has failed."
+
+
+def diagnose_devices():
+    global deviceClass
+    global device
+    global frontendPath
+    global backendPath
+    
+    device_path = dompath + '/device'
+
+    device_classes = xstransact.List(device_path)
+
+    print "Found %d device classes in use." % len(device_classes)
+
+    for dc in device_classes:
+        deviceClass = dc
+        device_class_path = device_path + '/' + deviceClass
+
+        devices = xstransact.List(device_class_path)
+
+        print "Found %d %s devices." % (len(devices), deviceClass)
+
+        for d in devices:
+            device = d
+            
+            print "Found device %s, %s." % (deviceClass, device)
+
+            frontendPath = device_class_path + '/' + device
+            backendPath = xstransact.Read(frontendPath, 'backend')
+
+            if not backendPath:
+                print ("Cannot find backend path for device %s, %s." %
+                       (deviceClass, device))
+            else:
+                backend_error = xstransact.Read(backendPath, 'error')
+
+                if backend_error:
+                    diagnose_device_error(backend_error)
+
+
+def diagnose_device_error(err):
+    if re.search("2 reading .*/ring-ref and event-channel", err):
+        print ("Backend is stuck waiting for frontend for device %s, %s." %
+               (deviceClass, device))
+        diagnose_stuck_frontend()
+    else:
+        print ("Device %s, %s shows error %s." %
+               (deviceClass, device, err))
+
+
+def diagnose_stuck_frontend():
+    if deviceClass == "vbd":
+        phy = xstransact.Read(backendPath, 'physical-device')
+
+        if phy:
+            print ("Device %s, %s hotplugging has completed successfully." %
+                   (deviceClass, device))
+        else:
+            print ("Device %s, %s hotplugging failed." %
+                   (deviceClass, device))
+
+
+def main(argv = None):
+    if argv is None:
+        argv = sys.argv
+
+    diagnose(argv[1])
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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