> Hi all:
> Here's the steps we produce the problem:
> 1 reboot guest with the flag of VIR_DOMAIN_REBOOT_ACPI_POWER_BTN
> 2 sleep 1 second (so that the guest is still rebooting, although the API
already returned.)
> 3 migrate the guest
>
> The problem is that : the guest failed to migrate to the dest, and crashed
on source side.
>
> We don't bother to dig further into the problem, the root cause we think is
that we migrate a guest while it's rebooting.
Migration is expected to work no matter what state the guest OS is currently
in. So the fact that its rebooting should be irrelevant. If anything bad happens
then its a bug in QEMU most likely
Thanks, Daniel!
This answer helps me finds out the right direction.
There's one exeption that libvirt may also take response for migration/reboot
problems.
Because there's cooperation between libvirt and qemu to complete the reboot job:
1 libvirt send "powerdown" qmp command to qemu, and set
vm->priv->fakeReboot to 1.
2 the guest starts to shutdown
3 when the guest got shutoff, qemu sends back "shutdown" monitor message to
libvirt
4 libvirt got the message, and checks that vm->priv->fakeReboot is 1, then it sends
"reset" qmp command to qemu (otherwise sends "poweroff")
The reboot job is not atomic, libvirt->qemu->libvirt->qemu, they have several
times of message sending/receiving.
So, we think of the migration + reboot situation:
1 libvirt send "powerdown" qmp command to qemu, and set
vm->priv->fakeReboot to 1.
2 the guest starts to shutdown
3 libvirt migrate the guest to the destination, BUT *priv->fakeReboot is not sended to
the dest*
4 the guest is migrated to the dest
5 the guest shutdown completely inside itself, and qemu now sends back
"shutdown" monitor message to libvirt
6 libvirt at the dest side got the message, and checks that vm->priv->fakeReboot is
0, then it will send "poweroff" rather than "reset" to qemu, the guest
got shutoff rather than rebooted here.
EXPECTED:
Guest got rebooted on the dest
EXACT:
Guest got shutoff on the dest.
So, shall we send privateData to the dest also? I found that libvirt parses privataData
when it reloads/starts, we may also send/parse it during migration?
Thanks
Zhang Bo(Oscar)