``coredump-restart``
The crashed domain's core will be dumped, and then the domain will be
restarted with the same configuration
+``preserve-running``
+ The crashed domain will continue to run. This is useful if the guest OS can
+ do an internal crash dump and reboot itself. :since:`Since 12.6.0`
:since:`Since 3.9.0`, the lifecycle events can be configured via the
`virDomainSetLifecycleAction <html/libvirt-libvirt-domain.html#virDomainSetLifecycleAction>`__
VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE = 3, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY = 4, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART = 5, /* (Since: 3.9.0) */
+ VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING = 6, /* (Since: 12.6.0) */
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_LIFECYCLE_ACTION_LAST /* (Since: 3.9.0) */
"preserve",
"coredump-destroy",
"coredump-restart",
+ "preserve-running",
);
VIR_ENUM_IMPL(virDomainLockFailure,
return true;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
break;
}
break;
destroy: The domain is cleaned up
restart: A new domain is started in place of the old one
preserve: The domain will remain in memory until it is destroyed manually
+ preserve-running: Keep the domain as is, let the guest handle the crash.
rename-restart: a variant of the previous one but where the old domain is
renamed before being saved to allow a restart
coredump-destroy: The crashed domain's core will be dumped, and then the
<value>rename-restart</value>
<value>coredump-destroy</value>
<value>coredump-restart</value>
+ <value>preserve-running</value>
</choice>
</define>
<!--
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
return LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
libxlDomainAutoCoreDump(driver, vm);
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
qemuDomainSaveStatus(vm);
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_CRASHED);
+ qemuDomainSaveStatus(vm);
+ break;
+
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ /* we need to keep resources locked */
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
break;
- case VIR_DOMAIN_LIFECYCLE_POWEROFF:
case VIR_DOMAIN_LIFECYCLE_CRASH:
+ if (vm->def->onCrash == action)
+ break;
+
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_POWEROFF:
case VIR_DOMAIN_LIFECYCLE_LAST:
break;
}
if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='block' device='disk'>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<features>
<async-teardown enabled='yes'/>
</features>
DO_TEST_CAPS_LATEST("crypto-builtin");
+ /* this test case also tests 'preserve-running' onCrash action */
DO_TEST_CAPS_LATEST("async-teardown");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown", "s390x");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown-no-attrib", "s390x");
"rename-restart",
"preserve",
"coredump-destroy",
- "coredump-restart");
+ "coredump-restart",
+ "none");
static bool
cmdSetLifecycleAction(vshControl *ctl, const vshCmd *cmd)