[libvirt] [PATCH v2 4/6] remote: implement storage lifecycle event APIs

Cole Robinson crobinso at redhat.com
Tue Jun 14 13:04:31 UTC 2016


On 06/14/2016 01:41 AM, Peter Krempa wrote:
> On Mon, Jun 13, 2016 at 18:38:41 +0200, Jovanka Gulicoska wrote:a
> 
> It may be worth noting that along with the lifecycle event this patch
> also implements all the dispatching stuff for events in the storage
> driver.
> 
> It may be also worth splitting those two additions but I'm not going to
> insist.
> 
>> ---
>>  daemon/libvirtd.h            |   2 +
>>  daemon/remote.c              | 201 ++++++++++++++++++++++++++++++++++++++++++-
>>  src/remote/remote_driver.c   | 128 +++++++++++++++++++++++++++
>>  src/remote/remote_protocol.x |  43 ++++++++-
>>  src/remote_protocol-structs  |  16 ++++
>>  5 files changed, 388 insertions(+), 2 deletions(-)
> 
> [...]
> 
>> diff --git a/daemon/remote.c b/daemon/remote.c
>> index b2a420b..d6f5f1e 100644
>> --- a/daemon/remote.c
>> +++ b/daemon/remote.c
>> @@ -181,6 +181,32 @@ remoteRelayNetworkEventCheckACL(virNetServerClientPtr client,
>>      return ret;
>>  }
>>  
>> +static bool
>> +remoteRelayStoragePoolEventCheckACL(virNetServerClientPtr client,
>> +                                    virConnectPtr conn,
>> +                                    virStoragePoolPtr pool)
>> +{
>> +    virStoragePoolDef def;
>> +    virIdentityPtr identity = NULL;
>> +    bool ret = false;
>> +
>> +    /* For now, we just create a virStoragePoolDef with enough contents to
>> + *      * satisfy what viraccessdriverpolkit.c references.  This is a bit
>> + *           * fragile, but I don't know of anything better.  */
> 
> Very broken comment formatting.
> 
>> +    def.name = pool->name;
>> +    memcpy(def.uuid, pool->uuid, VIR_UUID_BUFLEN);
>> +
>> +    if (!(identity = virNetServerClientGetIdentity(client)))
>> +        goto cleanup;
>> +    if (virIdentitySetCurrent(identity) < 0)
>> +        goto cleanup;
>> +    ret = virConnectStoragePoolEventRegisterAnyCheckACL(conn, &def);
>> +
>> + cleanup:
>> +    ignore_value(virIdentitySetCurrent(NULL));
>> +    virObjectUnref(identity);
>> +    return ret;
>> +}
>>  
>>  static bool
>>  remoteRelayDomainQemuMonitorEventCheckACL(virNetServerClientPtr client,
>> @@ -208,7 +234,6 @@ remoteRelayDomainQemuMonitorEventCheckACL(virNetServerClientPtr client,
>>      return ret;
>>  }
>>  
>> -
> 
> Spurious whitespace change.
> 
>>  static int
>>  remoteRelayDomainEventLifecycle(virConnectPtr conn,
>>                                  virDomainPtr dom,
> 
> [...]
> 
>> @@ -5434,6 +5512,127 @@ remoteDispatchConnectNetworkEventDeregisterAny(virNetServerPtr server ATTRIBUTE_
>>      return rv;
>>  }
>>  
>> +static int
>> +remoteDispatchConnectStoragePoolEventRegisterAny(virNetServerPtr server ATTRIBUTE_UNUSED,
>> +                                                 virNetServerClientPtr client,
>> +                                                 virNetMessagePtr msg ATTRIBUTE_UNUSED,
>> +                                                 virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
>> +                                                 remote_connect_storage_pool_event_register_any_args *args,
>> +                                                 remote_connect_storage_pool_event_register_any_ret *ret)
>> +{
>> +    int callbackID;
>> +    int rv = -1;
>> +    daemonClientEventCallbackPtr callback = NULL;
>> +    daemonClientEventCallbackPtr ref;
>> +    struct daemonClientPrivate *priv =
>> +        virNetServerClientGetPrivateData(client);
>> +    virStoragePoolPtr  pool = NULL;
>> +
>> +    if (!priv->conn) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
>> +        goto cleanup;
>> +    }
>> +
>> +    virMutexLock(&priv->lock);
>> +
>> +    if (args->pool &&
>> +        !(pool = get_nonnull_storage_pool(priv->conn, *args->pool)))
>> +        goto cleanup;
>> +
>> +    if (args->eventID >= VIR_STORAGE_POOL_EVENT_ID_LAST || args->eventID < 0) {
>> +        virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                       _("unsupported storage pool event ID %d"), args->eventID);
>> +        goto cleanup;
>> +    }
>> +
>> +    /* If we call register first, we could append a complete callback
>> +     * to our array, but on OOM append failure, we'd have to then hope
>> +     * deregister works to undo our register.  So instead we append an
>> +     * incomplete callback to our array, then register, then fix up
>> +     * our callback; but since VIR_APPEND_ELEMENT clears 'callback' on
> 
> Or you can use VIR_APPEND_ELEMENT_COPY to avoid clearing 'callback' and
> having to juggle the pointer between 'ref' and 'callback'
> 
>> +     * success, we use 'ref' to save a copy of the pointer.  */
>> +    if (VIR_ALLOC(callback) < 0)
>> +        goto cleanup;
>> +    callback->client = client;
>> +    callback->eventID = args->eventID;
>> +    callback->callbackID = -1;
>> +    ref = callback;
>> +    if (VIR_APPEND_ELEMENT(priv->storageEventCallbacks,
>> +                           priv->nstorageEventCallbacks,
>> +                           callback) < 0)
>> +        goto cleanup;
>> +
>> +    if ((callbackID = virConnectStoragePoolEventRegisterAny(priv->conn,
>> +                                                            pool,
>> +                                                            args->eventID,
>> +                                                            storageEventCallbacks[args->eventID],
>> +                                                            ref,
>> +                                                            remoteEventCallbackFree)) < 0) {
>> +        VIR_SHRINK_N(priv->storageEventCallbacks,
>> +                     priv->nstorageEventCallbacks, 1);
>> +        callback = ref;
>> +        goto cleanup;
>> +    }
>> +
>> +    ref->callbackID = callbackID;
>> +    ret->callbackID = callbackID;
>> +
>> +    rv = 0;
>> +
>> + cleanup:
>> +    VIR_FREE(callback);
>> +    if (rv < 0)
>> +        virNetMessageSaveError(rerr);
>> +    virObjectUnref(pool);
>> +    virMutexUnlock(&priv->lock);
>> +    return rv;
>> +}
>> +
> 
> [...]
> 
>> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
>> index f494cbf..6fae72e 100644
>> --- a/src/remote/remote_driver.c
>> +++ b/src/remote/remote_driver.c
> 
> [...]
> 
>> @@ -438,6 +444,10 @@ static virNetClientProgramEvent remoteEvents[] = {
>>        remoteNetworkBuildEventLifecycle,
>>        sizeof(remote_network_event_lifecycle_msg),
>>        (xdrproc_t)xdr_remote_network_event_lifecycle_msg },
>> +    { REMOTE_PROC_STORAGE_POOL_EVENT_LIFECYCLE,
>> +      remoteStoragePoolBuildEventLifecycle,
>> +      sizeof(remote_storage_pool_event_lifecycle_msg),
>> +      (xdrproc_t)xdr_remote_storage_pool_event_lifecycle_msg },
> 
> We are usually adding at the tail of the list.
> 
>>      { REMOTE_PROC_DOMAIN_EVENT_CALLBACK_LIFECYCLE,
>>        remoteDomainBuildEventCallbackLifecycle,
>>        sizeof(remote_domain_event_callback_lifecycle_msg),
> 
> [...]
> 
>> diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
>> index fe1b8a8..85bc62d 100644
>> --- a/src/remote_protocol-structs
>> +++ b/src/remote_protocol-structs
>> @@ -2551,6 +2551,22 @@ struct remote_network_event_lifecycle_msg {
>>          int                        event;
>>          int                        detail;
>>  };
>> +struct remote_connect_storage_pool_event_register_any_args {
>> +        int                             eventID;
>> +        remote_storage_pool             pool;
>> +};
>> +struct remote_connect_storage_pool_event_register_any_ret {
>> +        int                        callbackID;
>> +};
>> +struct remote_connect_storage_pool_event_deregister_any_args {
>> +        int                        callbackID;
>> +};
>> +struct remote_storage_pool_event_lifecycle_msg {
>> +        int                             callbackID;
>> +        remote_nonnull_storage_pool     pool;
>> +        int                             event;
>> +        int                             detail;
>> +};
> 
> Fails make check:
> 
> --- remote_protocol-structs	2016-06-14 07:01:24.847495995 +0200
> +++ remote_protocol-struct-t3	2016-06-14 07:01:59.265494534 +0200
> @@ -2552,8 +2552,8 @@
>          int                        detail;
>  };
>  struct remote_connect_storage_pool_event_register_any_args {
> -        int                             eventID;
> -        remote_storage_pool             pool;
> +        int                        eventID;
> +        remote_storage_pool        pool;
>  };
>  struct remote_connect_storage_pool_event_register_any_ret {
>          int                        callbackID;
> @@ -2562,10 +2562,10 @@
>          int                        callbackID;
>  };
>  struct remote_storage_pool_event_lifecycle_msg {
> -        int                             callbackID;
> -        remote_nonnull_storage_pool     pool;
> -        int                             event;
> -        int                             detail;
> +        int                        callbackID;
> +        remote_nonnull_storage_pool pool;
> +        int                        event;
> +        int                        detail;
>  };
>  struct remote_domain_fsfreeze_args {
>          remote_nonnull_domain      dom;
> @@ -3119,4 +3119,7 @@
>          REMOTE_PROC_DOMAIN_GET_PERF_EVENTS = 365,
>          REMOTE_PROC_DOMAIN_SET_PERF_EVENTS = 366,
>          REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_REMOVAL_FAILED = 367,
> +        REMOTE_PROC_CONNECT_STORAGE_POOL_EVENT_REGISTER_ANY = 368,
> +        REMOTE_PROC_CONNECT_STORAGE_POOL_EVENT_DEREGISTER_ANY = 369,
> +        REMOTE_PROC_STORAGE_POOL_EVENT_LIFECYCLE = 370,
>  };
> make[3]: *** [Makefile:10977: remote_protocol-struct] Error 1
> 

Strange. Tried figuring out why I don't see this. If I do cd src; make
check-protocol I get:

$ make check-protocol
  GEN      remote_protocol-struct
  GEN      lxc_protocol-struct
  GEN      qemu_protocol-struct
  GEN      virnetprotocol-struct
  GEN      virkeepaliveprotocol-struct
  GEN      admin_protocol-struct
  GEN      lxc_monitor_protocol-struct
  GEN      lock_protocol-struct
WARNING: pdwtags appears broken; skipping the qemu_protocol-struct test
WARNING: pdwtags appears broken; skipping the remote_protocol-struct test
WARNING: pdwtags appears broken; skipping the lxc_protocol-struct test
WARNING: pdwtags appears broken; skipping the lock_protocol-struct test
WARNING: pdwtags appears broken; skipping the virnetprotocol-struct test
WARNING: pdwtags appears broken; skipping the virkeepaliveprotocol-struct test
WARNING: pdwtags appears broken; skipping the admin_protocol-struct test
WARNING: pdwtags appears broken; skipping the lxc_monitor_protocol-struct test

So I guess that's why I don't see the error. Makefile.am has some notes about
handling different pdwtags output formats, but the last commit is from 2011
from Eric. Maybe the format changed again:

$ rpm -qf `which pdwtags`
dwarves-1.10-9.fc24.x86_64

Thanks,
Cole




More information about the libvir-list mailing list