The virDomainMigratePerform3 currently has a single URI parameter
whose meaning varies. It is either
- A QEMU migration URI (normal migration)
- A libvirtd connection URI (peer2peer migration)
Unfortunately when using peer2peer migration, without also
using tunnelled migration, it is possible that both URIs are
required.
This adds a second URI parameter to the virDomainMigratePerform3
method, to cope with this scenario. Each parameter how has a fixed
meaning.
NB, there is no way to actually take advantage of this yet,
since virDomainMigrate/virDomainMigrateToURI do not have any
way to provide the 2 separate URIs
* daemon/remote.c, src/remote/remote_driver.c,
src/remote/remote_protocol.x, src/remote_protocol-structs: Add
the second URI parameter to perform3 message
* src/driver.h, src/libvirt.c, src/libvirt_internal.h: Add
the second URI parameter to Perform3 method
* src/libvirt_internal.h, src/qemu/qemu_migration.c,
src/qemu/qemu_migration.h: Update to handle URIs correctly
---
daemon/remote.c | 4 +++-
src/driver.h | 1 +
src/libvirt.c | 26 +++++++++++++++++++-------
src/libvirt_internal.h | 3 ++-
src/qemu/qemu_driver.c | 5 +++--
src/qemu/qemu_migration.c | 15 +++++++++++----
src/qemu/qemu_migration.h | 1 +
src/remote/remote_driver.c | 2 ++
src/remote/remote_protocol.x | 1 +
src/remote_protocol-structs | 1 +
10 files changed, 44 insertions(+), 15 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c
index 03f1a5e..270ca30 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -3329,6 +3329,7 @@ remoteDispatchDomainMigratePerform3(struct qemud_server *server
ATTRIBUTE_UNUSED
virDomainPtr dom = NULL;
char *xmlin;
char *dname;
+ char *dconnuri;
char *cookieout = NULL;
int cookieoutlen = 0;
int rv = -1;
@@ -3343,12 +3344,13 @@ remoteDispatchDomainMigratePerform3(struct qemud_server *server
ATTRIBUTE_UNUSED
xmlin = args->xmlin == NULL ? NULL : *args->xmlin;
dname = args->dname == NULL ? NULL : *args->dname;
+ dconnuri = args->dconnuri == NULL ? NULL : *args->dconnuri;
if (virDomainMigratePerform3(dom, xmlin,
args->cookie_in.cookie_in_val,
args->cookie_in.cookie_in_len,
&cookieout, &cookieoutlen,
- args->uri,
+ dconnuri, args->uri,
args->flags, dname, args->resource) < 0)
goto cleanup;
diff --git a/src/driver.h b/src/driver.h
index a1468e8..035e42d 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -581,6 +581,7 @@ typedef int
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
diff --git a/src/libvirt.c b/src/libvirt.c
index 7b7323e..c85f7bf 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -3792,9 +3792,10 @@ virDomainMigrateVersion3(virDomainPtr domain,
cookieinlen = cookieoutlen;
cookieout = NULL;
cookieoutlen = 0;
+ /* dconnuri not relevant in non-P2P modes, so left NULL here */
ret = domain->conn->driver->domainMigratePerform3
(domain, NULL, cookiein, cookieinlen,
- &cookieout, &cookieoutlen,
+ &cookieout, &cookieoutlen, NULL,
uri, flags, dname, bandwidth);
/* Perform failed. Make sure Finish doesn't overwrite the error */
@@ -3877,6 +3878,7 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
const char *xmlin,
unsigned long flags,
const char *dname,
+ const char *dconnuri,
const char *uri,
unsigned long bandwidth)
{
@@ -3915,6 +3917,7 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
0, /* cookieinlen */
NULL, /* cookieoutlen */
NULL, /* cookieoutlen */
+ dconnuri,
uri,
flags,
dname,
@@ -3926,10 +3929,15 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
_("Unable to change target guest XML during
migration"));
return -1;
}
+ if (uri) {
+ virLibConnError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to override peer2peer migration URI"));
+ return -1;
+ }
return domain->conn->driver->domainMigratePerform(domain,
NULL, /* cookie */
0, /* cookielen */
- uri,
+ dconnuri,
flags,
dname,
bandwidth);
@@ -3968,12 +3976,15 @@ virDomainMigrateDirect (virDomainPtr domain,
if (VIR_DRV_SUPPORTS_FEATURE(domain->conn->driver, domain->conn,
VIR_DRV_FEATURE_MIGRATION_V3)) {
VIR_DEBUG("Using migration protocol 3");
+ /* dconn URI not relevant in direct migration, since no
+ * target libvirtd is involved */
return domain->conn->driver->domainMigratePerform3(domain,
xmlin,
NULL, /* cookiein */
0, /* cookieinlen */
NULL, /* cookieoutlen */
NULL, /* cookieoutlen */
+ NULL, /* dconnuri */
uri,
flags,
dname,
@@ -4110,7 +4121,7 @@ virDomainMigrate (virDomainPtr domain,
VIR_DEBUG("Using peer2peer migration");
if (virDomainMigratePeer2Peer(domain, NULL, flags, dname,
- uri ? uri : dstURI, bandwidth) < 0) {
+ uri ? uri : dstURI, NULL, bandwidth) < 0) {
VIR_FREE(dstURI);
goto error;
}
@@ -4256,7 +4267,7 @@ virDomainMigrateToURI (virDomainPtr domain,
VIR_DRV_FEATURE_MIGRATION_P2P)) {
VIR_DEBUG("Using peer2peer migration");
if (virDomainMigratePeer2Peer(domain, NULL, flags,
- dname, duri, bandwidth) < 0)
+ dname, duri, NULL, bandwidth) < 0)
goto error;
} else {
/* No peer to peer migration supported */
@@ -4758,6 +4769,7 @@ virDomainMigratePerform3(virDomainPtr domain,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
@@ -4766,10 +4778,10 @@ virDomainMigratePerform3(virDomainPtr domain,
virConnectPtr conn;
VIR_DOMAIN_DEBUG(domain, "xmlin=%s cookiein=%p, cookieinlen=%d, "
- "cookieout=%p, cookieoutlen=%p, "
+ "cookieout=%p, cookieoutlen=%p, dconnuri=%s, "
"uri=%s, flags=%lu, dname=%s, bandwidth=%lu",
NULLSTR(xmlin), cookiein, cookieinlen,
- cookieout, cookieoutlen,
+ cookieout, cookieoutlen, NULLSTR(dconnuri),
uri, flags, NULLSTR(dname), bandwidth);
virResetLastError();
@@ -4791,7 +4803,7 @@ virDomainMigratePerform3(virDomainPtr domain,
ret = conn->driver->domainMigratePerform3(domain, xmlin,
cookiein, cookieinlen,
cookieout, cookieoutlen,
- uri,
+ dconnuri, uri,
flags, dname, bandwidth);
if (ret < 0)
goto error;
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index c7c1932..68c140b 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -161,7 +161,8 @@ int virDomainMigratePerform3(virDomainPtr dom,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
- const char *uri,
+ const char *dconnuri, /* libvirtd URI if Peer2Peer, NULL
otherwise */
+ const char *uri, /* VM Migration URI */
unsigned long flags,
const char *dname,
unsigned long resource);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2f454f7..f836d79 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -5961,7 +5961,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
* Consume any cookie we were able to decode though
*/
ret = qemuMigrationPerform(driver, dom->conn, vm,
- NULL, uri, cookie, cookielen,
+ NULL, NULL, uri, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */
flags, dname, resource, true);
@@ -6182,6 +6182,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
@@ -6211,7 +6212,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
}
ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
- uri, cookiein, cookieinlen,
+ dconnuri, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, dname, resource, false);
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 077a1b1..7817f37 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1778,7 +1778,7 @@ static int doPeer2PeerMigrate3(struct qemud_driver *driver,
qemuDomainObjEnterRemoteWithDriver(driver, vm);
ret = dconn->driver->domainMigratePrepare3
(dconn, cookiein, cookieinlen, &cookieout, &cookieoutlen,
- NULL, &uri_out, flags, dname, resource, dom_xml);
+ uri, &uri_out, flags, dname, resource, dom_xml);
qemuDomainObjExitRemoteWithDriver(driver, vm);
}
VIR_FREE(dom_xml);
@@ -1798,7 +1798,7 @@ static int doPeer2PeerMigrate3(struct qemud_driver *driver,
* running, but in paused state until the destination can
* confirm migration completion.
*/
- VIR_DEBUG("Perform3 %p uri=%s", sconn, uri_out);
+ VIR_DEBUG("Perform3 %p uri=%s uri_out=%s", sconn, uri, uri_out);
VIR_FREE(cookiein);
cookiein = cookieout;
cookieinlen = cookieoutlen;
@@ -1898,6 +1898,7 @@ static int doPeer2PeerMigrate(struct qemud_driver *driver,
virConnectPtr sconn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
@@ -1913,7 +1914,7 @@ static int doPeer2PeerMigrate(struct qemud_driver *driver,
*/
qemuDomainObjEnterRemoteWithDriver(driver, vm);
- dconn = virConnectOpen(uri);
+ dconn = virConnectOpen(dconnuri);
qemuDomainObjExitRemoteWithDriver(driver, vm);
if (dconn == NULL) {
qemuReportError(VIR_ERR_OPERATION_FAILED,
@@ -1962,6 +1963,7 @@ int qemuMigrationPerform(struct qemud_driver *driver,
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
const char *cookiein,
int cookieinlen,
@@ -2005,10 +2007,15 @@ int qemuMigrationPerform(struct qemud_driver *driver,
}
if (doPeer2PeerMigrate(driver, conn, vm, xmlin,
- uri, flags, dname, resource) < 0)
+ dconnuri, uri, flags, dname, resource) < 0)
/* doPeer2PeerMigrate already set the error, so just get out */
goto endjob;
} else {
+ if (dconnuri) {
+ qemuReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Unexpected dconnuri parameter with
non-peer2peer migration"));
+ goto endjob;
+ }
if (doNativeMigrate(driver, vm, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, dname, resource) < 0)
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index a24b3a8..a350579 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -63,6 +63,7 @@ int qemuMigrationPerform(struct qemud_driver *driver,
virConnectPtr conn,
virDomainObjPtr vm,
const char *xmlin,
+ const char *dconnuri,
const char *uri,
const char *cookiein,
int cookieinlen,
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 77bd474..668edfe 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -5174,6 +5174,7 @@ remoteDomainMigratePerform3(virDomainPtr dom,
int cookieinlen,
char **cookieout,
int *cookieoutlen,
+ const char *dconnuri,
const char *uri,
unsigned long flags,
const char *dname,
@@ -5197,6 +5198,7 @@ remoteDomainMigratePerform3(virDomainPtr dom,
args.uri = (char *) uri;
args.flags = flags;
args.dname = dname == NULL ? NULL : (char **) &dname;
+ args.dconnuri = dconnuri == NULL ? NULL : (char **) &dconnuri;
args.resource = resource;
if (call (dom->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3,
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 37b5a3f..214a052 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -2014,6 +2014,7 @@ struct remote_domain_migrate_perform3_args {
remote_nonnull_domain dom;
remote_string xmlin;
opaque cookie_in<REMOTE_MIGRATE_COOKIE_MAX>;
+ remote_string dconnuri;
remote_nonnull_string uri;
unsigned hyper flags;
remote_string dname;
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 616a44b..7285006 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -1510,6 +1510,7 @@ struct remote_domain_migrate_perform3_args {
u_int cookie_in_len;
char * cookie_in_val;
} cookie_in;
+ remote_string dconnuri;
remote_nonnull_string uri;
uint64_t flags;
remote_string dname;
--
1.7.4.4