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

Peter Krempa pkrempa at redhat.com
Wed Jul 4 11:58:49 UTC 2018


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 at redhat.com>
> ---
>  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 at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180704/952d618f/attachment-0001.sig>


More information about the libvir-list mailing list