]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Don't replace persistent domain config with migrated config
authorJiri Denemark <jdenemar@redhat.com>
Wed, 24 Mar 2010 14:31:21 +0000 (15:31 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 26 Mar 2010 21:57:34 +0000 (22:57 +0100)
When a domain is defined on host1, migrated to host2 and then migrated
back to host1, its current configuration would overwrite the libvirtd's
in-memory copy of persistent configuration of that domain. This is not
desired as we want to preserve the persistent configuration untouched.

This patch introduces new 'live' parameter to virDomainAssignDef.
Passing 'true' for 'live' means the configuration passed to
virDomainAssignDef describes a configuration of live instance of the
domain. This applies for saved domains which are being restored or for
incoming domains during migration.

All callers have been changed to pass the appropriate value.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/lxc/lxc_driver.c
src/opennebula/one_driver.c
src/openvz/openvz_driver.c
src/qemu/qemu_driver.c
src/test/test_driver.c
src/uml/uml_driver.c

index c802a1c5580ed652a2bd91ecc911c02b2fbe5b0d..7be4b11370038e8883d63c11749a710379df8ea4 100644 (file)
@@ -766,15 +766,23 @@ static virDomainObjPtr virDomainObjNew(virCapsPtr caps)
 
 virDomainObjPtr virDomainAssignDef(virCapsPtr caps,
                                    virDomainObjListPtr doms,
-                                   const virDomainDefPtr def)
+                                   const virDomainDefPtr def,
+                                   bool live)
 {
     virDomainObjPtr domain;
     char uuidstr[VIR_UUID_STRING_BUFLEN];
 
     if ((domain = virDomainFindByUUID(doms, def->uuid))) {
         if (!virDomainObjIsActive(domain)) {
-            virDomainDefFree(domain->def);
-            domain->def = def;
+            if (live) {
+                /* save current configuration to be restored on domain shutdown */
+                if (!domain->newDef)
+                    domain->newDef = domain->def;
+                domain->def = def;
+            } else {
+                virDomainDefFree(domain->def);
+                domain->def = def;
+            }
         } else {
             virDomainDefFree(domain->newDef);
             domain->newDef = def;
@@ -5856,7 +5864,7 @@ virDomainObjPtr virDomainLoadConfig(virCapsPtr caps,
         newVM = 0;
     }
 
-    if (!(dom = virDomainAssignDef(caps, doms, def)))
+    if (!(dom = virDomainAssignDef(caps, doms, def, false)))
         goto error;
 
     dom->autostart = autostart;
index 67a68c975a03410901f7f84f362b703041b42a49..c72d37dcf7089f95d4f5d8a18df2db187bcdb589 100644 (file)
@@ -825,9 +825,12 @@ void virDomainObjRef(virDomainObjPtr vm);
 /* Returns 1 if the object was freed, 0 if more refs exist */
 int virDomainObjUnref(virDomainObjPtr vm);
 
+/* live == true means def describes an active domain (being migrated or
+ * restored) as opposed to a new persistent configuration of the domain */
 virDomainObjPtr virDomainAssignDef(virCapsPtr caps,
                                    virDomainObjListPtr doms,
-                                   const virDomainDefPtr def);
+                                   const virDomainDefPtr def,
+                                   bool live);
 void virDomainRemoveInactive(virDomainObjListPtr doms,
                              virDomainObjPtr dom);
 
index 532cf8b27a1da098c0fd99f3e457c11d88b44812..0650dc500a2a2c93d1fad5574f599183082fdee4 100644 (file)
@@ -381,7 +381,7 @@ static virDomainPtr lxcDomainDefine(virConnectPtr conn, const char *xml)
     }
 
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, def)))
+                                  &driver->domains, def, false)))
         goto cleanup;
     def = NULL;
     vm->persistent = 1;
@@ -1378,7 +1378,7 @@ lxcDomainCreateAndStart(virConnectPtr conn,
 
 
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, def)))
+                                  &driver->domains, def, false)))
         goto cleanup;
     def = NULL;
 
index d8c5059a8cd2a0c6209c1386671fa931be2c6d93..e901a03fa39fd4f5a0fff6c9162b3905413c12de 100644 (file)
@@ -251,7 +251,7 @@ static virDomainPtr oneDomainDefine(virConnectPtr conn, const char *xml)
         goto return_point;
 
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, def))) {
+                                  &driver->domains, def, false))) {
         virDomainDefFree(def);
         goto return_point;
     }
@@ -456,7 +456,7 @@ oneDomainCreateAndStart(virConnectPtr conn,
     }
 
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, def))) {
+                                  &driver->domains, def, false))) {
         virDomainDefFree(def);
         goto return_point;
     }
index da094ffec6799f22a51705e658f1982a41b318b0..61765771f1f7816b1ccecc4c2c7882d7cdbcde67 100644 (file)
@@ -825,7 +825,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
         goto cleanup;
     }
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, vmdef)))
+                                  &driver->domains, vmdef, false)))
         goto cleanup;
     vmdef = NULL;
     vm->persistent = 1;
@@ -905,7 +905,7 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
         goto cleanup;
     }
     if (!(vm = virDomainAssignDef(driver->caps,
-                                  &driver->domains, vmdef)))
+                                  &driver->domains, vmdef, false)))
         goto cleanup;
     vmdef = NULL;
     /* All OpenVZ domains seem to be persistent - this is a bit of a violation
index dfa6ea3e895c1d0ebdec7c4fafc2c418221c5880..6d76de697a80cb3319f9b98af46f73a12e84f033 100644 (file)
@@ -3809,7 +3809,7 @@ static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def)))
+                                  def, false)))
         goto cleanup;
 
     def = NULL;
@@ -5466,7 +5466,7 @@ static int qemudDomainRestore(virConnectPtr conn,
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def))) {
+                                  def, true))) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         "%s", _("failed to assign new VM"));
         goto cleanup;
@@ -6007,7 +6007,7 @@ static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def))) {
+                                  def, false))) {
         goto cleanup;
     }
     def = NULL;
@@ -8881,7 +8881,7 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def))) {
+                                  def, true))) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         "%s", _("failed to assign new VM"));
         goto cleanup;
@@ -9112,7 +9112,7 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def))) {
+                                  def, true))) {
         qemuReportError(VIR_ERR_OPERATION_FAILED,
                         "%s", _("failed to assign new VM"));
         goto cleanup;
index 4af2d001d257414b5c56436e5535da265786af7e..2931a95b6cbae73fc6625299ece046869e12bf74 100644 (file)
@@ -554,7 +554,7 @@ static int testOpenDefault(virConnectPtr conn) {
     if (testDomainGenerateIfnames(conn, domdef) < 0)
         goto error;
     if (!(domobj = virDomainAssignDef(privconn->caps,
-                                      &privconn->domains, domdef)))
+                                      &privconn->domains, domdef, false)))
         goto error;
     domdef = NULL;
 
@@ -910,7 +910,7 @@ static int testOpenFromFile(virConnectPtr conn,
 
         if (testDomainGenerateIfnames(conn, def) < 0 ||
             !(dom = virDomainAssignDef(privconn->caps,
-                                       &privconn->domains, def))) {
+                                       &privconn->domains, def, false))) {
             virDomainDefFree(def);
             goto error;
         }
@@ -1308,7 +1308,7 @@ testDomainCreateXML(virConnectPtr conn, const char *xml,
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
     if (!(dom = virDomainAssignDef(privconn->caps,
-                                   &privconn->domains, def)))
+                                   &privconn->domains, def, false)))
         goto cleanup;
     def = NULL;
 
@@ -1852,7 +1852,7 @@ static int testDomainRestore(virConnectPtr conn,
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
     if (!(dom = virDomainAssignDef(privconn->caps,
-                                   &privconn->domains, def)))
+                                   &privconn->domains, def, true)))
         goto cleanup;
     def = NULL;
 
@@ -2301,7 +2301,7 @@ static virDomainPtr testDomainDefineXML(virConnectPtr conn,
     if (testDomainGenerateIfnames(conn, def) < 0)
         goto cleanup;
     if (!(dom = virDomainAssignDef(privconn->caps,
-                                   &privconn->domains, def)))
+                                   &privconn->domains, def, false)))
         goto cleanup;
     def = NULL;
     dom->persistent = 1;
index 008eb8d4d37da15e3017a13fee8a5cde21abbf88..835e5d4ca3426d724bf1acde7a343181ceb16855 100644 (file)
@@ -1283,7 +1283,7 @@ static virDomainPtr umlDomainCreate(virConnectPtr conn, const char *xml,
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def)))
+                                  def, false)))
         goto cleanup;
     def = NULL;
 
@@ -1619,7 +1619,7 @@ static virDomainPtr umlDomainDefine(virConnectPtr conn, const char *xml) {
 
     if (!(vm = virDomainAssignDef(driver->caps,
                                   &driver->domains,
-                                  def)))
+                                  def, false)))
         goto cleanup;
     def = NULL;
     vm->persistent = 1;