[libvirt] [PATCH 5/3] qemu: don't leave shutdown inhibited on attach failure

Michal Privoznik mprivozn at redhat.com
Wed Sep 4 12:13:50 UTC 2013


On 29.08.2013 00:38, Eric Blake wrote:
> While debugging a failure of 'virsh qemu-attach', I noticed that
> we were leaking the count of active domains on failure.  This
> means that a libvirtd session that is supposed to quit after
> active domains disappear will hang around forever.
> 
> * src/qemu/qemu_process.c (qemuProcessAttach): Undo count of
> active domains on failure.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
> 
> Quite a few latent bugs being uncovered while still drilling
> down to the root cause of attaching not working.
> 
>  src/qemu/qemu_process.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 128618b..6fb4a4f 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -4353,6 +4353,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
>      const char *model;
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>      virCapsPtr caps = NULL;
> +    bool active = false;
> 
>      VIR_DEBUG("Beginning VM attach process");
> 
> @@ -4378,6 +4379,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
> 
>      if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback)
>          driver->inhibitCallback(true, driver->inhibitOpaque);
> +    active = true;
> 
>      if (virFileMakePath(cfg->logDir) < 0) {
>          virReportSystemError(errno,
> @@ -4549,9 +4551,12 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
>      return 0;
> 
>  cleanup:

I don't like this label being 'cleanup' when in fact it should be
'error'. But that's pre-existing.

> -    /* We jump here if we failed to start the VM for any reason, or
> -     * if we failed to initialize the now running VM. kill it off and
> -     * pretend we never started it */
> +    /* We jump here if we failed to attach to the VM for any reason.
> +     * Leave the domain running, but pretend we never attempted to
> +     * attach to it.  */
> +    if (active && virAtomicIntDecAndTest(&driver->nactive) &&
> +        driver->inhibitCallback)
> +        driver->inhibitCallback(false, driver->inhibitOpaque);
>      VIR_FORCE_CLOSE(logfile);
>      VIR_FREE(seclabel);
>      VIR_FREE(sec_managers);
> 

ACK

Michal




More information about the libvir-list mailing list