From eb2fe4eb4a4edd8679f657ec3f7f9b1325ad1012 Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Wed, 8 Jun 2016 10:17:22 +0300 Subject: [PATCH] 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 Signed-off-by: Maxim Nestratov --- src/vz/vz_driver.c | 64 ++++++++++++---------------------------------- src/vz/vz_sdk.c | 17 +++++++++++- src/vz/vz_sdk.h | 5 ++++ 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index d5c0cad841..46798fd286 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -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; } diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 2ead9f2b90..7ddf3c5ae6 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -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; diff --git a/src/vz/vz_sdk.h b/src/vz/vz_sdk.h index 41557a3baa..1ea0be9175 100644 --- a/src/vz/vz_sdk.h +++ b/src/vz/vz_sdk.h @@ -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);