mirror of https://gitee.com/openkylin/libvirt.git
If there is a failure during Qemu offline migrate, make sure to resume the
guest. Signed-off-by: Chris Lalancette <clalance@redhat.com>
This commit is contained in:
parent
9bceeca83c
commit
014bb5cf7e
|
@ -1,3 +1,8 @@
|
|||
Fri Feb 27 17:15:00 CET 2009 Chris Lalancette <clalance@redhat.com>
|
||||
|
||||
* src/qemu_driver.c: If there is a failure during offline migrate,
|
||||
make sure to resume the guest.
|
||||
|
||||
Fri Feb 27 15:27:31 CET 2009 Daniel Veillard <veillard@redhat.com>
|
||||
|
||||
* docs/libvirt-api.xml docs/libvirt-refs.xml
|
||||
|
|
|
@ -4331,6 +4331,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
|||
char cmd[HOST_NAME_MAX+50];
|
||||
char *info = NULL;
|
||||
int ret = -1;
|
||||
int paused = 0;
|
||||
|
||||
qemuDriverLock(driver);
|
||||
vm = virDomainFindByID(&driver->domains, dom->id);
|
||||
|
@ -4348,10 +4349,14 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
|||
|
||||
if (!(flags & VIR_MIGRATE_LIVE)) {
|
||||
/* Pause domain for non-live migration */
|
||||
snprintf(cmd, sizeof cmd, "%s", "stop");
|
||||
qemudMonitorCommand (vm, cmd, &info);
|
||||
if (qemudMonitorCommand (vm, "stop", &info) < 0) {
|
||||
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
|
||||
"%s", _("off-line migration specified, but suspend operation failed"));
|
||||
goto cleanup;
|
||||
}
|
||||
DEBUG ("stop reply: %s", info);
|
||||
VIR_FREE(info);
|
||||
paused = 1;
|
||||
|
||||
event = virDomainEventNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_SUSPENDED,
|
||||
|
@ -4396,6 +4401,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
|||
|
||||
/* Clean up the source domain. */
|
||||
qemudShutdownVMDaemon (dom->conn, driver, vm);
|
||||
paused = 0;
|
||||
|
||||
event = virDomainEventNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_STOPPED,
|
||||
|
@ -4407,7 +4413,31 @@ qemudDomainMigratePerform (virDomainPtr dom,
|
|||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
/* Note that we have to free info *first*, since we are re-using the
|
||||
* variable below (and otherwise might cause a memory leak)
|
||||
*/
|
||||
VIR_FREE(info);
|
||||
|
||||
if (paused) {
|
||||
/* we got here through some sort of failure; start the domain again */
|
||||
if (qemudMonitorCommand (vm, "cont", &info) < 0) {
|
||||
/* Hm, we already know we are in error here. We don't want to
|
||||
* overwrite the previous error, though, so we just throw something
|
||||
* to the logs and hope for the best
|
||||
*/
|
||||
qemudLog(QEMUD_ERROR, _("Failed to resume guest %s after failure\n"),
|
||||
vm->def->name);
|
||||
}
|
||||
else {
|
||||
DEBUG ("cont reply: %s", info);
|
||||
VIR_FREE(info);
|
||||
}
|
||||
|
||||
event = virDomainEventNewFromObj(vm,
|
||||
VIR_DOMAIN_EVENT_RESUMED,
|
||||
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
|
||||
}
|
||||
|
||||
if (vm)
|
||||
virDomainObjUnlock(vm);
|
||||
if (event)
|
||||
|
|
Loading…
Reference in New Issue