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

View File

@ -377,6 +377,21 @@ prlsdkSdkDomainLookupByUUID(vzDriverPtr driver, const unsigned char *uuid)
return sdkdom; 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 static int
prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid) prlsdkUUIDParse(const char *uuidstr, unsigned char *uuid)
{ {
@ -1409,7 +1424,7 @@ prlsdkConvertCpuMode(PRL_HANDLE sdkdom, virDomainDefPtr def)
return -1; return -1;
} }
static virDomainObjPtr virDomainObjPtr
prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom) prlsdkNewDomainByHandle(vzDriverPtr driver, PRL_HANDLE sdkdom)
{ {
virDomainObjPtr dom = NULL; virDomainObjPtr dom = NULL;

View File

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