On Mon, May 30, 2011 at 05:54:20PM +0800, Osier Yang wrote: > 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 | 31 +++++++++++++++---------------- > 1 files changed, 15 insertions(+), 16 deletions(-) > > diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c > index 6ee13da..8eb87a2 100644 > --- a/src/lxc/lxc_driver.c > +++ b/src/lxc/lxc_driver.c > @@ -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); ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list