mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 20:45:18 +00:00
qemu: Restore lost shutdown reason
When qemuProcessReconnectHelper was introduced (commit d38897a5d) reconnection failure used VIR_DOMAIN_SHUTOFF_FAILED; however, that was changed in commit bda2f17d to either VIR_DOMAIN_SHUTOFF_CRASHED or VIR_DOMAIN_SHUTOFF_UNKNOWN. When QEMU_CAPS_NO_SHUTDOWN checking was removed in commit fe35b1ad6 the conditional state was just left at VIR_DOMAIN_SHUTOFF_CRASHED. So introduce qemuDomainIsUsingNoShutdown which will manage the condition when the domain was started with -no-shutdown so that when/if reconnection failure occurs we can restore the decision point used to determine whether CRASHED or UNKNOWN is provided. Signed-off-by: John Ferlan <jferlan@redhat.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
8496c17c53
commit
296e05b54b
@ -6415,11 +6415,7 @@ qemuBuildPMCommandLine(virCommandPtr cmd,
|
||||
if (priv->allowReboot == VIR_TRISTATE_BOOL_NO)
|
||||
virCommandAddArg(cmd, "-no-reboot");
|
||||
|
||||
/* If JSON monitor is enabled, we can receive an event
|
||||
* when QEMU stops. If we use no-shutdown, then we can
|
||||
* watch for this event and do a soft/warm reboot.
|
||||
*/
|
||||
if (priv->monJSON && priv->allowReboot == VIR_TRISTATE_BOOL_YES)
|
||||
if (qemuDomainIsUsingNoShutdown(priv))
|
||||
virCommandAddArg(cmd, "-no-shutdown");
|
||||
|
||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_ACPI)) {
|
||||
|
@ -13561,3 +13561,20 @@ qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason)
|
||||
|
||||
return VIR_DOMAIN_EVENT_RESUMED_UNPAUSED;
|
||||
}
|
||||
|
||||
|
||||
/* qemuDomainIsUsingNoShutdown:
|
||||
* @priv: Domain private data
|
||||
*
|
||||
* If JSON monitor is enabled, we can receive an event when QEMU stops. If
|
||||
* we use no-shutdown, then we can watch for this event and do a soft/warm
|
||||
* reboot.
|
||||
*
|
||||
* Returns: @true when -no-shutdown either should be or was added to the
|
||||
* command line.
|
||||
*/
|
||||
bool
|
||||
qemuDomainIsUsingNoShutdown(qemuDomainObjPrivatePtr priv)
|
||||
{
|
||||
return priv->monJSON && priv->allowReboot == VIR_TRISTATE_BOOL_YES;
|
||||
}
|
||||
|
@ -1089,4 +1089,7 @@ void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv);
|
||||
virDomainEventResumedDetailType
|
||||
qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason);
|
||||
|
||||
bool
|
||||
qemuDomainIsUsingNoShutdown(qemuDomainObjPrivatePtr priv);
|
||||
|
||||
#endif /* __QEMU_DOMAIN_H__ */
|
||||
|
@ -7988,11 +7988,16 @@ qemuProcessReconnect(void *opaque)
|
||||
if (virDomainObjIsActive(obj)) {
|
||||
/* We can't get the monitor back, so must kill the VM
|
||||
* to remove danger of it ending up running twice if
|
||||
* user tries to start it again later
|
||||
* If we couldn't get the monitor since QEMU supports
|
||||
* no-shutdown, we can safely say that the domain
|
||||
* crashed ... */
|
||||
state = VIR_DOMAIN_SHUTOFF_CRASHED;
|
||||
* user tries to start it again later.
|
||||
*
|
||||
* If we cannot get to the monitor when the QEMU command
|
||||
* line used -no-shutdown, then we can safely say that the
|
||||
* domain crashed; otherwise, we don't really know. */
|
||||
if (qemuDomainIsUsingNoShutdown(priv))
|
||||
state = VIR_DOMAIN_SHUTOFF_CRASHED;
|
||||
else
|
||||
state = VIR_DOMAIN_SHUTOFF_UNKNOWN;
|
||||
|
||||
/* If BeginJob failed, we jumped here without a job, let's hope another
|
||||
* thread didn't have a chance to start playing with the domain yet
|
||||
* (it's all we can do anyway).
|
||||
|
Loading…
x
Reference in New Issue
Block a user