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

[Xen-changelog] Change rebooting specification so that we can have domains crash and stay



# HG changeset patch
# User emellor@ewan
# Node ID fe401301929ed51cca4641d35ea305bcf7f10892
# Parent  034ada135379666b6c20b30788b206c2daa1af11
Change rebooting specification so that we can have domains crash and stay
around to be debugged, for example.

Fix problem in XendDomainInfo.eventChannel caused by a mis-merge.

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

diff -r 034ada135379 -r fe401301929e tools/examples/xmexample.vmx
--- a/tools/examples/xmexample.vmx      Fri Sep 30 12:58:08 2005
+++ b/tools/examples/xmexample.vmx      Fri Sep 30 12:59:28 2005
@@ -48,12 +48,36 @@
 disk = [ 'file:/var/images/min-el3-i386.img,ioemu:hda,w' ]
 
 #----------------------------------------------------------------------------
-# Set according to whether you want the domain restarted when it exits.
-# The default is 'onreboot', which restarts the domain when it shuts down
-# with exit code reboot.
-# Other values are 'always', and 'never'.
+# Configure the behaviour when a domain exits.  There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash.  For each of these you
+# may specify "destroy", meaning that the domain is cleaned up as normal,
+# "restart", meaning that a new domain is started in place of the old one, or
+# "preserve", meaning that no clean-up is done until the domain is manually
+# destroyed (using xm destroy, for example).
+#
+# The default is
+#
+#   on_poweroff = 'destroy'
+#   on_reboot   = 'restart'
+#   on_crash    = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'destroy'
+#
+# restart = 'always'   means on_poweroff = 'restart'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'restart'
+#
+# restart = 'never'    means on_poweroff = 'destroy'
+#                            on_reboot   = 'destroy'
+#                            on_crash    = 'destroy'
 
-#restart = 'onreboot'
+#on_poweroff = 'destroy'
+#on_reboot   = 'restart'
+#on_crash    = 'restart'
 
 #============================================================================
 
diff -r 034ada135379 -r fe401301929e tools/examples/xmexample1
--- a/tools/examples/xmexample1 Fri Sep 30 12:58:08 2005
+++ b/tools/examples/xmexample1 Fri Sep 30 12:59:28 2005
@@ -91,11 +91,35 @@
 extra = "4"
 
 #----------------------------------------------------------------------------
-# Set according to whether you want the domain restarted when it exits.
-# The default is 'onreboot', which restarts the domain when it shuts down
-# with exit code reboot.
-# Other values are 'always', and 'never'.
+# Configure the behaviour when a domain exits.  There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash.  For each of these you
+# may specify "destroy", meaning that the domain is cleaned up as normal,
+# "restart", meaning that a new domain is started in place of the old one, or
+# "preserve", meaning that no clean-up is done until the domain is manually
+# destroyed (using xm destroy, for example).
+#
+# The default is
+#
+#   on_poweroff = 'destroy'
+#   on_reboot   = 'restart'
+#   on_crash    = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'destroy'
+#
+# restart = 'always'   means on_poweroff = 'restart'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'restart'
+#
+# restart = 'never'    means on_poweroff = 'destroy'
+#                            on_reboot   = 'destroy'
+#                            on_crash    = 'destroy'
 
-#restart = 'onreboot'
+#on_poweroff = 'destroy'
+#on_reboot   = 'restart'
+#on_crash    = 'restart'
 
 #============================================================================
diff -r 034ada135379 -r fe401301929e tools/examples/xmexample2
--- a/tools/examples/xmexample2 Fri Sep 30 12:58:08 2005
+++ b/tools/examples/xmexample2 Fri Sep 30 12:59:28 2005
@@ -127,11 +127,35 @@
 extra = "4 VMID=%d usr=/dev/sda6" % vmid
 
 #----------------------------------------------------------------------------
-# Set according to whether you want the domain restarted when it exits.
-# The default is 'onreboot', which restarts the domain when it shuts down
-# with exit code reboot.
-# Other values are 'always', and 'never'.
+# Configure the behaviour when a domain exits.  There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash.  For each of these you
+# may specify "destroy", meaning that the domain is cleaned up as normal,
+# "restart", meaning that a new domain is started in place of the old one, or
+# "preserve", meaning that no clean-up is done until the domain is manually
+# destroyed (using xm destroy, for example).
+#
+# The default is
+#
+#   on_poweroff = 'destroy'
+#   on_reboot   = 'restart'
+#   on_crash    = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'destroy'
+#
+# restart = 'always'   means on_poweroff = 'restart'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'restart'
+#
+# restart = 'never'    means on_poweroff = 'destroy'
+#                            on_reboot   = 'destroy'
+#                            on_crash    = 'destroy'
 
-#restart = 'onreboot'
+#on_poweroff = 'destroy'
+#on_reboot   = 'restart'
+#on_crash    = 'restart'
 
 #============================================================================
diff -r 034ada135379 -r fe401301929e tools/examples/xmexample3
--- a/tools/examples/xmexample3 Fri Sep 30 12:58:08 2005
+++ b/tools/examples/xmexample3 Fri Sep 30 12:59:28 2005
@@ -124,11 +124,35 @@
 extra = "4 VMID=%d" % vmid
 
 #----------------------------------------------------------------------------
-# Set according to whether you want the domain restarted when it exits.
-# The default is 'onreboot', which restarts the domain when it shuts down
-# with exit code reboot.
-# Other values are 'always', and 'never'.
+# Configure the behaviour when a domain exits.  There are three 'reasons'
+# for a domain to stop: poweroff, reboot, and crash.  For each of these you
+# may specify "destroy", meaning that the domain is cleaned up as normal,
+# "restart", meaning that a new domain is started in place of the old one, or
+# "preserve", meaning that no clean-up is done until the domain is manually
+# destroyed (using xm destroy, for example).
+#
+# The default is
+#
+#   on_poweroff = 'destroy'
+#   on_reboot   = 'restart'
+#   on_crash    = 'restart'
+#
+# For backwards compatibility we also support the deprecated option restart
+#
+# restart = 'onreboot' means on_poweroff = 'destroy'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'destroy'
+#
+# restart = 'always'   means on_poweroff = 'restart'
+#                            on_reboot   = 'restart'
+#                            on_crash    = 'restart'
+#
+# restart = 'never'    means on_poweroff = 'destroy'
+#                            on_reboot   = 'destroy'
+#                            on_crash    = 'destroy'
 
-#restart = 'onreboot'
+#on_poweroff = 'destroy'
+#on_reboot   = 'restart'
+#on_crash    = 'restart'
 
 #============================================================================
diff -r 034ada135379 -r fe401301929e tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Fri Sep 30 12:58:08 2005
+++ b/tools/python/xen/xend/XendDomainInfo.py   Fri Sep 30 12:59:28 2005
@@ -67,14 +67,10 @@
     DOMAIN_CRASH   : "crash",
     }
 
-RESTART_ALWAYS   = 'always'
-RESTART_ONREBOOT = 'onreboot'
-RESTART_NEVER    = 'never'
-
 restart_modes = [
-    RESTART_ALWAYS,
-    RESTART_ONREBOOT,
-    RESTART_NEVER,
+    "restart",
+    "destroy",
+    "preserve"
     ]
 
 STATE_VM_OK         = "ok"
@@ -112,7 +108,10 @@
         ('name',         str),
         ('ssidref',      int),
         ('cpu_weight',   float),
-        ('bootloader',   str)
+        ('bootloader',   str),
+        ('on_poweroff',  str),
+        ('on_reboot',    str),
+        ('on_crash',     str)
     ]
 
 
@@ -135,8 +134,6 @@
     vm.storeVmDetails()
     vm.configure()
     vm.create_channel()
-#         vm.exportToDB()
-#    vm.refreshShutdown()
     vm.storeDomDetails()
     return vm
 
@@ -272,7 +269,6 @@
         result['maxmem']       = get_cfg('maxmem',     int)
         result['maxmem_kb']    = get_cfg('maxmem_kb',  int)
         result['cpu']          = get_cfg('cpu',        int)
-        result['restart_mode'] = get_cfg('restart')
         result['image']        = get_cfg('image')
 
         try:
@@ -295,6 +291,30 @@
             c = sxp.child0(d)
             result['device'].append((sxp.name(c), c))
 
+        # Configuration option "restart" is deprecated.  Parse it, but
+        # let on_xyz override it if they are present.
+        restart = get_cfg('restart')
+        if restart:
+            def handle_restart(event, val):
+                if not event in result:
+                    result[event] = val
+
+            if restart == "onreboot":
+                handle_restart('on_poweroff', 'destroy')
+                handle_restart('on_reboot',   'restart')
+                handle_restart('on_crash',    'destroy')
+            elif restart == "always":
+                handle_restart('on_poweroff', 'restart')
+                handle_restart('on_reboot',   'restart')
+                handle_restart('on_crash',    'restart')
+            elif restart == "never":
+                handle_restart('on_poweroff', 'destroy')
+                handle_restart('on_reboot',   'destroy')
+                handle_restart('on_crash',    'destroy')
+            else:
+                log.warn("Ignoring malformed and deprecated config option "
+                         "restart = %s", restart)
+
         log.debug("parseConfig: result is %s" % str(result))
         return result
 
@@ -347,7 +367,9 @@
                 self.info[name] = val
 
         params = (("name", str),
-                  ("restart_mode", str),
+                  ("on_poweroff",  str),
+                  ("on_reboot",    str),
+                  ("on_crash",     str),
                   ("image",        str),
                   ("start_time", float))
 
@@ -375,7 +397,9 @@
         try:
             defaultInfo('name',         lambda: "Domain-%d" % self.domid)
             defaultInfo('ssidref',      lambda: 0)
-            defaultInfo('restart_mode', lambda: RESTART_ONREBOOT)
+            defaultInfo('on_poweroff',  lambda: "destroy")
+            defaultInfo('on_reboot',    lambda: "restart")
+            defaultInfo('on_crash',     lambda: "restart")
             defaultInfo('cpu',          lambda: None)
             defaultInfo('cpu_weight',   lambda: 1.0)
             defaultInfo('bootloader',   lambda: None)
@@ -459,9 +483,10 @@
                     raise VmError('invalid device (%s, %s)' %
                                   (str(n), str(c)))
 
-            if self.info['restart_mode'] not in restart_modes:
-                raise VmError('invalid restart mode: ' +
-                              str(self.info['restart_mode']))
+            for event in ['on_poweroff', 'on_reboot', 'on_crash']:
+                if self.info[event] not in restart_modes:
+                    raise VmError('invalid restart event: %s = %s' %
+                                  (event, str(self.info[event])))
 
             if 'cpumap' not in self.info:
                 if [self.info['vcpus'] == 1]:
@@ -509,14 +534,14 @@
         to_store = {
             'uuid':               self.uuid,
 
-            # !!!
+            # XXX
             'memory/target':      str(self.info['memory_KiB'])
             }
 
         if self.infoIsSet('image'):
             to_store['image'] = sxp.to_string(self.info['image'])
 
-        for k in ['name', 'ssidref', 'restart_mode']:
+        for k in ['name', 'ssidref', 'on_poweroff', 'on_reboot', 'on_crash']:
             if self.infoIsSet(k):
                 to_store[k] = str(self.info[k])
 
@@ -625,7 +650,7 @@
                 if xroot.get_enable_dump():
                     self.dumpCore()
 
-                restart_reason = 'crashed'
+                restart_reason = 'crash'
 
             elif xeninfo['shutdown']:
                 reason = shutdown_reason(xeninfo['shutdown_reason'])
@@ -682,10 +707,16 @@
 
 
     def maybeRestart(self, reason):
-        if self.restart_needed(reason):
-            self.restart()
-        else:
-            self.destroy()
+        # Dispatch to the correct method based upon the configured on_{reason}
+        # behaviour.
+        {"destroy"  : self.destroy,
+         "restart"  : self.restart,
+         "preserve" : self.preserve}[self.info['on_' + reason]]()
+
+
+    def preserve(self):
+        log.info("Preserving dead domain %s (%d).", self.info['name'],
+                 self.domid)
 
 
     def dumpCore(self):
@@ -998,7 +1029,6 @@
         """
         self.create_channel()
         self.image.createImage()
-#        !!! self.exportToDB()
         IntroduceDomain(self.domid, self.store_mfn,
                         self.store_channel.port1, self.dompath)
         self.configure_vcpus()
@@ -1091,7 +1121,6 @@
                 # The port is not yet set, i.e. the channel has not yet been
                 # created.
                 pass
-        ret = channel.eventChannel(0, self.domid, port1=port, port2=0)
 
         # Stale port information from above causes an Invalid Argument to be
         # thrown by the eventChannel call below.  To recover, we throw away

_______________________________________________
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®.