[libvirt] [PATCH v2 4/6] qemu: Wire up PR_MANAGER_STATUS_CHANGED event

Peter Krempa pkrempa at redhat.com
Tue Jul 10 10:17:18 UTC 2018


On Thu, Jul 05, 2018 at 09:44:36 +0200, Michal Privoznik wrote:
> This event is emitted on the monitor if one of pr-managers lost
> connection to its pr-helper process. What libvirt needs to do is
> restart the pr-helper process iff it corresponds to managed
> pr-manager.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c       |  1 +
>  src/qemu/qemu_domain.h       |  1 +
>  src/qemu/qemu_driver.c       | 17 ++++++++++++++
>  src/qemu/qemu_monitor.c      | 15 ++++++++++++
>  src/qemu/qemu_monitor.h      | 11 +++++++++
>  src/qemu/qemu_monitor_json.c | 23 ++++++++++++++++++
>  src/qemu/qemu_process.c      | 55 ++++++++++++++++++++++++++++++++++++++++++++
>  7 files changed, 123 insertions(+)

[...]

> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index f200729cb1..ac2f73c99e 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1615,6 +1615,60 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>  }
>  
>  
> +static int
> +qemuProcessHandlePRManagerStatusChanged(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> +                                        virDomainObjPtr vm,
> +                                        const char *prManager,
> +                                        bool connected,
> +                                        void *opaque)
> +{
> +    virQEMUDriverPtr driver = opaque;
> +    qemuDomainObjPrivatePtr priv;
> +    struct qemuProcessEvent *processEvent = NULL;
> +    const char *managedAlias = qemuDomainGetManagedPRAlias();
> +    int ret = -1;
> +
> +    virObjectLock(vm);
> +
> +    VIR_DEBUG("pr-manager %s status changed for domain %p %s connected=%d",
> +              prManager, vm, vm->def->name, connected);
> +
> +    if (connected) {
> +        /* Connect events are boring. */
> +        ret = 0;
> +        goto cleanup;
> +    }
> +    /* Disconnect events are more interesting. */
> +
> +    if (STRNEQ(prManager, managedAlias)) {
> +        VIR_DEBUG("pr-manager %s not managed, ignoring event",
> +                  prManager);
> +        ret = 0;
> +        goto cleanup;
> +    }
> +
> +    priv = vm->privateData;
> +    priv->prDaemonRunning = false;
> +
> +    if (VIR_ALLOC(processEvent) < 0)
> +        goto cleanup;
> +
> +    processEvent->eventType = QEMU_PROCESS_EVENT_PR_DISCONNECT;
> +    processEvent->vm = virObjectRef(vm);
> +
> +    if (virThreadPoolSendJob(driver->workerPool, 0, processEvent) < 0) {
> +        qemuProcessEventFree(processEvent);
> +        ignore_value(virObjectUnref(vm));

We usually don't ignore value of this.

> +        goto cleanup;
> +    }
> +
> +    ret = 0;
> + cleanup:
> +    virObjectUnlock(vm);
> +    return ret;

ACK
-------------- 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/20180710/648cc123/attachment-0001.sig>


More information about the libvir-list mailing list