mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Move internals of Begin phase to qemu_migration.c
This commit is contained in:
parent
83b43717a6
commit
d3ce7363f3
@ -10200,81 +10200,20 @@ qemuDomainMigrateBegin3(virDomainPtr domain,
|
|||||||
const char *dname,
|
const char *dname,
|
||||||
unsigned long resource ATTRIBUTE_UNUSED)
|
unsigned long resource ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
virQEMUDriverPtr driver = domain->conn->privateData;
|
|
||||||
virDomainObjPtr vm;
|
virDomainObjPtr vm;
|
||||||
char *xml = NULL;
|
|
||||||
enum qemuDomainAsyncJob asyncJob;
|
|
||||||
|
|
||||||
virCheckFlags(QEMU_MIGRATION_FLAGS, NULL);
|
virCheckFlags(QEMU_MIGRATION_FLAGS, NULL);
|
||||||
|
|
||||||
if (!(vm = qemuDomObjFromDomain(domain)))
|
if (!(vm = qemuDomObjFromDomain(domain)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (virDomainMigrateBegin3EnsureACL(domain->conn, vm->def) < 0)
|
if (virDomainMigrateBegin3EnsureACL(domain->conn, vm->def) < 0) {
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
|
||||||
if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
asyncJob = QEMU_ASYNC_JOB_MIGRATION_OUT;
|
|
||||||
} else {
|
|
||||||
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
asyncJob = QEMU_ASYNC_JOB_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm) && !(flags & VIR_MIGRATE_OFFLINE)) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
"%s", _("domain is not running"));
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if there is any ejected media.
|
|
||||||
* We don't want to require them on the destination.
|
|
||||||
*/
|
|
||||||
if (!(flags & VIR_MIGRATE_OFFLINE) &&
|
|
||||||
qemuDomainCheckEjectableMedia(driver, vm, asyncJob) < 0)
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
if (!(xml = qemuMigrationBegin(driver, vm, xmlin, dname,
|
|
||||||
cookieout, cookieoutlen,
|
|
||||||
flags)))
|
|
||||||
goto endjob;
|
|
||||||
|
|
||||||
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
|
||||||
/* We keep the job active across API calls until the confirm() call.
|
|
||||||
* This prevents any other APIs being invoked while migration is taking
|
|
||||||
* place.
|
|
||||||
*/
|
|
||||||
if (virQEMUCloseCallbacksSet(driver->closeCallbacks, vm, domain->conn,
|
|
||||||
qemuMigrationCleanup) < 0)
|
|
||||||
goto endjob;
|
|
||||||
if (qemuMigrationJobContinue(vm) == 0) {
|
|
||||||
vm = NULL;
|
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
||||||
"%s", _("domain disappeared"));
|
|
||||||
VIR_FREE(xml);
|
|
||||||
if (cookieout)
|
|
||||||
VIR_FREE(*cookieout);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (vm)
|
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
return xml;
|
return NULL;
|
||||||
|
|
||||||
endjob:
|
|
||||||
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
|
||||||
if (qemuMigrationJobFinish(driver, vm) == 0)
|
|
||||||
vm = NULL;
|
|
||||||
} else {
|
|
||||||
if (qemuDomainObjEndJob(driver, vm) == 0)
|
|
||||||
vm = NULL;
|
|
||||||
}
|
}
|
||||||
goto cleanup;
|
|
||||||
|
return qemuMigrationBegin(domain->conn, vm, xmlin, dname,
|
||||||
|
cookieout, cookieoutlen, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "qemu_capabilities.h"
|
#include "qemu_capabilities.h"
|
||||||
#include "qemu_command.h"
|
#include "qemu_command.h"
|
||||||
#include "qemu_cgroup.h"
|
#include "qemu_cgroup.h"
|
||||||
|
#include "qemu_hotplug.h"
|
||||||
|
|
||||||
#include "domain_audit.h"
|
#include "domain_audit.h"
|
||||||
#include "virlog.h"
|
#include "virlog.h"
|
||||||
@ -1923,8 +1924,10 @@ cleanup:
|
|||||||
return vm;
|
return vm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The caller is supposed to lock the vm and start a migration job. */
|
/* The caller is supposed to lock the vm and start a migration job. */
|
||||||
char *qemuMigrationBegin(virQEMUDriverPtr driver,
|
static char
|
||||||
|
*qemuMigrationBeginPhase(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
const char *xmlin,
|
const char *xmlin,
|
||||||
const char *dname,
|
const char *dname,
|
||||||
@ -2024,6 +2027,83 @@ cleanup:
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
qemuMigrationBegin(virConnectPtr conn,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
const char *xmlin,
|
||||||
|
const char *dname,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned long flags)
|
||||||
|
{
|
||||||
|
virQEMUDriverPtr driver = conn->privateData;
|
||||||
|
char *xml = NULL;
|
||||||
|
enum qemuDomainAsyncJob asyncJob;
|
||||||
|
|
||||||
|
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
||||||
|
if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
asyncJob = QEMU_ASYNC_JOB_MIGRATION_OUT;
|
||||||
|
} else {
|
||||||
|
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
asyncJob = QEMU_ASYNC_JOB_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!virDomainObjIsActive(vm) && !(flags & VIR_MIGRATE_OFFLINE)) {
|
||||||
|
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||||
|
"%s", _("domain is not running"));
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if there is any ejected media.
|
||||||
|
* We don't want to require them on the destination.
|
||||||
|
*/
|
||||||
|
if (!(flags & VIR_MIGRATE_OFFLINE) &&
|
||||||
|
qemuDomainCheckEjectableMedia(driver, vm, asyncJob) < 0)
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if (!(xml = qemuMigrationBeginPhase(driver, vm, xmlin, dname,
|
||||||
|
cookieout, cookieoutlen,
|
||||||
|
flags)))
|
||||||
|
goto endjob;
|
||||||
|
|
||||||
|
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
||||||
|
/* We keep the job active across API calls until the confirm() call.
|
||||||
|
* This prevents any other APIs being invoked while migration is taking
|
||||||
|
* place.
|
||||||
|
*/
|
||||||
|
if (virQEMUCloseCallbacksSet(driver->closeCallbacks, vm, conn,
|
||||||
|
qemuMigrationCleanup) < 0)
|
||||||
|
goto endjob;
|
||||||
|
if (qemuMigrationJobContinue(vm) == 0) {
|
||||||
|
vm = NULL;
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
"%s", _("domain disappeared"));
|
||||||
|
VIR_FREE(xml);
|
||||||
|
if (cookieout)
|
||||||
|
VIR_FREE(*cookieout);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (vm)
|
||||||
|
virObjectUnlock(vm);
|
||||||
|
return xml;
|
||||||
|
|
||||||
|
endjob:
|
||||||
|
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
|
||||||
|
if (qemuMigrationJobFinish(driver, vm) == 0)
|
||||||
|
vm = NULL;
|
||||||
|
} else {
|
||||||
|
if (qemuDomainObjEndJob(driver, vm) == 0)
|
||||||
|
vm = NULL;
|
||||||
|
}
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Prepare is the first step, and it runs on the destination host.
|
/* Prepare is the first step, and it runs on the destination host.
|
||||||
*/
|
*/
|
||||||
@ -3341,8 +3421,8 @@ static int doPeer2PeerMigrate3(virQEMUDriverPtr driver,
|
|||||||
* bit here, because we are already running inside the context of
|
* bit here, because we are already running inside the context of
|
||||||
* a single job. */
|
* a single job. */
|
||||||
|
|
||||||
dom_xml = qemuMigrationBegin(driver, vm, xmlin, dname,
|
dom_xml = qemuMigrationBeginPhase(driver, vm, xmlin, dname,
|
||||||
&cookieout, &cookieoutlen, flags);
|
&cookieout, &cookieoutlen, flags);
|
||||||
if (!dom_xml)
|
if (!dom_xml)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ virDomainObjPtr qemuMigrationCleanup(virQEMUDriverPtr driver,
|
|||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
virConnectPtr conn);
|
virConnectPtr conn);
|
||||||
|
|
||||||
char *qemuMigrationBegin(virQEMUDriverPtr driver,
|
char *qemuMigrationBegin(virConnectPtr conn,
|
||||||
virDomainObjPtr vm,
|
virDomainObjPtr vm,
|
||||||
const char *xmlin,
|
const char *xmlin,
|
||||||
const char *dname,
|
const char *dname,
|
||||||
|
Loading…
Reference in New Issue
Block a user