[libvirt] [PATCH 2/6] conf: add storage_event handling and unittests

Cole Robinson crobinso at redhat.com
Thu Jun 9 21:57:07 UTC 2016


Subject mentions unittests but there's no unittests here, they are in patch #3

On 06/09/2016 02:25 PM, Jovanka Gulicoska wrote:
> Following patern of network_event.c, the following functions are added:
> 

The internal API bits added aren't really interesting IMO. How about just

Add storage event handling infrastructure to storage_event.[ch], following
the network_event.[ch] pattern.

> virStoragePoolEventLifecycleNew:
> create a new storage pool lifecycle event
> 
> virStoragePoolEventStateRegisterClient:
> Returns number of registerd callbacks
> 
> virStoragePoolEventStateRegisterID
> ---
>  src/Makefile.am          |   5 +
>  src/conf/object_event.c  |   1 +
>  src/conf/storage_conf.h  |   5 +
>  src/conf/storage_event.c | 237 +++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/storage_event.h |  60 ++++++++++++
>  src/libvirt_private.syms |   5 +
>  6 files changed, 313 insertions(+)
>  create mode 100644 src/conf/storage_event.c
>  create mode 100644 src/conf/storage_event.h
> 
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 8c83b0c..f0ad5eb 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -340,6 +340,9 @@ DOMAIN_EVENT_SOURCES =						\
>  NETWORK_EVENT_SOURCES =						\
>  		conf/network_event.c conf/network_event.h
>  
> +STORAGE_POOL_EVENT_SOURCES =                                    \
> +                conf/storage_event.c conf/storage_event.h
> +
>  # Network driver generic impl APIs
>  NETWORK_CONF_SOURCES =						\
>  		conf/network_conf.c conf/network_conf.h \
> @@ -390,6 +393,7 @@ CONF_SOURCES =							\
>  		$(OBJECT_EVENT_SOURCES)				\
>  		$(DOMAIN_EVENT_SOURCES)				\
>  		$(NETWORK_EVENT_SOURCES)			\
> +                $(STORAGE_POOL_EVENT_SOURCES)                   \
>  		$(NETWORK_CONF_SOURCES)				\
>  		$(NWFILTER_CONF_SOURCES)			\
>  		$(NODE_DEVICE_CONF_SOURCES)			\
> @@ -2352,6 +2356,7 @@ libvirt_setuid_rpc_client_la_SOURCES = 		\
>  		conf/domain_event.c		\
>  		conf/network_event.c		\
>  		conf/object_event.c		\
> +                conf/storage_event.c            \
>  		rpc/virnetsocket.c		\
>  		rpc/virnetsocket.h		\
>  		rpc/virnetmessage.h		\

This file uses hard tabs, but you seem to be using spaces.

> diff --git a/src/conf/object_event.c b/src/conf/object_event.c
> index 06eedff..7e6fc79 100644
> --- a/src/conf/object_event.c
> +++ b/src/conf/object_event.c
> @@ -26,6 +26,7 @@
>  
>  #include "domain_event.h"
>  #include "network_event.h"
> +#include "storage_event.h"
>  #include "object_event.h"
>  #include "object_event_private.h"
>  #include "virlog.h"

Hmm, is this actually needed here? I don't see why it would. Maybe the
network_event.h is bogus too, but if so, removing it would be a separate patch

> diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
> index 54116a6..8622ed7 100644
> --- a/src/conf/storage_conf.h
> +++ b/src/conf/storage_conf.h
> @@ -31,6 +31,8 @@
>  # include "virthread.h"
>  # include "device_conf.h"
>  # include "node_device_conf.h"
> +# include "storage_conf.h"

This is trying to import itself :) It can probably be dropped

> +# include "object_event.h"
>  
>  # include <libxml/tree.h>
>  
> @@ -296,6 +298,9 @@ struct _virStorageDriverState {
>      char *autostartDir;
>      char *stateDir;
>      bool privileged;
> +
> +    /* Immutable pointer, self-locking APIs */
> +    virObjectEventStatePtr storageEventState;
>  };
>  
>  typedef struct _virStoragePoolSourceList virStoragePoolSourceList;
> diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c
> new file mode 100644
> index 0000000..5233d57
> --- /dev/null
> +++ b/src/conf/storage_event.c
> @@ -0,0 +1,237 @@
> +/*
> + * storage_event.c: storage event queue processing helpers
> + *
> + * Copyright (C) 2010-2014 Red Hat, Inc.
> + * Copyright (C) 2008 VirtualIron
> + * Copyright (C) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
> + *

Not really sure how the copyright should work here... since it's largely based
on other code and this is the copyright notice from network_event.c ... maybe
just leave it like this

> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library.  If not, see
> + * <http://www.gnu.org/licenses/>.
> +*/
> +
> +#include <config.h>
> +
> +#include "storage_event.h"
> +#include "object_event.h"
> +#include "object_event_private.h"
> +#include "datatypes.h"
> +#include "virlog.h"
> +
> +VIR_LOG_INIT("conf.storage_event");
> +
> +struct _virStoragePoolEvent {
> +    virObjectEvent parent;
> +
> +    /* Unused attribute to allow for subclass creation */
> +    bool dummy;
> +};
> +typedef struct _virStoragePoolEvent virStoragePoolEvent;
> +typedef virStoragePoolEvent *virStoragePoolEventPtr;
> +
> +struct _virStoragePoolEventLifecycle {
> +    virStoragePoolEvent parent;
> +
> +    int type;
> +    int detail;
> +};
> +typedef struct _virStoragePoolEventLifecycle virStoragePoolEventLifecycle;
> +typedef virStoragePoolEventLifecycle *virStoragePoolEventLifecyclePtr;
> +
> +static virClassPtr virStoragePoolEventClass;
> +static virClassPtr virStoragePoolEventLifecycleClass;
> +static void virStoragePoolEventDispose(void *obj);
> +static void virStoragePoolEventLifecycleDispose(void *obj);
> +
> +static int
> +virStoragePoolEventsOnceInit(void)
> +{
> +    if (!(virStoragePoolEventClass =
> +          virClassNew(virClassForObjectEvent(),
> +                      "virStoragePoolEvent",
> +                      sizeof(virStoragePoolEvent),
> +                      virStoragePoolEventDispose)))
> +        return -1;
> +    if (!(virStoragePoolEventLifecycleClass =
> +          virClassNew(virStoragePoolEventClass,
> +                      "virStoragePoolEventLifecycle",
> +                      sizeof(virStoragePoolEventLifecycle),
> +                      virStoragePoolEventLifecycleDispose)))
> +        return -1;
> +    return 0;
> +}
> +
> +VIR_ONCE_GLOBAL_INIT(virStoragePoolEvents)
> +
> +static void
> +virStoragePoolEventDispose(void *obj)
> +{
> +    virStoragePoolEventPtr event = obj;
> +    VIR_DEBUG("obj=%p", event);
> +}
> +
> +
> +static void
> +virStoragePoolEventLifecycleDispose(void *obj)
> +{
> +    virStoragePoolEventLifecyclePtr event = obj;
> +    VIR_DEBUG("obj=%p", event);
> +}
> +
> +
> +static void
> +virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn,
> +                                       virObjectEventPtr event,
> +                                       virConnectObjectEventGenericCallback cb,
> +                                       void *cbopaque)
> +{
> +    virStoragePoolPtr pool = virGetStoragePool(conn,
> +                                               event->meta.name,
> +                                               event->meta.uuid,
> +                                               NULL, NULL);
> +    if (!pool)
> +        return;
> +
> +    switch ((virStoragePoolEventID)event->eventID) {
> +    case VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE:
> +        {
> +            virStoragePoolEventLifecyclePtr storagePoolLifecycleEvent;
> +
> +            storagePoolLifecycleEvent = (virStoragePoolEventLifecyclePtr)event;
> +            ((virConnectStoragePoolEventLifecycleCallback)cb)(conn, pool,
> +                                                          storagePoolLifecycleEvent->type,
> +                                                          storagePoolLifecycleEvent->detail,
> +                                                          cbopaque);

Indentation is off with these 3 lines

Otherwise this looks fine to me, this is largely just boilerplate that matches
network_event.c impl

Thanks,
Cole




More information about the libvir-list mailing list