于 2011年05月31日 17:38, Daniel P. Berrange 写道:
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
Thanks, applied.
Regards
Osier