
On 2021/11/10 17:32, Michal Prívozník wrote:
On 10/25/21 11:04 AM, Bihong Yu wrote:
During the vm rebooting, the vm could be paused if the libvirtd is restarted for some reason, which is not expected. We need continue fakereboot process if fakereboot flags is true and the vm is in paused-user status.
Signed-off-by: Bihong Yu <yubihong@huawei.com> --- src/qemu/qemu_process.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 832ce164fb..a758b96fa6 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8742,13 +8742,15 @@ qemuProcessReconnect(void *opaque) goto error; }
- /* In case the domain shutdown while we were not running, - * we need to finish the shutdown process. And we need to do it after - * we have virQEMUCaps filled in. + /* In case the domain shutdown or fake reboot while we were not running, + * we need to finish the shutdown or fake reboot process. And we need to + * do it after we have virQEMUCaps filled in. */ if (state == VIR_DOMAIN_SHUTDOWN || (state == VIR_DOMAIN_PAUSED && - reason == VIR_DOMAIN_PAUSED_SHUTTING_DOWN)) { + reason == VIR_DOMAIN_PAUSED_SHUTTING_DOWN) || + (priv->fakeReboot && state == VIR_DOMAIN_PAUSED && + reason == VIR_DOMAIN_PAUSED_USER)) {
One thing that I don't quite understand is why this new condition checks for state or reason. I could understand the reason a bit (because domain is paused after SHUTDOWN event), but the reason? Can you elaborate please?
Hi, Michal. Thank you for your reply. The reason is that: while libvirt reboot vm with ACPI mode, the vm will undergo the following state changes: running -> shutdown -> prelaunch -> running If libvirtd reboot after vm prelaunch status and before vm running status, the qemuProcessUpdateState() will update the vm status to 'VIR_DOMAIN_PAUSED' and reason to 'VIR_DOMAIN_PAUSED_USER' according to the qemuMonitorGetStatus() returning result in qemuProcessReconnect(). So, we need to recognize this scenario and continue to finish rebooting process.
VIR_DEBUG("Finishing shutdown sequence for domain %s", obj->def->name); qemuProcessShutdownOrReboot(driver, obj);
Michal
.