libvirt/src/conf
Eric Blake 995b2ebab6 event: properly filter count of remaining events
On the surface, this sequence of API calls should succeed:

id1 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_LIFECYCLE,...);
id2 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_RTC_CHANGE,...);
virConnectDomainEventDeregisterAny(id1);
id1 = virConnectDomainEventRegisterAny(..., VIR_DOMAIN_EVENT_ID_LIFECYCLE,...);

And for test:///default, it does.  But for qemu:///system, it fails:
libvirt: XML-RPC error : internal error: domain event 0 already registered

Looking closer, the bug is caused by miscommunication between
the object event engine and the client side of the remote driver.
In our implementation, we set up a single server-side event per
eventID, then the client side replicates that one event to all
callbacks that have been registered client side.  To know when
to turn the server side eventID on or off, the client side must
track how many events for the same eventID have been registered.
But while our code was filtering by eventID on event registration,
it did not filter on event deregistration.  So the above API calls
resulted in the deregister returning 1 instead of 0, so no RPC
deregister was issued, and the final register detects on the
server side that the server is already handling eventID 0.

Unfortunately, since the problem is only observable on remote
connections, it's not possible to enhance objecteventtest to
expose the semantics using only public API entry points.

* src/conf/object_event.c (virObjectEventCallbackListCount): New
function.
(virObjectEventCallbackListAddID)
(virObjectEventCallbackListRemoveID)
(virObjectEventCallbackListMarkDeleteID): Use it.

Signed-off-by: Eric Blake <eblake@redhat.com>
2014-01-07 10:53:24 -07:00
..
capabilities.c maint: fix comma style issues: conf 2013-11-20 09:14:54 -07:00
capabilities.h maint: avoid further typedef accidents 2013-10-30 17:02:12 -06:00
cpu_conf.c conf: fix incorrect error log in virCPUDefIsEqual 2013-11-07 12:01:29 +01:00
cpu_conf.h maint: avoid 'const fooPtr' in cpu files 2013-10-14 13:11:20 -06:00
device_conf.c virutil: Move string related functions to virstring.c 2013-05-02 16:56:55 +02:00
device_conf.h Rename util.{c,h} to virutil.{c,h} 2012-12-21 11:19:49 +00:00
domain_audit.c Convert 'int i' to 'size_t i' in src/conf/ files 2013-07-10 17:40:13 +01:00
domain_audit.h Include pid namespace inode in LXC audit messages 2013-03-07 19:43:53 +00:00
domain_conf.c domain: don't try to interpret <driver> as virtio config for hostdev interfaces 2013-12-31 10:56:21 +02:00
domain_conf.h conf: add support for panic device 2013-12-12 21:17:26 -07:00
domain_event.c event: don't let old-style events clobber per-domain events 2014-01-07 09:12:10 -07:00
domain_event.h Associate a dispatch function with the event objects 2013-12-13 16:07:54 +00:00
domain_nwfilter.c Convert 'int i' to 'size_t i' in src/conf/ files 2013-07-10 17:40:13 +01:00
domain_nwfilter.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
interface_conf.c maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
interface_conf.h Get rid of shadowed booleans 2013-10-22 15:50:47 +01:00
netdev_bandwidth_conf.c Adapt to VIR_ALLOC and virAsprintf in src/conf/* 2013-07-10 11:07:31 +02:00
netdev_bandwidth_conf.h Rename xml.{c,h} to virxml.{c,h} 2012-12-21 11:19:50 +00:00
netdev_vlan_conf.c maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
netdev_vlan_conf.h maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
netdev_vport_profile_conf.c Move virNetDevVPort enum impl into virnetdevvportprofile.c 2013-10-11 11:45:54 +01:00
netdev_vport_profile_conf.h Rename xml.{c,h} to virxml.{c,h} 2012-12-21 11:19:50 +00:00
network_conf.c maint: fix comma style issues: conf 2013-11-20 09:14:54 -07:00
network_conf.h maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
network_event.c event: fix doc typos, and doc more public methods 2014-01-03 10:45:54 -07:00
network_event.h Associate a dispatch function with the event objects 2013-12-13 16:07:54 +00:00
node_device_conf.c maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
node_device_conf.h util: use size_t instead of unsigned int for num_virtual_functions 2013-11-08 14:31:11 +02:00
nwfilter_conf.c Fix memory leak in virNWFilterDefParseXML() 2013-12-02 10:39:44 +08:00
nwfilter_conf.h maint: avoid 'const fooPtr' in nwfilter files 2013-10-14 13:13:18 -06:00
nwfilter_ipaddrmap.c Adapt to VIR_ALLOC and virAsprintf in src/conf/* 2013-07-10 11:07:31 +02:00
nwfilter_ipaddrmap.h maint: fix up copyright notice inconsistencies 2012-09-20 16:30:55 -06:00
nwfilter_params.c maint: avoid 'const fooPtr' in nwfilter files 2013-10-14 13:13:18 -06:00
nwfilter_params.h maint: avoid 'const fooPtr' in nwfilter files 2013-10-14 13:13:18 -06:00
object_event_private.h event: tighten scope of object_event 2014-01-07 09:12:11 -07:00
object_event.c event: properly filter count of remaining events 2014-01-07 10:53:24 -07:00
object_event.h event: fix doc typos, and doc more public methods 2014-01-03 10:45:54 -07:00
secret_conf.c maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
secret_conf.h maint: avoid 'const fooPtr' in conf 2013-10-14 14:34:38 -06:00
snapshot_conf.c qemu: snapshot: Fix incorrect disk type for auto-generated disks 2013-12-06 10:45:49 +01:00
snapshot_conf.h snapshot: conf: Use common parsing and formatting functions for source 2013-12-02 14:28:20 +01:00
storage_conf.c storage: Add gluster pool filter and fix virsh pool listing 2013-12-19 11:01:50 +01:00
storage_conf.h maint: Kill usage of atoi() 2013-12-04 18:56:06 +01:00
storage_encryption_conf.c Convert 'int i' to 'size_t i' in src/conf/ files 2013-07-10 17:40:13 +01:00
storage_encryption_conf.h Rename util.{c,h} to virutil.{c,h} 2012-12-21 11:19:49 +00:00
virchrdev.c Adapt to VIR_ALLOC and virAsprintf in src/conf/* 2013-07-10 11:07:31 +02:00
virchrdev.h conf: Add unix socket support to virChrdevOpen 2013-01-04 18:07:11 -07:00