qemu: Make domain renaming work during migration

https://bugzilla.redhat.com/show_bug.cgi?id=999352

Since commit v1.0.5-56-g449e6b1 (Pull parsing of migration xml up into
QEMU driver APIs) any attempt to rename a domain during migration fails
with the following error message:

    internal error Incoming cookie data had unexpected name DOM vs DOM2

This is because migration cookies always use the original domain name
and the mentioned commit failed to propagate the name back to
qemuMigrationPrepareAny.
This commit is contained in:
Jiri Denemark 2013-09-03 15:17:03 +02:00
parent 2dba0323ff
commit 8d67c550e9
3 changed files with 47 additions and 25 deletions

View File

@ -9973,6 +9973,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
{ {
virQEMUDriverPtr driver = dconn->privateData; virQEMUDriverPtr driver = dconn->privateData;
virDomainDefPtr def = NULL; virDomainDefPtr def = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -9990,7 +9991,7 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepareTunnelEnsureACL(dconn, def) < 0) if (virDomainMigratePrepareTunnelEnsureACL(dconn, def) < 0)
@ -9998,9 +9999,10 @@ qemuDomainMigratePrepareTunnel(virConnectPtr dconn,
ret = qemuMigrationPrepareTunnel(driver, dconn, ret = qemuMigrationPrepareTunnel(driver, dconn,
NULL, 0, NULL, NULL, /* No cookies in v2 */ NULL, 0, NULL, NULL, /* No cookies in v2 */
st, &def, flags); st, &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }
@ -10022,6 +10024,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
{ {
virQEMUDriverPtr driver = dconn->privateData; virQEMUDriverPtr driver = dconn->privateData;
virDomainDefPtr def = NULL; virDomainDefPtr def = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -10043,7 +10046,7 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepare2EnsureACL(dconn, def) < 0) if (virDomainMigratePrepare2EnsureACL(dconn, def) < 0)
@ -10056,9 +10059,10 @@ qemuDomainMigratePrepare2(virConnectPtr dconn,
ret = qemuMigrationPrepareDirect(driver, dconn, ret = qemuMigrationPrepareDirect(driver, dconn,
NULL, 0, NULL, NULL, /* No cookies */ NULL, 0, NULL, NULL, /* No cookies */
uri_in, uri_out, uri_in, uri_out,
&def, flags); &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }
@ -10235,6 +10239,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
{ {
virQEMUDriverPtr driver = dconn->privateData; virQEMUDriverPtr driver = dconn->privateData;
virDomainDefPtr def = NULL; virDomainDefPtr def = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -10249,7 +10254,7 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepare3EnsureACL(dconn, def) < 0) if (virDomainMigratePrepare3EnsureACL(dconn, def) < 0)
@ -10259,9 +10264,10 @@ qemuDomainMigratePrepare3(virConnectPtr dconn,
cookiein, cookieinlen, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
uri_in, uri_out, uri_in, uri_out,
&def, flags); &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }
@ -10282,6 +10288,7 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
const char *dom_xml = NULL; const char *dom_xml = NULL;
const char *dname = NULL; const char *dname = NULL;
const char *uri_in = NULL; const char *uri_in = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -10309,7 +10316,7 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0) if (virDomainMigratePrepare3ParamsEnsureACL(dconn, def) < 0)
@ -10319,9 +10326,10 @@ qemuDomainMigratePrepare3Params(virConnectPtr dconn,
cookiein, cookieinlen, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
uri_in, uri_out, uri_in, uri_out,
&def, flags); &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }
@ -10341,6 +10349,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
{ {
virQEMUDriverPtr driver = dconn->privateData; virQEMUDriverPtr driver = dconn->privateData;
virDomainDefPtr def = NULL; virDomainDefPtr def = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -10351,7 +10360,7 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepareTunnel3EnsureACL(dconn, def) < 0) if (virDomainMigratePrepareTunnel3EnsureACL(dconn, def) < 0)
@ -10360,9 +10369,10 @@ qemuDomainMigratePrepareTunnel3(virConnectPtr dconn,
ret = qemuMigrationPrepareTunnel(driver, dconn, ret = qemuMigrationPrepareTunnel(driver, dconn,
cookiein, cookieinlen, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
st, &def, flags); st, &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }
@ -10382,6 +10392,7 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
virDomainDefPtr def = NULL; virDomainDefPtr def = NULL;
const char *dom_xml = NULL; const char *dom_xml = NULL;
const char *dname = NULL; const char *dname = NULL;
char *origname = NULL;
int ret = -1; int ret = -1;
virCheckFlags(QEMU_MIGRATION_FLAGS, -1); virCheckFlags(QEMU_MIGRATION_FLAGS, -1);
@ -10402,7 +10413,7 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
goto cleanup; goto cleanup;
} }
if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname))) if (!(def = qemuMigrationPrepareDef(driver, dom_xml, dname, &origname)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepareTunnel3ParamsEnsureACL(dconn, def) < 0) if (virDomainMigratePrepareTunnel3ParamsEnsureACL(dconn, def) < 0)
@ -10411,9 +10422,10 @@ qemuDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
ret = qemuMigrationPrepareTunnel(driver, dconn, ret = qemuMigrationPrepareTunnel(driver, dconn,
cookiein, cookieinlen, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
st, &def, flags); st, &def, origname, flags);
cleanup: cleanup:
VIR_FREE(origname);
virDomainDefFree(def); virDomainDefFree(def);
return ret; return ret;
} }

View File

@ -2160,6 +2160,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
char **cookieout, char **cookieout,
int *cookieoutlen, int *cookieoutlen,
virDomainDefPtr *def, virDomainDefPtr *def,
const char *origname,
virStreamPtr st, virStreamPtr st,
unsigned int port, unsigned int port,
unsigned long flags) unsigned long flags)
@ -2172,7 +2173,6 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
unsigned long long now; unsigned long long now;
qemuMigrationCookiePtr mig = NULL; qemuMigrationCookiePtr mig = NULL;
bool tunnel = !!st; bool tunnel = !!st;
char *origname = NULL;
char *xmlout = NULL; char *xmlout = NULL;
unsigned int cookieFlags; unsigned int cookieFlags;
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
@ -2297,8 +2297,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
*def = NULL; *def = NULL;
priv = vm->privateData; priv = vm->privateData;
priv->origname = origname; if (VIR_STRDUP(priv->origname, origname) < 0)
origname = NULL; goto cleanup;
if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen, if (!(mig = qemuMigrationEatCookie(driver, vm, cookiein, cookieinlen,
QEMU_MIGRATION_COOKIE_LOCKSTATE | QEMU_MIGRATION_COOKIE_LOCKSTATE |
@ -2412,7 +2412,6 @@ done:
cleanup: cleanup:
VIR_FREE(migrateFrom); VIR_FREE(migrateFrom);
VIR_FREE(origname);
VIR_FREE(xmlout); VIR_FREE(xmlout);
VIR_FORCE_CLOSE(dataFD[0]); VIR_FORCE_CLOSE(dataFD[0]);
VIR_FORCE_CLOSE(dataFD[1]); VIR_FORCE_CLOSE(dataFD[1]);
@ -2457,15 +2456,16 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
int *cookieoutlen, int *cookieoutlen,
virStreamPtr st, virStreamPtr st,
virDomainDefPtr *def, virDomainDefPtr *def,
const char *origname,
unsigned long flags) unsigned long flags)
{ {
int ret; int ret;
VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, " VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
"cookieout=%p, cookieoutlen=%p, st=%p, def=%p, " "cookieout=%p, cookieoutlen=%p, st=%p, def=%p, "
"flags=%lx", "origname=%s, flags=%lx",
driver, dconn, NULLSTR(cookiein), cookieinlen, driver, dconn, NULLSTR(cookiein), cookieinlen,
cookieout, cookieoutlen, st, *def, flags); cookieout, cookieoutlen, st, *def, origname, flags);
if (st == NULL) { if (st == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@ -2474,7 +2474,7 @@ qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
} }
ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen, ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
cookieout, cookieoutlen, def, cookieout, cookieoutlen, def, origname,
st, 0, flags); st, 0, flags);
return ret; return ret;
} }
@ -2490,6 +2490,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
const char *uri_in, const char *uri_in,
char **uri_out, char **uri_out,
virDomainDefPtr *def, virDomainDefPtr *def,
const char *origname,
unsigned long flags) unsigned long flags)
{ {
static int port = 0; static int port = 0;
@ -2502,10 +2503,10 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, " VIR_DEBUG("driver=%p, dconn=%p, cookiein=%s, cookieinlen=%d, "
"cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, " "cookieout=%p, cookieoutlen=%p, uri_in=%s, uri_out=%p, "
"def=%p, flags=%lx", "def=%p, origname=%s, flags=%lx",
driver, dconn, NULLSTR(cookiein), cookieinlen, driver, dconn, NULLSTR(cookiein), cookieinlen,
cookieout, cookieoutlen, NULLSTR(uri_in), uri_out, cookieout, cookieoutlen, NULLSTR(uri_in), uri_out,
*def, flags); *def, origname, flags);
*uri_out = NULL; *uri_out = NULL;
@ -2594,7 +2595,7 @@ qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
VIR_DEBUG("Generated uri_out=%s", *uri_out); VIR_DEBUG("Generated uri_out=%s", *uri_out);
ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen, ret = qemuMigrationPrepareAny(driver, dconn, cookiein, cookieinlen,
cookieout, cookieoutlen, def, cookieout, cookieoutlen, def, origname,
NULL, this_port, flags); NULL, this_port, flags);
cleanup: cleanup:
virURIFree(uri); virURIFree(uri);
@ -2608,10 +2609,12 @@ cleanup:
virDomainDefPtr virDomainDefPtr
qemuMigrationPrepareDef(virQEMUDriverPtr driver, qemuMigrationPrepareDef(virQEMUDriverPtr driver,
const char *dom_xml, const char *dom_xml,
const char *dname) const char *dname,
char **origname)
{ {
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
virDomainDefPtr def; virDomainDefPtr def;
char *name = NULL;
if (!dom_xml) { if (!dom_xml) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s", virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
@ -2628,7 +2631,7 @@ qemuMigrationPrepareDef(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
if (dname) { if (dname) {
VIR_FREE(def->name); name = def->name;
if (VIR_STRDUP(def->name, dname) < 0) { if (VIR_STRDUP(def->name, dname) < 0) {
virDomainDefFree(def); virDomainDefFree(def);
def = NULL; def = NULL;
@ -2637,6 +2640,10 @@ qemuMigrationPrepareDef(virQEMUDriverPtr driver,
cleanup: cleanup:
virObjectUnref(caps); virObjectUnref(caps);
if (def && origname)
*origname = name;
else
VIR_FREE(name);
return def; return def;
} }

View File

@ -100,7 +100,8 @@ char *qemuMigrationBegin(virConnectPtr conn,
virDomainDefPtr qemuMigrationPrepareDef(virQEMUDriverPtr driver, virDomainDefPtr qemuMigrationPrepareDef(virQEMUDriverPtr driver,
const char *dom_xml, const char *dom_xml,
const char *dname); const char *dname,
char **origname);
int qemuMigrationPrepareTunnel(virQEMUDriverPtr driver, int qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
virConnectPtr dconn, virConnectPtr dconn,
@ -110,6 +111,7 @@ int qemuMigrationPrepareTunnel(virQEMUDriverPtr driver,
int *cookieoutlen, int *cookieoutlen,
virStreamPtr st, virStreamPtr st,
virDomainDefPtr *def, virDomainDefPtr *def,
const char *origname,
unsigned long flags); unsigned long flags);
int qemuMigrationPrepareDirect(virQEMUDriverPtr driver, int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
@ -121,6 +123,7 @@ int qemuMigrationPrepareDirect(virQEMUDriverPtr driver,
const char *uri_in, const char *uri_in,
char **uri_out, char **uri_out,
virDomainDefPtr *def, virDomainDefPtr *def,
const char *origname,
unsigned long flags); unsigned long flags);
int qemuMigrationPerform(virQEMUDriverPtr driver, int qemuMigrationPerform(virQEMUDriverPtr driver,