]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
vz: fix destination domain synchronization
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Wed, 8 Jun 2016 07:17:22 +0000 (10:17 +0300)
committerMaxim Nestratov <mnestratov@virtuozzo.com>
Mon, 18 Jul 2016 19:21:40 +0000 (22:21 +0300)
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>
src/vz/vz_driver.c
src/vz/vz_sdk.c
src/vz/vz_sdk.h

index d5c0cad841748dc5eee23fd02667795ca2126df1..46798fd286c0a41890f546821106360361710f3d 100644 (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)
-        goto cleanup;
-
-    if (!(dom = virDomainObjListFindByName(driver->domains, name))) {
-        virReportError(VIR_ERR_NO_DOMAIN,
-                       _("no domain with matching name '%s'"), name);
-        goto cleanup;
-    }
+        return NULL;
 
-    if (cancelled) {
-        virDomainObjListRemove(driver->domains, dom);
-        dom = NULL;
+    sdkdom = prlsdkSdkDomainLookupByName(driver, name);
+    if (sdkdom == PRL_INVALID_HANDLE)
         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;
 }
 
index 2ead9f2b90e0cd606087f6d6e6291f9d01003b2e..7ddf3c5ae600348af312552326c9508d4b12a480 100644 (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;
index 41557a3baa0dc63b6cf1ae5f33cceb886fae77c4..1ea0be9175d0c7297ed5e4c6e6cf83113ac9983d 100644 (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);