mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Restore lost shutdown reason
When qemuProcessReconnectHelper was introduced (commitd38897a5d
) reconnection failure used VIR_DOMAIN_SHUTOFF_FAILED; however, that was changed in commitbda2f17d
to either VIR_DOMAIN_SHUTOFF_CRASHED or VIR_DOMAIN_SHUTOFF_UNKNOWN. When QEMU_CAPS_NO_SHUTDOWN checking was removed in commitfe35b1ad6
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)
|
if (priv->allowReboot == VIR_TRISTATE_BOOL_NO)
|
||||||
virCommandAddArg(cmd, "-no-reboot");
|
virCommandAddArg(cmd, "-no-reboot");
|
||||||
|
|
||||||
/* If JSON monitor is enabled, we can receive an event
|
if (qemuDomainIsUsingNoShutdown(priv))
|
||||||
* 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)
|
|
||||||
virCommandAddArg(cmd, "-no-shutdown");
|
virCommandAddArg(cmd, "-no-shutdown");
|
||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_ACPI)) {
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NO_ACPI)) {
|
||||||
|
@ -13561,3 +13561,20 @@ qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason)
|
|||||||
|
|
||||||
return VIR_DOMAIN_EVENT_RESUMED_UNPAUSED;
|
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
|
virDomainEventResumedDetailType
|
||||||
qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason);
|
qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason);
|
||||||
|
|
||||||
|
bool
|
||||||
|
qemuDomainIsUsingNoShutdown(qemuDomainObjPrivatePtr priv);
|
||||||
|
|
||||||
#endif /* __QEMU_DOMAIN_H__ */
|
#endif /* __QEMU_DOMAIN_H__ */
|
||||||
|
@ -7988,11 +7988,16 @@ qemuProcessReconnect(void *opaque)
|
|||||||
if (virDomainObjIsActive(obj)) {
|
if (virDomainObjIsActive(obj)) {
|
||||||
/* We can't get the monitor back, so must kill the VM
|
/* We can't get the monitor back, so must kill the VM
|
||||||
* to remove danger of it ending up running twice if
|
* to remove danger of it ending up running twice if
|
||||||
* user tries to start it again later
|
* 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
|
* If we cannot get to the monitor when the QEMU command
|
||||||
* crashed ... */
|
* line used -no-shutdown, then we can safely say that the
|
||||||
state = VIR_DOMAIN_SHUTOFF_CRASHED;
|
* 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
|
/* 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
|
* thread didn't have a chance to start playing with the domain yet
|
||||||
* (it's all we can do anyway).
|
* (it's all we can do anyway).
|
||||||
|
Loading…
Reference in New Issue
Block a user