[libvirt] [PATCHv2] lxc: fix show the wrong xml when guest start failed
John Ferlan
jferlan at redhat.com
Tue Feb 3 15:01:56 UTC 2015
On 01/12/2015 09:33 AM, Luyao Huang wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1176503
>
> When guest start failed, libvirt will keep the current vm->def,
> this will make a issue that we cannot get a right xml after guest
> start failed. And don't call the stop/release hook to do some
> other clean work.
>
> Call virLXCProcessCleanup to help us clean the source and call
> the hooks if start a vm failed.
>
> Signed-off-by: Luyao Huang <lhuang at redhat.com>
> ---
> v2: use virLXCProcessCleanup to free the source and call the hook.
>
> src/lxc/lxc_process.c | 69 ++++++++++++++++++++++-----------------------------
> 1 file changed, 29 insertions(+), 40 deletions(-)
>
There's been some changes to virLXCProcessStart since this was written -
a revisit/rework is in order.
John
> diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
> index d7eb8bc..7ba0da8 100644
> --- a/src/lxc/lxc_process.c
> +++ b/src/lxc/lxc_process.c
> @@ -1006,6 +1006,7 @@ int virLXCProcessStart(virConnectPtr conn,
> virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
> virCgroupPtr selfcgroup;
> int status;
> + bool need_stop = false;
>
> if (virCgroupNewSelf(&selfcgroup) < 0)
> return -1;
> @@ -1265,18 +1266,20 @@ int virLXCProcessStart(virConnectPtr conn,
> goto cleanup;
> }
>
> + need_stop = true;
> +
> if (virCgroupNewDetectMachine(vm->def->name, "lxc", vm->pid,
> vm->def->resource ?
> vm->def->resource->partition :
> NULL,
> -1, &priv->cgroup) < 0)
> - goto error;
> + goto cleanup;
>
> if (!priv->cgroup) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("No valid cgroup for machine %s"),
> vm->def->name);
> - goto error;
> + goto cleanup;
> }
>
> priv->stopReason = VIR_DOMAIN_EVENT_STOPPED_FAILED;
> @@ -1296,17 +1299,17 @@ int virLXCProcessStart(virConnectPtr conn,
> _("guest failed to start: %s"), out);
> }
>
> - goto error;
> + goto cleanup;
> }
>
> if (autoDestroy &&
> virCloseCallbacksSet(driver->closeCallbacks, vm,
> conn, lxcProcessAutoDestroy) < 0)
> - goto error;
> + goto cleanup;
>
> if (virDomainObjSetDefTransient(caps, driver->xmlopt,
> vm, false) < 0)
> - goto error;
> + goto cleanup;
>
> /* We don't need the temporary NIC names anymore, clear them */
> virLXCProcessCleanInterfaces(vm->def);
> @@ -1318,7 +1321,7 @@ int virLXCProcessStart(virConnectPtr conn,
> * it with the live status XML instead. This is a (currently
> * harmless) inconsistency we should fix one day */
> if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
> - goto error;
> + goto cleanup;
>
> /* finally we can call the 'started' hook script if any */
> if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
> @@ -1334,47 +1337,38 @@ int virLXCProcessStart(virConnectPtr conn,
> * If the script raised an error abort the launch
> */
> if (hookret < 0)
> - goto error;
> + goto cleanup;
> }
>
> rc = 0;
>
> cleanup:
> - if (rc != 0 && !err)
> - err = virSaveLastError();
> - virCommandFree(cmd);
> if (VIR_CLOSE(logfd) < 0) {
> virReportSystemError(errno, "%s", _("could not close logfile"));
> rc = -1;
> }
> - for (i = 0; i < nveths; i++) {
> - if (rc != 0 && veths[i])
> - ignore_value(virNetDevVethDelete(veths[i]));
> - VIR_FREE(veths[i]);
> - }
> if (rc != 0) {
> - if (vm->newDef) {
> - virDomainDefFree(vm->newDef);
> - vm->newDef = NULL;
> - }
> - if (priv->monitor) {
> - virObjectUnref(priv->monitor);
> - priv->monitor = NULL;
> - }
> - virDomainConfVMNWFilterTeardown(vm);
> -
> - virSecurityManagerRestoreAllLabel(driver->securityManager,
> - vm->def, false);
> - virSecurityManagerReleaseLabel(driver->securityManager, vm->def);
> - /* Clear out dynamically assigned labels */
> - if (vm->def->nseclabels &&
> - vm->def->seclabels[0]->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
> - VIR_FREE(vm->def->seclabels[0]->model);
> - VIR_FREE(vm->def->seclabels[0]->label);
> - VIR_FREE(vm->def->seclabels[0]->imagelabel);
> - VIR_DELETE_ELEMENT(vm->def->seclabels, 0, vm->def->nseclabels);
> + err = virSaveLastError();
> + if (need_stop) {
> + virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
> + } else {
> + virSecurityManagerRestoreAllLabel(driver->securityManager,
> + vm->def, false);
> + virSecurityManagerReleaseLabel(driver->securityManager, vm->def);
> + /* Clear out dynamically assigned labels */
> + if (vm->def->nseclabels &&
> + vm->def->seclabels[0]->type == VIR_DOMAIN_SECLABEL_DYNAMIC) {
> + VIR_FREE(vm->def->seclabels[0]->model);
> + VIR_FREE(vm->def->seclabels[0]->label);
> + VIR_FREE(vm->def->seclabels[0]->imagelabel);
> + VIR_DELETE_ELEMENT(vm->def->seclabels, 0, vm->def->nseclabels);
> + }
> + virLXCProcessCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
> }
> }
> + virCommandFree(cmd);
> + for (i = 0; i < nveths; i++)
> + VIR_FREE(veths[i]);
> for (i = 0; i < nttyFDs; i++)
> VIR_FORCE_CLOSE(ttyFDs[i]);
> VIR_FREE(ttyFDs);
> @@ -1390,11 +1384,6 @@ int virLXCProcessStart(virConnectPtr conn,
> }
>
> return rc;
> -
> - error:
> - err = virSaveLastError();
> - virLXCProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
> - goto cleanup;
> }
>
> struct virLXCProcessAutostartData {
>
More information about the libvir-list
mailing list