# HG changeset patch # User Keir Fraser # Date 1202376535 0 # Node ID 58e5e9ae0f8dcc4abb390d46d89e49c65e62607b # Parent d04593aa1605fd337423b2c1296e275424e06656 Add 'coredump-destroy' and 'coredump-restart' actions for crashed domains. Xen-API already specifies these actions for the 'on_crash' domain exit event. This patch makes them available for use in traditional domU config files and through the xm tool as well. Signed-off-by: Jim Fehlig Index: xen-3.2.1-testing/docs/man/xmdomain.cfg.pod.5 =================================================================== --- xen-3.2.1-testing.orig/docs/man/xmdomain.cfg.pod.5 +++ xen-3.2.1-testing/docs/man/xmdomain.cfg.pod.5 @@ -298,6 +298,22 @@ it holds, so that the new one may take t =back +=over 4 + +Additionally, the "on_crash" event can also take: + +=item B + +Dump the crashed domain's core and then destroy it. + +=back + +=item B + +Dump the crashed domain's core and then restart it. + +=back + =head1 EXAMPLES The following are quick examples of ways that domains might be Index: xen-3.2.1-testing/tools/examples/xmexample.hvm =================================================================== --- xen-3.2.1-testing.orig/tools/examples/xmexample.hvm +++ xen-3.2.1-testing/tools/examples/xmexample.hvm @@ -87,6 +87,11 @@ disk = [ 'file:/var/images/min-el3-i386. # "rename-restart", meaning that the old domain is not cleaned up, but is # renamed and a new domain started in its place. # +# In the event a domain stops due to a crash, you have the additional options: +# +# "coredump-destroy", meaning dump the crashed domain's core and then destroy; +# "coredump-restart', meaning dump the crashed domain's core and the restart. +# # The default is # # on_poweroff = 'destroy' Index: xen-3.2.1-testing/tools/examples/xmexample1 =================================================================== --- xen-3.2.1-testing.orig/tools/examples/xmexample1 +++ xen-3.2.1-testing/tools/examples/xmexample1 @@ -155,6 +155,11 @@ extra = "4" # "rename-restart", meaning that the old domain is not cleaned up, but is # renamed and a new domain started in its place. # +# In the event a domain stops due to a crash, you have the additional options: +# +# "coredump-destroy", meaning dump the crashed domain's core and then destroy; +# "coredump-restart', meaning dump the crashed domain's core and the restart. +# # The default is # # on_poweroff = 'destroy' Index: xen-3.2.1-testing/tools/examples/xmexample2 =================================================================== --- xen-3.2.1-testing.orig/tools/examples/xmexample2 +++ xen-3.2.1-testing/tools/examples/xmexample2 @@ -191,6 +191,11 @@ extra = "4 VMID=%d usr=/dev/sda6" % vmid # "rename-restart", meaning that the old domain is not cleaned up, but is # renamed and a new domain started in its place. # +# In the event a domain stops due to a crash, you have the additional options: +# +# "coredump-destroy", meaning dump the crashed domain's core and then destroy; +# "coredump-restart', meaning dump the crashed domain's core and the restart. +# # The default is # # on_poweroff = 'destroy' Index: xen-3.2.1-testing/tools/examples/xmexample3 =================================================================== --- xen-3.2.1-testing.orig/tools/examples/xmexample3 +++ xen-3.2.1-testing/tools/examples/xmexample3 @@ -177,6 +177,11 @@ extra = "4 VMID=%d" % vmid # "rename-restart", meaning that the old domain is not cleaned up, but is # renamed and a new domain started in its place. # +# In the event a domain stops due to a crash, you have the additional options: +# +# "coredump-destroy", meaning dump the crashed domain's core and then destroy; +# "coredump-restart', meaning dump the crashed domain's core and the restart. +# # The default is # # on_poweroff = 'destroy' Index: xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py =================================================================== --- xen-3.2.1-testing.orig/tools/python/xen/xend/XendAPIConstants.py +++ xen-3.2.1-testing/tools/python/xen/xend/XendAPIConstants.py @@ -51,6 +51,18 @@ XEN_API_ON_CRASH_BEHAVIOUR = [ 'rename_restart' ] +XEN_API_ON_CRASH_BEHAVIOUR_FILTER = { + 'destroy' : 'destroy', + 'coredump-destroy' : 'coredump_and_destroy', + 'coredump_and_destroy' : 'coredump_and_destroy', + 'restart' : 'restart', + 'coredump-restart' : 'coredump_and_restart', + 'coredump_and_restart' : 'coredump_and_restart', + 'preserve' : 'preserve', + 'rename-restart' : 'rename_restart', + 'rename_restart' : 'rename_restart', +} + XEN_API_VBD_MODE = ['RO', 'RW'] XEN_API_VDI_TYPE = ['system', 'user', 'ephemeral'] XEN_API_VBD_TYPE = ['CD', 'Disk'] Index: xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py =================================================================== --- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConfig.py +++ xen-3.2.1-testing/tools/python/xen/xend/XendConfig.py @@ -241,7 +241,8 @@ LEGACY_XENSTORE_VM_PARAMS = [ ## Config Choices ## -CONFIG_RESTART_MODES = ('restart', 'destroy', 'preserve', 'rename-restart') +CONFIG_RESTART_MODES = ('restart', 'destroy', 'preserve', 'rename-restart', + 'coredump-destroy', 'coredump-restart') CONFIG_OLD_DOM_STATES = ('running', 'blocked', 'paused', 'shutdown', 'crashed', 'dying') Index: xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py =================================================================== --- xen-3.2.1-testing.orig/tools/python/xen/xend/XendConstants.py +++ xen-3.2.1-testing/tools/python/xen/xend/XendConstants.py @@ -52,7 +52,9 @@ restart_modes = [ "restart", "destroy", "preserve", - "rename-restart" + "rename-restart", + "coredump-destroy", + "coredump-restart" ] DOM_STATES = [ Index: xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py =================================================================== --- xen-3.2.1-testing.orig/tools/python/xen/xend/XendDomainInfo.py +++ xen-3.2.1-testing/tools/python/xen/xend/XendDomainInfo.py @@ -1262,14 +1262,6 @@ class XendDomainInfo: self.info['name_label'], self.domid) self._writeVm(LAST_SHUTDOWN_REASON, 'crash') - if xoptions.get_enable_dump(): - try: - self.dumpCore() - except XendError: - # This error has been logged -- there's nothing more - # we can do in this context. - pass - restart_reason = 'crash' self._stateSet(DOM_STATE_HALTED) @@ -1337,14 +1329,30 @@ class XendDomainInfo: def _clearRestart(self): self._removeDom("xend/shutdown_start_time") + def _maybeDumpCore(self, reason): + if reason == 'crash': + if xoptions.get_enable_dump() or self.get_on_crash() \ + in ['coredump_and_destroy', 'coredump_and_restart']: + try: + self.dumpCore() + except XendError: + # This error has been logged -- there's nothing more + # we can do in this context. + pass def _maybeRestart(self, reason): + # Before taking configured action, dump core if configured to do so. + # + self._maybeDumpCore(reason) + # Dispatch to the correct method based upon the configured on_{reason} # behaviour. actions = {"destroy" : self.destroy, "restart" : self._restart, "preserve" : self._preserve, - "rename-restart" : self._renameRestart} + "rename-restart" : self._renameRestart, + "coredump-destroy" : self.destroy, + "coredump-restart" : self._restart} action_conf = { 'poweroff': 'actions_after_shutdown', @@ -2558,9 +2566,10 @@ class XendDomainInfo: def get_on_crash(self): after_crash = self.info.get('actions_after_crash') - if not after_crash or after_crash not in XEN_API_ON_CRASH_BEHAVIOUR: + if not after_crash or after_crash not in \ + XEN_API_ON_CRASH_BEHAVIOUR + restart_modes: return XEN_API_ON_CRASH_BEHAVIOUR[0] - return after_crash + return XEN_API_ON_CRASH_BEHAVIOUR_FILTER[after_crash] def get_dev_config_by_uuid(self, dev_class, dev_uuid): """ Get's a device configuration either from XendConfig or Index: xen-3.2.1-testing/tools/python/xen/xm/create.py =================================================================== --- xen-3.2.1-testing.orig/tools/python/xen/xm/create.py +++ xen-3.2.1-testing/tools/python/xen/xm/create.py @@ -260,15 +260,17 @@ gopts.var('on_reboot', val='destroy|rest renamed and a new domain started in its place. """) -gopts.var('on_crash', val='destroy|restart|preserve|rename-restart', +gopts.var('on_crash', val='destroy|restart|preserve|rename-restart|coredump-destroy|ciredump-restart', fn=set_value, default=None, - use="""Behaviour when a domain exits with reason 'crash'. - - destroy: the domain is cleaned up as normal; - - restart: a new domain is started in place of the old one; - - preserve: no clean-up is done until the domain is manually - destroyed (using xm destroy, for example); - - rename-restart: the old domain is not cleaned up, but is - renamed and a new domain started in its place. + use="""Behaviour when a domain exits with reason 'crash'. + - destroy: the domain is cleaned up as normal; + - restart: a new domain is started in place of the old one; + - preserve: no clean-up is done until the domain is manually + destroyed (using xm destroy, for example); + - rename-restart: the old domain is not cleaned up, but is + renamed and a new domain started in its place. + - coredump-destroy: dump the domain's core, followed by destroy + - coredump-restart: dump the domain's core, followed by restart """) gopts.var('blkif', val='no|yes',