vz: fix destination domain synchronization

Adding domain to domain list on preparation step is not correct.
First domain is not fully constructed - domain definition is
missing. Second we can't use VIR_MIGRATE_PARAM_DEST_XML parameter
to parse definition as vz sdk can patch it by itself. Let's add/remove
domain on finish step. This is for synchronization purpose only so domain
is present/absent on destination after migration completion. Actually
domain object will probably be created right after actual vz sdk
migration start by vz sdk domain defined event.

We can not and should not sync domain cache on error path in finish step
of migration. We can not as we really don't know what is the reason of
cancelling and we should not as user should not make assumptions on
state on error path. What we should do is cleaning up temporary migration
state that is induced on prepare step but we don't have one. Thus
cancellation should be noop.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Signed-off-by: Maxim Nestratov <mnestratov@virtuozzo.com>
This commit is contained in:
Nikolay Shirokovskiy 2016-06-08 10:17:22 +03:00 committed by Maxim Nestratov
parent e126352e93
commit eb2fe4eb4a
3 changed files with 38 additions and 48 deletions

View File

@ -2318,7 +2318,7 @@ vzDomainMigrateBegin3Params(virDomainPtr domain,
if (!(dom = vzDomObjFromDomain(domain)))
goto cleanup;
/* session uuid is for backward compat */
/* session uuid, domain uuid and domain name are for backward compat */
if (vzBakeCookie(privconn->driver, dom, cookieout, cookieoutlen,
VZ_MIGRATION_COOKIE_SESSION_UUID
| VZ_MIGRATION_COOKIE_DOMAIN_UUID
@ -2363,8 +2363,8 @@ static int
vzDomainMigratePrepare3Params(virConnectPtr conn,
virTypedParameterPtr params,
int nparams,
const char *cookiein,
int cookieinlen,
const char *cookiein ATTRIBUTE_UNUSED,
int cookieinlen ATTRIBUTE_UNUSED,
char **cookieout,
int *cookieoutlen,
char **uri_out,
@ -2373,8 +2373,6 @@ vzDomainMigratePrepare3Params(virConnectPtr conn,
vzConnPtr privconn = conn->privateData;
const char *miguri = NULL;
const char *dname = NULL;
virDomainObjPtr dom = NULL;
vzMigrationCookiePtr mig = NULL;
int ret = -1;
virCheckFlags(VZ_MIGRATION_FLAGS, -1);
@ -2393,11 +2391,6 @@ vzDomainMigratePrepare3Params(virConnectPtr conn,
if (!miguri && !(*uri_out = vzMigrationCreateURI()))
goto cleanup;
if (!(mig = vzEatCookie(cookiein, cookieinlen,
VZ_MIGRATION_COOKIE_DOMAIN_UUID
| VZ_MIGRATION_COOKIE_DOMAIN_NAME)))
goto cleanup;
/* domain uuid and domain name are for backward compat */
if (vzBakeCookie(privconn->driver, NULL,
cookieout, cookieoutlen,
@ -2406,30 +2399,9 @@ vzDomainMigratePrepare3Params(virConnectPtr conn,
| VZ_MIGRATION_COOKIE_DOMAIN_NAME) < 0)
goto cleanup;
virObjectLock(privconn->driver);
dom = virDomainObjListFindByUUID(privconn->driver->domains, mig->uuid);
if (dom) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(mig->uuid, uuidstr);
virReportError(VIR_ERR_INTERNAL_ERROR,
_("A domain with uuid '%s' already exists"),
uuidstr);
goto unlock;
}
if (!(dom = vzNewDomain(privconn->driver,
dname ? dname : mig->name, mig->uuid)))
goto unlock;
ret = 0;
unlock:
virObjectUnlock(privconn->driver);
cleanup:
vzMigrationCookieFree(mig);
if (dom)
virObjectUnlock(dom);
return ret;
}
@ -2674,29 +2646,25 @@ vzDomainMigrateFinish3Params(virConnectPtr dconn,
vzConnPtr privconn = dconn->privateData;
vzDriverPtr driver = privconn->driver;
const char *name = NULL;
PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
virCheckFlags(VZ_MIGRATION_FLAGS, NULL);
if (virTypedParamsValidate(params, nparams, VZ_MIGRATION_PARAMETERS) < 0)
goto cleanup;
return NULL;
if (cancelled)
return NULL;
if (virTypedParamsGetString(params, nparams,
VIR_MIGRATE_PARAM_DEST_NAME, &name) < 0)
return NULL;
sdkdom = prlsdkSdkDomainLookupByName(driver, name);
if (sdkdom == PRL_INVALID_HANDLE)
goto cleanup;
if (!(dom = virDomainObjListFindByName(driver->domains, name))) {
virReportError(VIR_ERR_NO_DOMAIN,
_("no domain with matching name '%s'"), name);
goto cleanup;
}
if (cancelled) {
virDomainObjListRemove(driver->domains, dom);
dom = NULL;
goto cleanup;
}
if (prlsdkLoadDomain(driver, dom))
if (!(dom = prlsdkNewDomainByHandle(driver, sdkdom)))
goto cleanup;
domain = virGetDomain(dconn, dom->def->name, dom->def->uuid);
@ -2706,9 +2674,11 @@ vzDomainMigrateFinish3Params(virConnectPtr dconn,
cleanup:
/* In this situation we have to restore domain on source. But the migration
* is already finished. */
if (!cancelled && !domain)
if (!domain)
VIR_WARN("Can't provide domain '%s' after successfull migration.", name);
virDomainObjEndAPI(&dom);
if (dom)
virObjectUnlock(dom);
PrlHandle_Free(sdkdom);
return domain;
}

View File

@ -377,6 +377,21 @@ prlsdkSdkDomainLookupByUUID(vzDriverPtr driver, const unsigned char *uuid)
return sdkdom;
}
PRL_HANDLE
prlsdkSdkDomainLookupByName(vzDriverPtr driver, const char *name)
{
PRL_HANDLE sdkdom = PRL_INVALID_HANDLE;
if (prlsdkSdkDomainLookup(driver, name,
PGVC_SEARCH_BY_NAME, &sdkdom) < 0) {
virReportError(VIR_ERR_NO_DOMAIN,
_("no domain with matching name '%s'"), name);
return PRL_INVALID_HANDLE;
}
return sdkdom;
}
static int
prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid)
{
@ -1409,7 +1424,7 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr def)
return -1;
}
static virDomainObjPtr
virDomainObjPtr
prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom)
{
virDomainObjPtr dom = NULL;

View File

@ -94,3 +94,8 @@ prlsdkMigrate(virDomainObjPtr dom,
const char unsigned *session_uuid,
const char *dname,
unsigned int flags);
PRL_HANDLE
prlsdkSdkDomainLookupByName(vzDriverPtr driver, const char *name);
virDomainObjPtr
prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom);