Re: [PATCH 7/7] qemu: Fetch pr-helper process info on reconnect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 04, 2018 at 12:46:55 +0200, Michal Privoznik wrote:
> If qemu-pr-helper process died while libvirtd was not running no
> event is emitted. Therefore, when reconnecting to the monitor we
> must check the qemu-pr-helper process status and act accordingly.
> 
> Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx>
> ---
>  src/qemu/qemu_process.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 78 insertions(+)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 94b7de76d7..ac148a39e9 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2069,6 +2069,81 @@ qemuRefreshVirtioChannelState(virQEMUDriverPtr driver,
>      return ret;
>  }
>  
> +
> +static int
> +qemuProcessRefreshPRManagerState(virDomainObjPtr vm,
> +                                 virHashTablePtr info)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    qemuMonitorPRManagerInfoPtr prManagerInfo;
> +    size_t i;
> +    int ret = -1;
> +
> +    for (i = 0; i < vm->def->ndisks; i++) {
> +        const char *mgralias;
> +
> +        mgralias = virStorageSourceChainGetManagedPRAlias(vm->def->disks[i]->src);
> +
> +        if (!mgralias)
> +            continue;
> +
> +        if (!(prManagerInfo = virHashLookup(info, mgralias))) {
> +            virReportError(VIR_ERR_OPERATION_FAILED,
> +                           _("missing info on pr-manager %s"),
> +                           mgralias);
> +            goto cleanup;
> +        }

I don't think this is a compelling reason to kill the VM upon reconnect.

Also as said, it should not be necessary to iterate the disks to see
whether the managed PR helper is required and what the alias is supposed
to be.


> +
> +        break;
> +    }
> +
> +    if (i == vm->def->ndisks) {
> +        /* no managed pr-manager, return early. */
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    priv->prDaemonRunning = prManagerInfo->connected;
> +
> +    if (!priv->prDaemonRunning &&
> +        qemuProcessStartManagedPRDaemon(vm) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> + cleanup:
> +    return ret;
> +}
> +
> +
> +static int
> +qemuRefreshPRManagerState(virQEMUDriverPtr driver,
> +                          virDomainObjPtr vm)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    virHashTablePtr info = NULL;
> +    int ret = -1;
> +
> +    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_PR_MANAGER_HELPER))
> +        return 0;
> +
> +    if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
> +        goto cleanup;

Ummm, why don't you use qemuDomainObjEnterMonitor then?

> +
> +    ret = qemuMonitorGetPRManagerInfo(priv->mon, &info);
> +    if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +        ret = -1;
> +
> +    if (ret < 0)
> +        goto cleanup;
> +
> +    ret = qemuProcessRefreshPRManagerState(vm, info);
> +
> + cleanup:
> +    virHashFree(info);
> +    return ret;
> +}
> +
> +
>  static void
>  qemuRefreshRTC(virQEMUDriverPtr driver,
>                 virDomainObjPtr vm)
> @@ -7722,6 +7797,9 @@ qemuProcessReconnect(void *opaque)
>      if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
>          goto error;
>  
> +    if (qemuRefreshPRManagerState(driver, obj) < 0)
> +        goto error;
> +
>      /* If querying of guest's RTC failed, report error, but do not kill the domain. */
>      qemuRefreshRTC(driver, obj);
>  
> -- 
> 2.16.4
> 
> --
> libvir-list mailing list
> libvir-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/libvir-list

Attachment: signature.asc
Description: PGP signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux