WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] fix xend 'rename-restart' behavior

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] fix xend 'rename-restart' behavior
From: Jim Fehlig <jfehlig@xxxxxxxxxx>
Date: Thu, 24 Jan 2008 15:37:52 -0700
Delivery-date: Thu, 24 Jan 2008 14:38:23 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 1.5.0.8 (X11/20060911)
Given no objections to

http://lists.xensource.com/archives/html/xen-devel/2008-01/msg00838.html

attached are patches that (re)introduce crashed power state and fix
issues with 'rename-restart'.

Regards,
Jim
# HG changeset patch
# User Jim Fehlig <jfehlig@xxxxxxxxxx>
# Date 1201213239 25200
# Node ID cc85865f26a7cbced1d171fd52da224dca066a98
# Parent  31adb5c972d03e45cb746cd2305126ea2571282f
(Re)introduce notion of crashed VM power state.

The crashed power state is necessary to allow both core-dumping a crashed
but preserved VM and renaming/restarting a crashed VM.

Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxxxx>

diff -r 31adb5c972d0 -r cc85865f26a7 docs/xen-api/vm-lifecycle.tex
--- a/docs/xen-api/vm-lifecycle.tex     Thu Jan 24 14:41:26 2008 +0000
+++ b/docs/xen-api/vm-lifecycle.tex     Thu Jan 24 15:20:39 2008 -0700
@@ -21,7 +21,10 @@
 \end{figure}
 
 Figure~\ref{fig-vm-lifecycle} shows the states that a VM can be in
-and the API calls that can be used to move the VM between these states.
+and the API calls that can be used to move the VM between these states.  The 
crashed
+state indicates that the guest OS running within the VM has crashed.  There is 
no
+API to explicitly move to the crashed state, however a hardShutdown will move 
the
+VM to the powered down state.
 
 \section{VM boot parameters}
 
diff -r 31adb5c972d0 -r cc85865f26a7 docs/xen-api/vm_lifecycle.dot
--- a/docs/xen-api/vm_lifecycle.dot     Thu Jan 24 14:41:26 2008 +0000
+++ b/docs/xen-api/vm_lifecycle.dot     Thu Jan 24 15:20:39 2008 -0700
@@ -1,6 +1,6 @@ digraph g{
 digraph g{
 
-node [shape=box]; "powered down" paused running suspended;
+node [shape=box]; "powered down" paused running suspended crashed;
 
 "powered down" -> paused [label="start(paused=true)"];
 "powered down" -> running [label="start(paused=false)"];
@@ -11,5 +11,7 @@ paused -> running [label="resume"];
 paused -> running [label="resume"];
 running -> "powered down" [label="cleanShutdown /\nhardShutdown"];
 running -> paused [label="pause"];
+running -> crashed [label="guest OS crash"]
+crashed -> "powered down" [label="hardShutdown"]
 
 }
\ No newline at end of file
diff -r 31adb5c972d0 -r cc85865f26a7 docs/xen-api/xenapi-datamodel.tex
--- a/docs/xen-api/xenapi-datamodel.tex Thu Jan 24 14:41:26 2008 +0000
+++ b/docs/xen-api/xenapi-datamodel.tex Thu Jan 24 15:20:39 2008 -0700
@@ -156,6 +156,7 @@ The following enumeration types are used
 \hspace{0.5cm}{\tt Paused} & Paused \\
 \hspace{0.5cm}{\tt Running} & Running \\
 \hspace{0.5cm}{\tt Suspended} & Suspended \\
+\hspace{0.5cm}{\tt Crashed} & Crashed \\
 \hspace{0.5cm}{\tt Unknown} & Some other unknown state \\
 \hline
 \end{longtable}
diff -r 31adb5c972d0 -r cc85865f26a7 
tools/libxen/include/xen/api/xen_vm_power_state.h
--- a/tools/libxen/include/xen/api/xen_vm_power_state.h Thu Jan 24 14:41:26 
2008 +0000
+++ b/tools/libxen/include/xen/api/xen_vm_power_state.h Thu Jan 24 15:20:39 
2008 -0700
@@ -46,6 +46,11 @@ enum xen_vm_power_state
     XEN_VM_POWER_STATE_SUSPENDED,
 
     /**
+     * Crashed
+     */
+    XEN_VM_POWER_STATE_CRASHED,
+
+    /**
      * Some other unknown state
      */
     XEN_VM_POWER_STATE_UNKNOWN
diff -r 31adb5c972d0 -r cc85865f26a7 tools/libxen/src/xen_vm_power_state.c
--- a/tools/libxen/src/xen_vm_power_state.c     Thu Jan 24 14:41:26 2008 +0000
+++ b/tools/libxen/src/xen_vm_power_state.c     Thu Jan 24 15:20:39 2008 -0700
@@ -32,6 +32,7 @@ static const char *lookup_table[] =
     "Paused",
     "Running",
     "Suspended",
+    "Crashed",
     "Unknown"
 };
 
diff -r 31adb5c972d0 -r cc85865f26a7 tools/python/xen/xend/XendAPIConstants.py
--- a/tools/python/xen/xend/XendAPIConstants.py Thu Jan 24 14:41:26 2008 +0000
+++ b/tools/python/xen/xend/XendAPIConstants.py Thu Jan 24 15:20:39 2008 -0700
@@ -25,6 +25,7 @@ XEN_API_VM_POWER_STATE = [
     'Running',
     'Suspended',
     'Halted',
+    'Crashed',
     'Unknown'
 ]
 
@@ -33,7 +34,8 @@ XEN_API_VM_POWER_STATE_RUNNING = 2
 XEN_API_VM_POWER_STATE_RUNNING = 2
 XEN_API_VM_POWER_STATE_SUSPENDED = 3
 XEN_API_VM_POWER_STATE_SHUTTINGDOWN = 4
-XEN_API_VM_POWER_STATE_UNKNOWN = 5
+XEN_API_VM_POWER_STATE_CRASHED = 5
+XEN_API_VM_POWER_STATE_UNKNOWN = 6
 
 XEN_API_ON_NORMAL_EXIT = [
     'destroy',
diff -r 31adb5c972d0 -r cc85865f26a7 tools/python/xen/xend/XendConstants.py
--- a/tools/python/xen/xend/XendConstants.py    Thu Jan 24 14:41:26 2008 +0000
+++ b/tools/python/xen/xend/XendConstants.py    Thu Jan 24 15:20:39 2008 -0700
@@ -61,6 +61,7 @@ DOM_STATES = [
     'running',
     'suspended',
     'shutdown',
+    'crashed',
     'unknown',
 ]
 
@@ -69,6 +70,7 @@ DOM_STATE_RUNNING = XEN_API_VM_POWER_STA
 DOM_STATE_RUNNING = XEN_API_VM_POWER_STATE_RUNNING
 DOM_STATE_SUSPENDED = XEN_API_VM_POWER_STATE_SUSPENDED
 DOM_STATE_SHUTDOWN = XEN_API_VM_POWER_STATE_SHUTTINGDOWN
+DOM_STATE_CRASHED = XEN_API_VM_POWER_STATE_CRASHED
 DOM_STATE_UNKNOWN = XEN_API_VM_POWER_STATE_UNKNOWN
 
 DOM_STATES_OLD = [
diff -r 31adb5c972d0 -r cc85865f26a7 tools/python/xen/xend/XendDomain.py
--- a/tools/python/xen/xend/XendDomain.py       Thu Jan 24 14:41:26 2008 +0000
+++ b/tools/python/xen/xend/XendDomain.py       Thu Jan 24 15:20:39 2008 -0700
@@ -43,6 +43,7 @@ from xen.xend.XendConstants import DOM_S
 from xen.xend.XendConstants import DOM_STATE_HALTED, DOM_STATE_PAUSED
 from xen.xend.XendConstants import DOM_STATE_RUNNING, DOM_STATE_SUSPENDED
 from xen.xend.XendConstants import DOM_STATE_SHUTDOWN, DOM_STATE_UNKNOWN
+from xen.xend.XendConstants import DOM_STATE_CRASHED
 from xen.xend.XendConstants import TRIGGER_TYPE
 from xen.xend.XendDevices import XendDevices
 from xen.xend.XendAPIConstants import *
@@ -69,6 +70,7 @@ POWER_STATE_NAMES = dict([(x, XEN_API_VM
                                     DOM_STATE_RUNNING,
                                     DOM_STATE_SUSPENDED,
                                     DOM_STATE_SHUTDOWN,
+                                    DOM_STATE_CRASHED,
                                     DOM_STATE_UNKNOWN]])
 POWER_STATE_ALL = 'all'
 
@@ -1191,13 +1193,14 @@ class XendDomain:
             if dominfo.getDomid() == DOM0_ID:
                 raise XendError("Cannot pause privileged domain %s" % domid)
             ds = dominfo._stateGet()
-            if ds not in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
+            if ds not in (DOM_STATE_RUNNING, DOM_STATE_PAUSED, 
DOM_STATE_CRASHED):
                 raise VMBadState("Domain '%s' is not started" % domid,
                                  POWER_STATE_NAMES[DOM_STATE_RUNNING],
                                  POWER_STATE_NAMES[ds])
             log.info("Domain %s (%d) paused.", dominfo.getName(),
                      int(dominfo.getDomid()))
-            dominfo.pause()
+            if ds == DOM_STATE_RUNNING:
+                dominfo.pause()
             if state:
                 return ds
         except XendInvalidDomain:
@@ -1216,7 +1219,7 @@ class XendDomain:
 
         if dominfo.getDomid() == DOM0_ID:
             raise XendError("Cannot dump core for privileged domain %s" % 
domid)
-        if dominfo._stateGet() not in (DOM_STATE_PAUSED, DOM_STATE_RUNNING):
+        if dominfo._stateGet() not in (DOM_STATE_PAUSED, DOM_STATE_RUNNING, 
DOM_STATE_CRASHED):
             raise VMBadState("Domain '%s' is not started" % domid,
                              POWER_STATE_NAMES[DOM_STATE_PAUSED],
                              POWER_STATE_NAMES[dominfo._stateGet()])
diff -r 31adb5c972d0 -r cc85865f26a7 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Jan 24 14:41:26 2008 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Thu Jan 24 15:20:39 2008 -0700
@@ -414,7 +414,7 @@ class XendDomainInfo:
         """
         from xen.xend import XendDomain
 
-        if self._stateGet() in (XEN_API_VM_POWER_STATE_HALTED, 
XEN_API_VM_POWER_STATE_SUSPENDED):
+        if self._stateGet() in (XEN_API_VM_POWER_STATE_HALTED, 
XEN_API_VM_POWER_STATE_SUSPENDED, XEN_API_VM_POWER_STATE_CRASHED):
             try:
                 XendTask.log_progress(0, 30, self._constructDomain)
                 XendTask.log_progress(31, 60, self._initDomain)
@@ -648,7 +648,7 @@ class XendDomainInfo:
         return rc
 
     def getDeviceSxprs(self, deviceClass):
-        if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED):
+        if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED, 
DOM_STATE_CRASHED):
             return self.getDeviceController(deviceClass).sxprs()
         else:
             sxprs = []
@@ -2268,6 +2268,9 @@ class XendDomainInfo:
                 return XEN_API_VM_POWER_STATE_SUSPENDED
             else:
                 return XEN_API_VM_POWER_STATE_HALTED
+        elif info['crashed']:
+            # Crashed
+            return XEN_API_VM_POWER_STATE_CRASHED
         else:
             # We are either RUNNING or PAUSED
             if info['paused']:
# HG changeset patch
# User Jim Fehlig <jfehlig@xxxxxxxxxx>
# Date 1201214105 25200
# Node ID ff3ebb57e9859a30c29d4aea6a5e2439616ea655
# Parent  cc85865f26a7cbced1d171fd52da224dca066a98
Fix 'on_*=rename-restart' domain configuration option.

When setting e.g. 'on_crash=rename-restart' option in domain config and
crashing guest OS running in the domain, the new domain is restarted with
same name as renamed domain.

jfehlig4: # xm li
Name                                        ID   Mem VCPUs State  Time(s)
Domain-0                                     0   1233   4  r----- 937.9
Domain-e64b12a0-0493-44d7-afde-55c776513426 21   384    1  ---c-  14.3
Domain-e64b12a0-0493-44d7-afde-55c776513426 22   384    1  r-----  7.3

This patch copies the domain info prior to setting new name and uuid in
the crashed domain info and uses the copied domain info to construct the
restarted domain.

Signed-off-by: Jim Fehlig <jfehlig@xxxxxxxxxx>

diff -r cc85865f26a7 -r ff3ebb57e985 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Thu Jan 24 15:20:39 2008 -0700
+++ b/tools/python/xen/xend/XendDomainInfo.py   Thu Jan 24 15:35:05 2008 -0700
@@ -1393,9 +1393,10 @@ class XendDomainInfo:
 
         self._writeVm('xend/previous_restart_time', str(now))
 
+        new_dom_info = self.info
         try:
             if rename:
-                self._preserveForRestart()
+                new_dom_info = self._preserveForRestart()
             else:
                 self._unwatchVm()
                 self.destroyDomain()
@@ -1409,7 +1410,7 @@ class XendDomainInfo:
             new_dom = None
             try:
                 new_dom = XendDomain.instance().domain_create_from_dict(
-                    self.info)
+                    new_dom_info)
                 new_dom.waitForDevices()
                 new_dom.unpause()
                 rst_cnt = self._readVm('xend/restart_count')
@@ -1440,11 +1441,15 @@ class XendDomainInfo:
                  new_name, new_uuid)
         self._unwatchVm()
         self._releaseDevices()
+        new_dom_info = self.info.copy()
+        new_dom_info['name_label'] = self.info['name_label']
+        new_dom_info['uuid'] = self.info['uuid']
         self.info['name_label'] = new_name
         self.info['uuid'] = new_uuid
         self.vmpath = XS_VMROOT + new_uuid
         self._storeVmDetails()
         self._preserve()
+        return new_dom_info
 
 
     def _preserve(self):
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
<Prev in Thread] Current Thread [Next in Thread>