]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
lxc: Seperate domain config loading
authorOsier Yang <jyang@redhat.com>
Tue, 31 May 2011 10:03:41 +0000 (18:03 +0800)
committerOsier Yang <jyang@redhat.com>
Tue, 31 May 2011 10:03:41 +0000 (18:03 +0800)
This patch seperate the domain config loading just as qemu driver
does, first loading config of running or trasient domains, then
of persistent inactive domains. And only try to reconnect the
monitor of running domains, so that it won't always throws errors
saying can't connect to domain monitor.

And as "virDomainLoadConfig->virDomainAssignDef->virDomainObjAssignDef",
already do things like "vm->newDef = def", removed the codes
in "lxcReconnectVM" that does the same work.

src/lxc/lxc_driver.c

index 6ee13da2aea288ead32431821ef256a92bde399f..8eb87a25f467afaa94a79e7e970ca7d43520e9f3 100644 (file)
@@ -1522,6 +1522,10 @@ static int lxcVmStart(virConnectPtr conn,
     if (virDomainObjSetDefTransient(driver->caps, vm, false) < 0)
         goto cleanup;
 
+    /* Write domain status to disk. */
+    if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+        goto cleanup;
+
     rc = 0;
 
 cleanup:
@@ -1909,8 +1913,6 @@ lxcReconnectVM(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque)
 {
     virDomainObjPtr vm = payload;
     lxc_driver_t *driver = opaque;
-    char *config = NULL;
-    virDomainDefPtr tmp;
     lxcDomainObjPrivatePtr priv;
 
     virDomainObjLock(vm);
@@ -1926,18 +1928,6 @@ lxcReconnectVM(void *payload, const void *name ATTRIBUTE_UNUSED, void *opaque)
         goto cleanup;
     }
 
-    if ((config = virDomainConfigFile(driver->stateDir,
-                                      vm->def->name)) == NULL)
-        goto cleanup;
-
-    /* Try and load the live config */
-    tmp = virDomainDefParseFile(driver->caps, config, 0);
-    VIR_FREE(config);
-    if (tmp) {
-        vm->newDef = vm->def;
-        vm->def = tmp;
-    }
-
     if (vm->pid != 0) {
         vm->def->id = vm->pid;
         virDomainObjSetState(vm, VIR_DOMAIN_RUNNING,
@@ -2030,6 +2020,17 @@ static int lxcStartup(int privileged)
     lxc_driver->caps->privateDataAllocFunc = lxcDomainObjPrivateAlloc;
     lxc_driver->caps->privateDataFreeFunc = lxcDomainObjPrivateFree;
 
+    /* Get all the running persistent or transient configs first */
+    if (virDomainLoadAllConfigs(lxc_driver->caps,
+                                &lxc_driver->domains,
+                                lxc_driver->stateDir,
+                                NULL,
+                                1, NULL, NULL) < 0)
+        goto cleanup;
+
+    virHashForEach(lxc_driver->domains.objs, lxcReconnectVM, lxc_driver);
+
+    /* Then inactive persistent configs */
     if (virDomainLoadAllConfigs(lxc_driver->caps,
                                 &lxc_driver->domains,
                                 lxc_driver->configDir,
@@ -2037,8 +2038,6 @@ static int lxcStartup(int privileged)
                                 0, NULL, NULL) < 0)
         goto cleanup;
 
-    virHashForEach(lxc_driver->domains.objs, lxcReconnectVM, lxc_driver);
-
     lxcDriverUnlock(lxc_driver);
 
     lxcAutostartConfigs(lxc_driver);