Skip to contentSkip to conversation

problem with rename-restart behavior in xend

RFC PATCH New Jim Fehlig 1 participant 1 message Jan 23, 2008

lore
Share & tools
lore

Jim Fehlig

author
#0 lore raw

RFC PATCH 1/1 problem with rename-restart behavior in xend

While fixing the /vm/<uuid> leak discussed in this thread

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

I found that 'rename-restart' option in guest config file was not working properly. On a 3.2 system with 'on_crash=rename-restart' in guest config, after crashing the guest I observed

jfehlig4: # xm li
Name ID Mem VCPUs State
Time(s)
Domain-0 0 1233 4 r-----
962.6
Domain-8159ab1d-bb0d-6853-4264-5f129efdd4af 23 384 1
----c- 14.1

Notice the domain did not restart due to _stateGet returning XEN_API_VM_POWER_STATE_RUNNING. From xend.log

[2008-01-23 15:07:10 27490] ERROR (XendDomainInfo:111) Domain construction failed
Traceback (most recent call last):
File "/usr/lib64/python2.4/site-packages/xen/xend/XendDomainInfo.py",
line 109, in create_from_dict

    vm.start()

File "/usr/lib64/python2.4/site-packages/xen/xend/XendDomainInfo.py",
line 444, in start
raise XendError('VM already running')
XendError: VM already running

Patch xend_crashed_ps.diff fixes that problem but I wanted to get some comments on the approach. Essentially it introduces a power state of crashed. At first I wasn't too keen on the idea, but after some though I think it is analogous the the paused power state, i.e. the domain has some resources assigned to it but it is no longer executing instructions. This patch is not complete but I wanted to see how folks felt about it before proceeding. The patch needs to include corresponding changes to XenAPI C bindings, documentation, etc. to be complete.

Now, after getting past this problem I noticed that the crashed domain was restarted but with same name :-(. E.g.

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

Patch xend_rename-restart.diff fixes this problem and is rather straight-forward I believe. With both patches the expected behavior is observed:

jfehlig4: # xm li
Name ID Mem VCPUs State
Time(s)
Domain-0 0 1233 4 r-----
1002.4
Domain-84e3e790-83bc-d6de-6638-5321916adaee 24 384 1
----c- 13.9
sles10_64 25 384 1
-b---- 17.0

If there are no objections the the crashed power state notion I will compete the patch and resubmit both.

BTW, I'm making progress on the xenstore leak but all of these other bugs keep getting in the way :-).

Cheers,
Jim

tools/python/xen/xend/XendAPIConstants.py +3 -1
diff -r 1c826ea72a80 tools/python/xen/xend/XendAPIConstants.py
@@ -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',
tools/python/xen/xend/XendConstants.py +2 -0
diff -r 1c826ea72a80 tools/python/xen/xend/XendConstants.py
@@ -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 = [
tools/python/xen/xend/XendDomain.py +4 -2
diff -r 1c826ea72a80 tools/python/xen/xend/XendDomain.py
@@ -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,7 +1193,7 @@ 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])
@@ -1216,7 +1218,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()])
tools/python/xen/xend/XendDomainInfo.py +5 -2
diff -r 1c826ea72a80 tools/python/xen/xend/XendDomainInfo.py
@@ -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']:
tools/python/xen/xend/XendDomainInfo.py +7 -2
diff -r 6050851a599f tools/python/xen/xend/XendDomainInfo.py
@@ -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
[email protected]
http://lists.xensource.com/xen-devel