On Thu, Mar 17, 2016 at 19:31:45 +0300, Dmitry Andreev wrote:
Migration API allows to specify a destination domain configuration.
Offline domain has only inactive XML and it is replaced by configuration
specified using VIR_MIGRATE_PARAM_DEST_XML param. In case of live
migration VIR_MIGRATE_PARAM_DEST_XML param is applied for active XML.
This commit introduces the new VIR_MIGRATE_PARAM_PERSIST_XML param
that can be used within live migration to replace persistent/inactive
configuration.
Required for:
https://bugzilla.redhat.com/show_bug.cgi?id=835300
---
include/libvirt/libvirt-domain.h | 15 +++++++++++++
src/qemu/qemu_driver.c | 12 ++++++----
src/qemu/qemu_migration.c | 47 ++++++++++++++++++++++++++--------------
src/qemu/qemu_migration.h | 2 ++
4 files changed, 56 insertions(+), 20 deletions(-)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 4ac29cd..f9dae22 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -723,6 +723,21 @@ typedef enum {
# define VIR_MIGRATE_PARAM_DEST_XML "destination_xml"
/**
+ * VIR_MIGRATE_PARAM_PERSIST_XML:
+ *
+ * virDomainMigrate* params field: the new persistant configuration to be used
s/persistant/persistent/
+ * for the domain on the destination host as
VIR_TYPED_PARAM_STRING.
+ * This field cannot be used to rename the domain during migration (use
+ * VIR_MIGRATE_PARAM_DEST_NAME field for that purpose). Domain name in the
+ * destination XML must match the original domain name.
+ *
+ * Omitting this parameter keeps the original domain persistent configuration.
+ * Using this field with hypervisors that do not support changing domain
+ * configuration during migration will result in a failure.
+ */
+# define VIR_MIGRATE_PARAM_PERSIST_XML "persistent_xml"
+
+/**
* VIR_MIGRATE_PARAM_BANDWIDTH:
*
* virDomainMigrate* params field: the maximum bandwidth (in MiB/s) that will
...
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f723a52..5624633 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
...
@@ -4566,14 +4568,20 @@ qemuMigrationRun(virQEMUDriverPtr driver,
cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
QEMU_MIGRATION_COOKIE_STATS;
+ if (flags & VIR_MIGRATE_PERSIST_DEST && persist_xml &&
+ !(def = qemuMigrationPrepareDef(driver, persist_xml, NULL, NULL)))
+ ret = -1;
+
I think this should be done before we start migration.
if (ret == 0 &&
(((flags & VIR_MIGRATE_PERSIST_DEST &&
- qemuMigrationCookieAddPersistent(mig, vm->newDef) < 0)) ||
+ qemuMigrationCookieAddPersistent(mig,
+ def ? def : vm->newDef) < 0)) ||
And we can use a single variable for both vm->newDef and def depending
on persist_xml.
qemuMigrationBakeCookie(mig, driver, vm, cookieout,
cookieoutlen, cookieFlags) < 0)) {
VIR_WARN("Unable to encode migration cookie");
}
+ virDomainDefFree(def);
qemuMigrationCookieFree(mig);
if (events)
...
@@ -4683,6 +4692,7 @@ static int doNativeMigrate(virQEMUDriverPtr
driver,
static int doTunnelMigrate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virStreamPtr st,
+ const char *xml_persist,
s/xml_persist/persist_xml/ to keep the name consistent accros the file.
const char *cookiein,
int cookieinlen,
char **cookieout,
...
To avoid sending another version of this patch for review, which already
took too long (this is my fault, sorry for that), I suggest squashing
the following patch in and pushing the result.
Jirka
diff --git i/include/libvirt/libvirt-domain.h w/include/libvirt/libvirt-domain.h
index 697670f..9936cb2 100644
--- i/include/libvirt/libvirt-domain.h
+++ w/include/libvirt/libvirt-domain.h
@@ -729,7 +729,7 @@ typedef enum {
/**
* VIR_MIGRATE_PARAM_PERSIST_XML:
*
- * virDomainMigrate* params field: the new persistant configuration to be used
+ * virDomainMigrate* params field: the new persistent configuration to be used
* for the domain on the destination host as VIR_TYPED_PARAM_STRING.
* This field cannot be used to rename the domain during migration (use
* VIR_MIGRATE_PARAM_DEST_NAME field for that purpose). Domain name in the
diff --git i/src/qemu/qemu_migration.c w/src/qemu/qemu_migration.c
index eee8ec2..680c9ba 100644
--- i/src/qemu/qemu_migration.c
+++ w/src/qemu/qemu_migration.c
@@ -4504,7 +4504,6 @@ qemuMigrationRun(virQEMUDriverPtr driver,
{
int ret = -1;
unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND;
- virDomainDefPtr def = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuMigrationCookiePtr mig = NULL;
qemuMigrationIOThreadPtr iothread = NULL;
@@ -4516,6 +4515,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
bool events = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_MIGRATION_EVENT);
bool inPostCopy = false;
unsigned int waitFlags;
+ virDomainDefPtr persistDef = NULL;
int rc;
VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
@@ -4549,6 +4549,17 @@ qemuMigrationRun(virQEMUDriverPtr driver,
if (events)
priv->signalIOError = abort_on_error;
+ if (flags & VIR_MIGRATE_PERSIST_DEST) {
+ if (persist_xml) {
+ persistDef = qemuMigrationPrepareDef(driver, persist_xml,
+ NULL, NULL);
+ if (!persistDef)
+ goto cleanup;
+ } else {
+ persistDef = vm->newDef;
+ }
+ }
+
mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
cookieFlags | QEMU_MIGRATION_COOKIE_GRAPHICS);
if (!mig)
@@ -4769,20 +4780,15 @@ qemuMigrationRun(virQEMUDriverPtr driver,
cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
QEMU_MIGRATION_COOKIE_STATS;
- if (flags & VIR_MIGRATE_PERSIST_DEST && persist_xml &&
- !(def = qemuMigrationPrepareDef(driver, persist_xml, NULL, NULL)))
- ret = -1;
-
if (ret == 0 &&
- (((flags & VIR_MIGRATE_PERSIST_DEST &&
- qemuMigrationCookieAddPersistent(mig,
- def ? def : vm->newDef) < 0)) ||
- qemuMigrationBakeCookie(mig, driver, vm, cookieout,
- cookieoutlen, cookieFlags) < 0)) {
+ (qemuMigrationCookieAddPersistent(mig, persistDef) < 0 ||
+ qemuMigrationBakeCookie(mig, driver, vm, cookieout,
+ cookieoutlen, cookieFlags) < 0)) {
VIR_WARN("Unable to encode migration cookie");
}
- virDomainDefFree(def);
+ if (persistDef != vm->newDef)
+ virDomainDefFree(persistDef);
qemuMigrationCookieFree(mig);
if (events)
@@ -4902,7 +4908,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver,
static int doTunnelMigrate(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virStreamPtr st,
- const char *xml_persist,
+ const char *persist_xml,
const char *cookiein,
int cookieinlen,
char **cookieout,
@@ -4948,9 +4954,9 @@ static int doTunnelMigrate(virQEMUDriverPtr driver,
goto cleanup;
}
- ret = qemuMigrationRun(driver, vm, xml_persist, cookiein, cookieinlen, cookieout,
- cookieoutlen, flags, resource, &spec, dconn,
- graphicsuri, nmigrate_disks, migrate_disks,
+ ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen,
+ cookieout, cookieoutlen, flags, resource, &spec,
+ dconn, graphicsuri, nmigrate_disks, migrate_disks,
compression);
cleanup: