mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: migration: Extract code responsible for calling drive-mirror
Separate the code relevant for this approach so that we can later add a second implementation without making the function messy. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
8bad8e7bf0
commit
89ed82646c
@ -748,6 +748,48 @@ qemuMigrationSrcNBDCopyCancel(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
qemuMigrationSrcNBDStorageCopyDriveMirror(virQEMUDriverPtr driver,
|
||||||
|
virDomainObjPtr vm,
|
||||||
|
const char *diskAlias,
|
||||||
|
const char *host,
|
||||||
|
int port,
|
||||||
|
unsigned long long mirror_speed,
|
||||||
|
unsigned int mirror_flags)
|
||||||
|
{
|
||||||
|
char *nbd_dest = NULL;
|
||||||
|
int mon_ret;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
if (strchr(host, ':')) {
|
||||||
|
if (virAsprintf(&nbd_dest, "nbd:[%s]:%d:exportname=%s",
|
||||||
|
host, port, diskAlias) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
if (virAsprintf(&nbd_dest, "nbd:%s:%d:exportname=%s",
|
||||||
|
host, port, diskAlias) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
||||||
|
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
mon_ret = qemuMonitorDriveMirror(qemuDomainGetMonitor(vm),
|
||||||
|
diskAlias, nbd_dest, "raw",
|
||||||
|
mirror_speed, 0, 0, mirror_flags);
|
||||||
|
|
||||||
|
if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(nbd_dest);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qemuMigrationSrcNBDStorageCopy:
|
* qemuMigrationSrcNBDStorageCopy:
|
||||||
* @driver: qemu driver
|
* @driver: qemu driver
|
||||||
@ -783,8 +825,6 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriverPtr driver,
|
|||||||
int port;
|
int port;
|
||||||
size_t i;
|
size_t i;
|
||||||
char *diskAlias = NULL;
|
char *diskAlias = NULL;
|
||||||
char *nbd_dest = NULL;
|
|
||||||
char *hoststr = NULL;
|
|
||||||
unsigned long long mirror_speed = speed;
|
unsigned long long mirror_speed = speed;
|
||||||
unsigned int mirror_flags = VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT;
|
unsigned int mirror_flags = VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT;
|
||||||
int rv;
|
int rv;
|
||||||
@ -804,47 +844,31 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriverPtr driver,
|
|||||||
port = mig->nbd->port;
|
port = mig->nbd->port;
|
||||||
mig->nbd->port = 0;
|
mig->nbd->port = 0;
|
||||||
|
|
||||||
/* escape literal IPv6 address */
|
|
||||||
if (strchr(host, ':')) {
|
|
||||||
if (virAsprintf(&hoststr, "[%s]", host) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
} else if (VIR_STRDUP(hoststr, host) < 0) {
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*migrate_flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC)
|
if (*migrate_flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC)
|
||||||
mirror_flags |= VIR_DOMAIN_BLOCK_REBASE_SHALLOW;
|
mirror_flags |= VIR_DOMAIN_BLOCK_REBASE_SHALLOW;
|
||||||
|
|
||||||
for (i = 0; i < vm->def->ndisks; i++) {
|
for (i = 0; i < vm->def->ndisks; i++) {
|
||||||
virDomainDiskDefPtr disk = vm->def->disks[i];
|
virDomainDiskDefPtr disk = vm->def->disks[i];
|
||||||
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
|
||||||
int mon_ret;
|
|
||||||
|
|
||||||
/* check whether disk should be migrated */
|
/* check whether disk should be migrated */
|
||||||
if (!qemuMigrationAnyCopyDisk(disk, nmigrate_disks, migrate_disks))
|
if (!qemuMigrationAnyCopyDisk(disk, nmigrate_disks, migrate_disks))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(diskAlias = qemuAliasFromDisk(disk)) ||
|
if (!(diskAlias = qemuAliasFromDisk(disk)))
|
||||||
(virAsprintf(&nbd_dest, "nbd:%s:%d:exportname=%s",
|
|
||||||
hoststr, port, diskAlias) < 0))
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
qemuBlockJobSyncBegin(disk);
|
qemuBlockJobSyncBegin(disk);
|
||||||
|
|
||||||
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
if (qemuMigrationSrcNBDStorageCopyDriveMirror(driver, vm, diskAlias,
|
||||||
QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
|
host, port,
|
||||||
goto cleanup;
|
mirror_speed,
|
||||||
|
mirror_flags) < 0) {
|
||||||
/* Force "raw" format for NBD export */
|
|
||||||
mon_ret = qemuMonitorDriveMirror(priv->mon, diskAlias, nbd_dest,
|
|
||||||
"raw", mirror_speed, 0, 0, mirror_flags);
|
|
||||||
VIR_FREE(diskAlias);
|
|
||||||
VIR_FREE(nbd_dest);
|
|
||||||
|
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0) {
|
|
||||||
qemuBlockJobSyncEnd(vm, QEMU_ASYNC_JOB_MIGRATION_OUT, disk);
|
qemuBlockJobSyncEnd(vm, QEMU_ASYNC_JOB_MIGRATION_OUT, disk);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VIR_FREE(diskAlias);
|
||||||
diskPriv->migrating = true;
|
diskPriv->migrating = true;
|
||||||
|
|
||||||
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) {
|
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) {
|
||||||
@ -886,8 +910,6 @@ qemuMigrationSrcNBDStorageCopy(virQEMUDriverPtr driver,
|
|||||||
cleanup:
|
cleanup:
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
VIR_FREE(diskAlias);
|
VIR_FREE(diskAlias);
|
||||||
VIR_FREE(nbd_dest);
|
|
||||||
VIR_FREE(hoststr);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user