[libvirt] [PATCH 0/6] events: don't mandate a uuid

The generic event infrastructure has the notion of lookup-by-uuid baked into the API, but not all objects have a uuid (nodedev, interfaces). This series enables callers to specify a string key for match purposes. Existing users of the binary uuid value now pass in a converted uuid string. Cole Robinson (6): events: Privatize virObjectEventCallback events: Add virObjectEventCallbackFree events: Cleanup callback variable name events: Pass in UUID as a string events: Add explicit lookup 'key' value events: Rename argument uuid->key src/conf/domain_event.c | 28 +++++-- src/conf/network_event.c | 16 +++- src/conf/object_event.c | 170 +++++++++++++++++++++------------------- src/conf/object_event.h | 3 - src/conf/object_event_private.h | 8 +- src/conf/storage_event.c | 16 +++- 6 files changed, 145 insertions(+), 96 deletions(-) -- 2.7.4

It's only used in object_event.c, so remove it from the header. We need to move the _virObjectEventCallback definition earlier as a result. --- src/conf/object_event.c | 36 +++++++++++++++++++----------------- src/conf/object_event.h | 3 --- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 06eedff..95bf3e6 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -38,6 +38,25 @@ VIR_LOG_INIT("conf.object_event"); +struct _virObjectEventCallback { + int callbackID; + virClassPtr klass; + int eventID; + virConnectPtr conn; + int remoteID; + bool uuid_filter; + unsigned char uuid[VIR_UUID_BUFLEN]; + virObjectEventCallbackFilter filter; + void *filter_opaque; + virConnectObjectEventGenericCallback cb; + void *opaque; + virFreeCallback freecb; + bool deleted; + bool legacy; /* true if end user does not know callbackID */ +}; +typedef struct _virObjectEventCallback virObjectEventCallback; +typedef virObjectEventCallback *virObjectEventCallbackPtr; + struct _virObjectEventCallbackList { unsigned int nextID; size_t count; @@ -63,23 +82,6 @@ struct _virObjectEventState { virMutex lock; }; -struct _virObjectEventCallback { - int callbackID; - virClassPtr klass; - int eventID; - virConnectPtr conn; - int remoteID; - bool uuid_filter; - unsigned char uuid[VIR_UUID_BUFLEN]; - virObjectEventCallbackFilter filter; - void *filter_opaque; - virConnectObjectEventGenericCallback cb; - void *opaque; - virFreeCallback freecb; - bool deleted; - bool legacy; /* true if end user does not know callbackID */ -}; - static virClassPtr virObjectEventClass; static void virObjectEventDispose(void *obj); diff --git a/src/conf/object_event.h b/src/conf/object_event.h index 7654799..b0201dd 100644 --- a/src/conf/object_event.h +++ b/src/conf/object_event.h @@ -29,9 +29,6 @@ #ifndef __OBJECT_EVENT_H__ # define __OBJECT_EVENT_H__ -typedef struct _virObjectEventCallback virObjectEventCallback; -typedef virObjectEventCallback *virObjectEventCallbackPtr; - /** * Dispatching domain events that come in while * in a call / response rpc -- 2.7.4

--- src/conf/object_event.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 95bf3e6..1b5a4d0 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -126,6 +126,22 @@ virObjectEventDispose(void *obj) } /** + * virObjectEventCallbackFree: + * @list: event callback to free + * + * Free the memory in the domain event callback + */ +static void +virObjectEventCallbackFree(virObjectEventCallbackPtr cb) +{ + if (!cb) + return; + + virObjectUnref(cb->conn); + VIR_FREE(cb); +} + +/** * virObjectEventCallbackListFree: * @list: event callback list head * @@ -230,8 +246,7 @@ virObjectEventCallbackListRemoveID(virConnectPtr conn, if (cb->freecb) (*cb->freecb)(cb->opaque); - virObjectUnref(cb->conn); - VIR_FREE(cb); + virObjectEventCallbackFree(cb); VIR_DELETE_ELEMENT(cbList->callbacks, i, cbList->count); return ret; } @@ -280,8 +295,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) virFreeCallback freecb = cbList->callbacks[n]->freecb; if (freecb) (*freecb)(cbList->callbacks[n]->opaque); - virObjectUnref(cbList->callbacks[n]->conn); - VIR_FREE(cbList->callbacks[n]); + virObjectEventCallbackFree(cbList->callbacks[n]); VIR_DELETE_ELEMENT(cbList->callbacks, n, cbList->count); n--; @@ -441,9 +455,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, } cleanup: - if (event) - virObjectUnref(event->conn); - VIR_FREE(event); + virObjectEventCallbackFree(event); return ret; } -- 2.7.4

In every other instance virObjectEventCallbackPtr is named 'cb', and in other code 'event' usually means a virObjectEventPtr --- src/conf/object_event.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 1b5a4d0..2230eec 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -393,7 +393,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, int *callbackID, bool serverFilter) { - virObjectEventCallbackPtr event; + virObjectEventCallbackPtr cb; int ret = -1; int remoteID = -1; @@ -417,30 +417,30 @@ virObjectEventCallbackListAddID(virConnectPtr conn, _("event callback already tracked")); return -1; } - /* Allocate new event */ - if (VIR_ALLOC(event) < 0) + /* Allocate new cb */ + if (VIR_ALLOC(cb) < 0) goto cleanup; - event->conn = virObjectRef(conn); - *callbackID = event->callbackID = cbList->nextID++; - event->cb = callback; - event->klass = klass; - event->eventID = eventID; - event->opaque = opaque; - event->freecb = freecb; - event->remoteID = remoteID; + cb->conn = virObjectRef(conn); + *callbackID = cb->callbackID = cbList->nextID++; + cb->cb = callback; + cb->klass = klass; + cb->eventID = eventID; + cb->opaque = opaque; + cb->freecb = freecb; + cb->remoteID = remoteID; /* Only need 'uuid' for matching; 'id' can change as domain * switches between running and shutoff, and 'name' can change in * Xen migration. */ if (uuid) { - event->uuid_filter = true; - memcpy(event->uuid, uuid, VIR_UUID_BUFLEN); + cb->uuid_filter = true; + memcpy(cb->uuid, uuid, VIR_UUID_BUFLEN); } - event->filter = filter; - event->filter_opaque = filter_opaque; - event->legacy = legacy; + cb->filter = filter; + cb->filter_opaque = filter_opaque; + cb->legacy = legacy; - if (VIR_APPEND_ELEMENT(cbList->callbacks, cbList->count, event) < 0) + if (VIR_APPEND_ELEMENT(cbList->callbacks, cbList->count, cb) < 0) goto cleanup; /* When additional filtering is being done, every client callback @@ -455,7 +455,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, } cleanup: - virObjectEventCallbackFree(event); + virObjectEventCallbackFree(cb); return ret; } -- 2.7.4

This should not have any functional difference, it's just a step towards matching on non-uuid string keys --- src/conf/domain_event.c | 17 ++++++++++++++--- src/conf/network_event.c | 12 ++++++++++-- src/conf/object_event.c | 24 +++++++++++++----------- src/conf/object_event_private.h | 2 +- src/conf/storage_event.c | 12 ++++++++++-- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 58823e8..7ad6d2c 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -1998,10 +1998,14 @@ virDomainEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virDomainEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, dom ? dom->uuid : NULL, + if (dom) + virUUIDFormat(dom->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, dom ? uuidstr : NULL, NULL, NULL, virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), @@ -2042,10 +2046,14 @@ virDomainEventStateRegisterClient(virConnectPtr conn, int *callbackID, bool remoteID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virDomainEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, dom ? dom->uuid : NULL, + if (dom) + virUUIDFormat(dom->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, dom ? uuidstr : NULL, NULL, NULL, virDomainEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), @@ -2180,6 +2188,7 @@ virDomainQemuMonitorEventStateRegisterID(virConnectPtr conn, { virDomainQemuMonitorEventData *data = NULL; virObjectEventCallbackFilter filter = NULL; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virDomainEventsInitialize() < 0) return -1; @@ -2220,7 +2229,9 @@ virDomainQemuMonitorEventStateRegisterID(virConnectPtr conn, filter = virDomainQemuMonitorEventFilter; freecb = virDomainQemuMonitorEventCleanup; - return virObjectEventStateRegisterID(conn, state, dom ? dom->uuid : NULL, + if (dom) + virUUIDFormat(dom->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, dom ? uuidstr : NULL, filter, data, virDomainQemuMonitorEventClass, 0, VIR_OBJECT_EVENT_CALLBACK(cb), diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 8623940..21f6db1 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -150,10 +150,14 @@ virNetworkEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virNetworkEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, net ? net->uuid : NULL, + if (net) + virUUIDFormat(net->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, net ? uuidstr : NULL, NULL, NULL, virNetworkEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), @@ -190,10 +194,14 @@ virNetworkEventStateRegisterClient(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virNetworkEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, net ? net->uuid : NULL, + if (net) + virUUIDFormat(net->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, net ? uuidstr : NULL, NULL, NULL, virNetworkEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 2230eec..8fd182d 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -45,7 +45,7 @@ struct _virObjectEventCallback { virConnectPtr conn; int remoteID; bool uuid_filter; - unsigned char uuid[VIR_UUID_BUFLEN]; + char *uuid; virObjectEventCallbackFilter filter; void *filter_opaque; virConnectObjectEventGenericCallback cb; @@ -138,6 +138,7 @@ virObjectEventCallbackFree(virObjectEventCallbackPtr cb) return; virObjectUnref(cb->conn); + VIR_FREE(cb->uuid); VIR_FREE(cb); } @@ -192,7 +193,7 @@ virObjectEventCallbackListCount(virConnectPtr conn, virObjectEventCallbackListPtr cbList, virClassPtr klass, int eventID, - unsigned char uuid[VIR_UUID_BUFLEN], + const char *uuid, bool serverFilter) { size_t i; @@ -209,8 +210,7 @@ virObjectEventCallbackListCount(virConnectPtr conn, !cb->deleted && (!serverFilter || (cb->remoteID >= 0 && - ((uuid && cb->uuid_filter && - memcmp(cb->uuid, uuid, VIR_UUID_BUFLEN) == 0) || + ((uuid && cb->uuid_filter && STREQ(cb->uuid, uuid)) || (!uuid && !cb->uuid_filter))))) ret++; } @@ -326,7 +326,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) virObjectEventCallbackLookup(virConnectPtr conn, virObjectEventCallbackListPtr cbList, - unsigned char uuid[VIR_UUID_BUFLEN], + const char *uuid, virClassPtr klass, int eventID, virConnectObjectEventGenericCallback callback, @@ -346,8 +346,7 @@ virObjectEventCallbackLookup(virConnectPtr conn, if (cb->klass == klass && cb->eventID == eventID && cb->conn == conn && - ((uuid && cb->uuid_filter && - memcmp(cb->uuid, uuid, VIR_UUID_BUFLEN) == 0) || + ((uuid && cb->uuid_filter && STREQ(cb->uuid, uuid)) || (!uuid && !cb->uuid_filter))) { if (remoteID) *remoteID = cb->remoteID; @@ -381,7 +380,7 @@ virObjectEventCallbackLookup(virConnectPtr conn, static int virObjectEventCallbackListAddID(virConnectPtr conn, virObjectEventCallbackListPtr cbList, - unsigned char uuid[VIR_UUID_BUFLEN], + const char *uuid, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, @@ -434,7 +433,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn, * Xen migration. */ if (uuid) { cb->uuid_filter = true; - memcpy(cb->uuid, uuid, VIR_UUID_BUFLEN); + if (VIR_STRDUP(cb->uuid, uuid) < 0) + goto cleanup; } cb->filter = filter; cb->filter_opaque = filter_opaque; @@ -707,8 +707,10 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, * running & shutoff states & ignoring 'name' since * Xen sometimes renames guests during migration, thus * leaving 'uuid' as the only truly reliable ID we can use. */ + char uuidstr[VIR_UUID_STRING_BUFLEN]; + virUUIDFormat(event->meta.uuid, uuidstr); - return memcmp(event->meta.uuid, cb->uuid, VIR_UUID_BUFLEN) == 0; + return STREQ(uuidstr, cb->uuid); } return true; } @@ -874,7 +876,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state) int virObjectEventStateRegisterID(virConnectPtr conn, virObjectEventStatePtr state, - unsigned char *uuid, + const char *uuid, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index a19a0d3..cae74ef 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -72,7 +72,7 @@ virClassForObjectEvent(void); int virObjectEventStateRegisterID(virConnectPtr conn, virObjectEventStatePtr state, - unsigned char *uuid, + const char *uuid, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index c5688be..de4f1ea 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -152,10 +152,14 @@ virStoragePoolEventStateRegisterID(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virStoragePoolEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, pool ? pool->uuid : NULL, + if (pool) + virUUIDFormat(pool->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, pool ? uuidstr : NULL, NULL, NULL, virStoragePoolEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), @@ -192,10 +196,14 @@ virStoragePoolEventStateRegisterClient(virConnectPtr conn, virFreeCallback freecb, int *callbackID) { + char uuidstr[VIR_UUID_STRING_BUFLEN]; + if (virStoragePoolEventsInitialize() < 0) return -1; - return virObjectEventStateRegisterID(conn, state, pool ? pool->uuid : NULL, + if (pool) + virUUIDFormat(pool->uuid, uuidstr); + return virObjectEventStateRegisterID(conn, state, pool ? uuidstr : NULL, NULL, NULL, virStoragePoolEventClass, eventID, VIR_OBJECT_EVENT_CALLBACK(cb), -- 2.7.4

This allows event implementations to match on something other than an object's uuid, like nodedev or interface objects which don't have a uuid. --- src/conf/domain_event.c | 11 +++++++++-- src/conf/network_event.c | 4 +++- src/conf/object_event.c | 23 +++++++++++------------ src/conf/object_event_private.h | 6 ++++-- src/conf/storage_event.c | 4 +++- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 7ad6d2c..63ae9e1 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -581,6 +581,7 @@ virDomainEventNew(virClassPtr klass, const unsigned char *uuid) { virDomainEventPtr event; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virDomainEventsInitialize() < 0) return NULL; @@ -592,10 +593,14 @@ virDomainEventNew(virClassPtr klass, return NULL; } + /* We use uuid for matching key. We ignore 'name' because + * Xen sometimes renames guests during migration, thus + * 'uuid' is the only truly reliable key we can use. */ + virUUIDFormat(uuid, uuidstr); if (!(event = virObjectEventNew(klass, virDomainEventDispatchDefaultFunc, eventID, - id, name, uuid))) + id, name, uuid, uuidstr))) return NULL; return (virObjectEventPtr)event; @@ -1873,13 +1878,15 @@ virDomainQemuMonitorEventNew(int id, const char *details) { virDomainQemuMonitorEventPtr ev; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virDomainEventsInitialize() < 0) return NULL; + virUUIDFormat(uuid, uuidstr); if (!(ev = virObjectEventNew(virDomainQemuMonitorEventClass, virDomainQemuMonitorEventDispatchFunc, - 0, id, name, uuid))) + 0, id, name, uuid, uuidstr))) return NULL; /* event is mandatory, details are optional */ diff --git a/src/conf/network_event.c b/src/conf/network_event.c index 21f6db1..e0d1a3d 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -226,14 +226,16 @@ virNetworkEventLifecycleNew(const char *name, int detail) { virNetworkEventLifecyclePtr event; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virNetworkEventsInitialize() < 0) return NULL; + virUUIDFormat(uuid, uuidstr); if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, virNetworkEventDispatchDefaultFunc, VIR_NETWORK_EVENT_ID_LIFECYCLE, - 0, name, uuid))) + 0, name, uuid, uuidstr))) return NULL; event->type = type; diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 8fd182d..5734230 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -123,6 +123,7 @@ virObjectEventDispose(void *obj) VIR_DEBUG("obj=%p", event); VIR_FREE(event->meta.name); + VIR_FREE(event->meta.key); } /** @@ -619,6 +620,7 @@ virObjectEventStateNew(void) * @id: id of the object the event describes, or 0 * @name: name of the object the event describes * @uuid: uuid of the object the event describes + * @key: key for per-object filtering * * Create a new event, with the information common to all events. */ @@ -628,7 +630,8 @@ virObjectEventNew(virClassPtr klass, int eventID, int id, const char *name, - const unsigned char *uuid) + const unsigned char *uuid, + const char *key) { virObjectEventPtr event; @@ -653,6 +656,11 @@ virObjectEventNew(virClassPtr klass, VIR_FREE(event); return NULL; } + if (VIR_STRDUP(event->meta.key, key) < 0) { + VIR_FREE(event->meta.name); + VIR_FREE(event); + return NULL; + } event->meta.id = id; memcpy(event->meta.uuid, uuid, VIR_UUID_BUFLEN); @@ -701,17 +709,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, if (cb->filter && !(cb->filter)(cb->conn, event, cb->filter_opaque)) return false; - if (cb->uuid_filter) { - /* Deliberately ignoring 'id' for matching, since that - * will cause problems when a domain switches between - * running & shutoff states & ignoring 'name' since - * Xen sometimes renames guests during migration, thus - * leaving 'uuid' as the only truly reliable ID we can use. */ - char uuidstr[VIR_UUID_STRING_BUFLEN]; - virUUIDFormat(event->meta.uuid, uuidstr); - - return STREQ(uuidstr, cb->uuid); - } + if (cb->uuid_filter) + return STREQ(event->meta.key, cb->uuid); return true; } diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index cae74ef..95b2120 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -31,6 +31,7 @@ struct _virObjectMeta { int id; char *name; unsigned char uuid[VIR_UUID_BUFLEN]; + char *key; }; typedef struct _virObjectMeta virObjectMeta; typedef virObjectMeta *virObjectMetaPtr; @@ -102,8 +103,9 @@ virObjectEventNew(virClassPtr klass, int eventID, int id, const char *name, - const unsigned char *uuid) + const unsigned char *uuid, + const char *key) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(5) - ATTRIBUTE_NONNULL(6); + ATTRIBUTE_NONNULL(6) ATTRIBUTE_NONNULL(7); #endif diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index de4f1ea..cb97c90 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -228,14 +228,16 @@ virStoragePoolEventLifecycleNew(const char *name, int detail) { virStoragePoolEventLifecyclePtr event; + char uuidstr[VIR_UUID_STRING_BUFLEN]; if (virStoragePoolEventsInitialize() < 0) return NULL; + virUUIDFormat(uuid, uuidstr); if (!(event = virObjectEventNew(virStoragePoolEventLifecycleClass, virStoragePoolEventDispatchDefaultFunc, VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, - 0, name, uuid))) + 0, name, uuid, uuidstr))) return NULL; event->type = type; -- 2.7.4

On 06/23/2016 12:27 PM, Cole Robinson wrote:
This allows event implementations to match on something other than an object's uuid, like nodedev or interface objects which don't have a uuid. --- src/conf/domain_event.c | 11 +++++++++-- src/conf/network_event.c | 4 +++- src/conf/object_event.c | 23 +++++++++++------------ src/conf/object_event_private.h | 6 ++++-- src/conf/storage_event.c | 4 +++- 5 files changed, 30 insertions(+), 18 deletions(-)
[...]
diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index de4f1ea..cb97c90 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -228,14 +228,16 @@ virStoragePoolEventLifecycleNew(const char *name, int detail) { virStoragePoolEventLifecyclePtr event; + char uuidstr[VIR_UUID_STRING_BUFLEN];
if (virStoragePoolEventsInitialize() < 0) return NULL;
+ virUUIDFormat(uuid, uuidstr); if (!(event = virObjectEventNew(virStoragePoolEventLifecycleClass, virStoragePoolEventDispatchDefaultFunc, VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE, - 0, name, uuid))) + 0, name, uuid, uuidstr))) return NULL;
event->type = type;
You'll need to account for uuidstr due to commit id '03308482' in the new API virStoragePoolEventRefreshNew John

Since it's not strictly a uuid anymore --- This could have been squashed in earlier, but I kept it separate to make earlier bits easier to review. src/conf/object_event.c | 61 ++++++++++++++++++++--------------------- src/conf/object_event_private.h | 2 +- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/conf/object_event.c b/src/conf/object_event.c index 5734230..cb984ff 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -44,8 +44,8 @@ struct _virObjectEventCallback { int eventID; virConnectPtr conn; int remoteID; - bool uuid_filter; - char *uuid; + bool key_filter; + char *key; virObjectEventCallbackFilter filter; void *filter_opaque; virConnectObjectEventGenericCallback cb; @@ -139,7 +139,7 @@ virObjectEventCallbackFree(virObjectEventCallbackPtr cb) return; virObjectUnref(cb->conn); - VIR_FREE(cb->uuid); + VIR_FREE(cb->key); VIR_FREE(cb); } @@ -173,17 +173,17 @@ virObjectEventCallbackListFree(virObjectEventCallbackListPtr list) * @cbList: the list * @klass: the base event class * @eventID: the event ID - * @uuid: optional uuid of per-object filtering + * @key: optional key of per-object filtering * @serverFilter: true if server supports object filtering * * Internal function to count how many callbacks remain registered for - * the given @eventID and @uuid; knowing this allows the client side + * the given @eventID and @key; knowing this allows the client side * of the remote driver know when it must send an RPC to adjust the * callbacks on the server. When @serverFilter is false, this function * returns a count that includes both global and per-object callbacks, * since the remote side will use a single global event to feed both. * When true, the count is limited to the callbacks with the same - * @uuid, and where a remoteID has already been set on the callback + * @key, and where a remoteID has already been set on the callback * with virObjectEventStateSetRemote(). Note that this function * intentionally ignores the legacy field, since RPC calls use only a * single callback on the server to manage both legacy and modern @@ -194,7 +194,7 @@ virObjectEventCallbackListCount(virConnectPtr conn, virObjectEventCallbackListPtr cbList, virClassPtr klass, int eventID, - const char *uuid, + const char *key, bool serverFilter) { size_t i; @@ -211,8 +211,8 @@ virObjectEventCallbackListCount(virConnectPtr conn, !cb->deleted && (!serverFilter || (cb->remoteID >= 0 && - ((uuid && cb->uuid_filter && STREQ(cb->uuid, uuid)) || - (!uuid && !cb->uuid_filter))))) + ((key && cb->key_filter && STREQ(cb->key, key)) || + (!key && !cb->key_filter))))) ret++; } return ret; @@ -242,7 +242,7 @@ virObjectEventCallbackListRemoveID(virConnectPtr conn, ret = cb->filter ? 0 : (virObjectEventCallbackListCount(conn, cbList, cb->klass, cb->eventID, - cb->uuid_filter ? cb->uuid : NULL, + cb->key_filter ? cb->key : NULL, cb->remoteID >= 0) - 1); if (cb->freecb) @@ -275,7 +275,7 @@ virObjectEventCallbackListMarkDeleteID(virConnectPtr conn, return cb->filter ? 0 : virObjectEventCallbackListCount(conn, cbList, cb->klass, cb->eventID, - cb->uuid_filter ? cb->uuid : NULL, + cb->key_filter ? cb->key : NULL, cb->remoteID >= 0); } } @@ -310,7 +310,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) * virObjectEventCallbackLookup: * @conn: pointer to the connection * @cbList: the list - * @uuid: the uuid of the object to filter on + * @key: the key of the object to filter on * @klass: the base event class * @eventID: the event ID * @callback: the callback to locate @@ -327,7 +327,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList) static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) virObjectEventCallbackLookup(virConnectPtr conn, virObjectEventCallbackListPtr cbList, - const char *uuid, + const char *key, virClassPtr klass, int eventID, virConnectObjectEventGenericCallback callback, @@ -347,8 +347,8 @@ virObjectEventCallbackLookup(virConnectPtr conn, if (cb->klass == klass && cb->eventID == eventID && cb->conn == conn && - ((uuid && cb->uuid_filter && STREQ(cb->uuid, uuid)) || - (!uuid && !cb->uuid_filter))) { + ((key && cb->key_filter && STREQ(cb->key, key)) || + (!key && !cb->key_filter))) { if (remoteID) *remoteID = cb->remoteID; if (cb->legacy == legacy && @@ -364,7 +364,7 @@ virObjectEventCallbackLookup(virConnectPtr conn, * virObjectEventCallbackListAddID: * @conn: pointer to the connection * @cbList: the list - * @uuid: the optional uuid of the object to filter on + * @key: the optional key of the object to filter on * @filter: optional last-ditch filter callback * @filter_opaque: opaque data to pass to @filter * @klass: the base event class @@ -381,7 +381,7 @@ virObjectEventCallbackLookup(virConnectPtr conn, static int virObjectEventCallbackListAddID(virConnectPtr conn, virObjectEventCallbackListPtr cbList, - const char *uuid, + const char *key, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, @@ -397,10 +397,10 @@ virObjectEventCallbackListAddID(virConnectPtr conn, int ret = -1; int remoteID = -1; - VIR_DEBUG("conn=%p cblist=%p uuid=%p filter=%p filter_opaque=%p " + VIR_DEBUG("conn=%p cblist=%p key=%p filter=%p filter_opaque=%p " "klass=%p eventID=%d callback=%p opaque=%p " "legacy=%d callbackID=%p serverFilter=%d", - conn, cbList, uuid, filter, filter_opaque, klass, eventID, + conn, cbList, key, filter, filter_opaque, klass, eventID, callback, opaque, legacy, callbackID, serverFilter); /* Check incoming */ @@ -410,7 +410,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, /* If there is no additional filtering, then check if we already * have this callback on our list. */ if (!filter && - virObjectEventCallbackLookup(conn, cbList, uuid, + virObjectEventCallbackLookup(conn, cbList, key, klass, eventID, callback, legacy, serverFilter ? &remoteID : NULL) != -1) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -429,12 +429,9 @@ virObjectEventCallbackListAddID(virConnectPtr conn, cb->freecb = freecb; cb->remoteID = remoteID; - /* Only need 'uuid' for matching; 'id' can change as domain - * switches between running and shutoff, and 'name' can change in - * Xen migration. */ - if (uuid) { - cb->uuid_filter = true; - if (VIR_STRDUP(cb->uuid, uuid) < 0) + if (key) { + cb->key_filter = true; + if (VIR_STRDUP(cb->key, key) < 0) goto cleanup; } cb->filter = filter; @@ -450,7 +447,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn, ret = 1; } else { ret = virObjectEventCallbackListCount(conn, cbList, klass, eventID, - uuid, serverFilter); + key, serverFilter); if (serverFilter && remoteID < 0) ret++; } @@ -709,8 +706,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event, if (cb->filter && !(cb->filter)(cb->conn, event, cb->filter_opaque)) return false; - if (cb->uuid_filter) - return STREQ(event->meta.key, cb->uuid); + if (cb->key_filter) + return STREQ(event->meta.key, cb->key); return true; } @@ -842,7 +839,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state) * virObjectEventStateRegisterID: * @conn: connection to associate with callback * @state: domain event state - * @uuid: uuid of the object for event filtering + * @key: key of the object for event filtering * @klass: the base event class * @eventID: ID of the event type to register for * @cb: function to invoke when event occurs @@ -875,7 +872,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state) int virObjectEventStateRegisterID(virConnectPtr conn, virObjectEventStatePtr state, - const char *uuid, + const char *key, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, @@ -903,7 +900,7 @@ virObjectEventStateRegisterID(virConnectPtr conn, } ret = virObjectEventCallbackListAddID(conn, state->callbacks, - uuid, filter, filter_opaque, + key, filter, filter_opaque, klass, eventID, cb, opaque, freecb, legacy, callbackID, serverFilter); diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index 95b2120..92c25d4 100644 --- a/src/conf/object_event_private.h +++ b/src/conf/object_event_private.h @@ -73,7 +73,7 @@ virClassForObjectEvent(void); int virObjectEventStateRegisterID(virConnectPtr conn, virObjectEventStatePtr state, - const char *uuid, + const char *key, virObjectEventCallbackFilter filter, void *filter_opaque, virClassPtr klass, -- 2.7.4

On 06/23/2016 12:27 PM, Cole Robinson wrote:
The generic event infrastructure has the notion of lookup-by-uuid baked into the API, but not all objects have a uuid (nodedev, interfaces).
This series enables callers to specify a string key for match purposes. Existing users of the binary uuid value now pass in a converted uuid string.
Cole Robinson (6): events: Privatize virObjectEventCallback events: Add virObjectEventCallbackFree events: Cleanup callback variable name events: Pass in UUID as a string events: Add explicit lookup 'key' value events: Rename argument uuid->key
src/conf/domain_event.c | 28 +++++-- src/conf/network_event.c | 16 +++- src/conf/object_event.c | 170 +++++++++++++++++++++------------------- src/conf/object_event.h | 3 - src/conf/object_event_private.h | 8 +- src/conf/storage_event.c | 16 +++- 6 files changed, 145 insertions(+), 96 deletions(-)
Beyond the noted issue in patch 5 ... ACK series, John

On 06/28/2016 02:18 PM, John Ferlan wrote:
On 06/23/2016 12:27 PM, Cole Robinson wrote:
The generic event infrastructure has the notion of lookup-by-uuid baked into the API, but not all objects have a uuid (nodedev, interfaces).
This series enables callers to specify a string key for match purposes. Existing users of the binary uuid value now pass in a converted uuid string.
Cole Robinson (6): events: Privatize virObjectEventCallback events: Add virObjectEventCallbackFree events: Cleanup callback variable name events: Pass in UUID as a string events: Add explicit lookup 'key' value events: Rename argument uuid->key
src/conf/domain_event.c | 28 +++++-- src/conf/network_event.c | 16 +++- src/conf/object_event.c | 170 +++++++++++++++++++++------------------- src/conf/object_event.h | 3 - src/conf/object_event_private.h | 8 +- src/conf/storage_event.c | 16 +++- 6 files changed, 145 insertions(+), 96 deletions(-)
Beyond the noted issue in patch 5 ...
ACK series,
Thanks, I have that issue fixed locally already. I'll push after the release - Cole
participants (2)
-
Cole Robinson
-
John Ferlan