• E
    event: don't turn offline domain into global event · e9568360
    Eric Blake 提交于
    If a user registers for a domain event filtered to a particular
    domain, but the persistent domain is offline at the time, then
    the code silently failed to set up the filter.  As a result,
    the event fires for all domains, rather than being filtered.
    Network events were immune, since they always passed an id
    0 argument.
    
    The key to this patch is realizing that
    virObjectEventDispatchMatchCallback() only cared about uuid;
    so refusing to create a meta for a negative id is pointless,
    and in fact, malloc'ing meta at all was overkill; instead,
    just directly store a uuid and a flag of whether to filter.
    
    Note that virObjectEventPtr still needs all fields of meta,
    because this is how we reconstruct a virDomainPtr inside the
    dispatch handler before calling the end user's callback
    pointer with the correct object, even though only the uuid
    portion of meta is used in deciding whether a callback
    matches the given event.  So while uuid is optional for
    callbacks, it is mandatory for events.
    
    The change to testDomainCreateXMLMixed is merely on the setup
    scenario (as you can't register for a domain unless it is either
    running or persistent).  I actually first wrote that test for
    this patch, then rebased it to also cover a prior patch (commit
    4221d64f), but had to adjust it for that patch to use Create
    instead of Define for setting up the domain long enough to
    register the event in order to work around this bug.  But while
    the setup is changed, the main body of the test is still about
    whether creation events fire as expected.
    
    * src/conf/object_event_private.h (_virObjectEventCallback):
    Replace meta with uuid and flag.
    (virObjectEventCallbackListAddID): Update signature.
    * src/conf/object_event.h (virObjectEventStateRegisterID):
    Likewise.
    * src/conf/object_event_private.h (virObjectEventNew): Document
    use of name and uuid in events.
    * src/conf/object_event.c (virObjectEventCallbackListAddID): Drop
    arguments that don't affect filtering.
    (virObjectEventCallbackListRemoveID)
    (virObjectEventDispatchMatchCallback)
    (virObjectEventStateRegisterID): Update clients.
    * src/conf/domain_event.c (virDomainEventCallbackListAdd)
    (virDomainEventStateRegisterID): Likewise.
    * src/conf/network_event.c (virNetworkEventStateRegisterID):
    Likewise.
    * tests/objecteventtest.c (testDomainCreateXMLMixed): Enhance test.
    Signed-off-by: NEric Blake <eblake@redhat.com>
    e9568360
object_event.c 25.2 KB