[libvirt-users] virConnectDomainEventRegisterAny problem

Alexandr sss at sss.chaoslab.ru
Thu Aug 22 22:20:30 UTC 2013


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

23.08.2013 00:51, Alexandr пишет:
> 21.08.2013 12:58, Alexandr пишет:
>> 21.08.2013 12:39, Daniel P. Berrange пишет:
>>> On Wed, Aug 21, 2013 at 12:36:06PM +0300, Alexandr wrote:
>>>> -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
>>>> 
>>>> 21.08.2013 09:46, Alexandr пишет:
>>>>> 21.08.2013 09:32, Martin Kletzander пишет:
>>>>>> On Wed 21 Aug 2013 01:03:37 AM CEST, Alexandr wrote:
>>>>>>> 
>>>>>>> good day. i trying to make callback function for 
>>>>>>> VIR_DOMAIN_EVENT_ID_LIFECYCLE, i have successfully 
>>>>>>> registering callback, but it never called, i need to 
>>>>>>> know when domain started, stopped or crashed, i have 
>>>>>>> write following code
>>>>>>> 
>>>>>>> static int    domain_event_handler(virConnectPtr conn,
>>>>>>>  virDomainPtr dom, int event, int detail, void *
>>>>>>> opaque) { switch(event) { } return 0; }
>>>>>>> 
>>>>>>> ..... int callback = 
>>>>>>> virConnectDomainEventRegisterAny(libvirt_connection, 
>>>>>>> NULL, VIR_DOMAIN_EVENT_ID_LIFECYCLE, 
>>>>>>> VIR_DOMAIN_EVENT_CALLBACK(domain_event_handler), NULL,
>>>>>>>  NULL); if(callback == -1) { std::cout<<"Error: failed
>>>>>>> to register domain event handle callback\n"; return -1;
>>>>>>> } .....
>>>>>>> 
>>>>>>> 
>>>>>>> but "domain_event_handler" is never called, what is 
>>>>>>> wrong here ?
>>>>> 
>>>>>> Are you running an event loop?  You can have a look at
>>>>>> our examples [1] and see what's being done there.
>>>>>> Especially note the virEventRunDefaultImpl() [2] there.
>>>>> 
>>>>>> Martin
>>>>> 
>>>>>> [1] 
>>>>>> http://libvirt.org/git/?p=libvirt.git;a=blob;f=examples/domain-events/events-c/event-test.c;h=52aa3d08d7326e422c12a8521717c3d55b2d8afd;hb=HEAD
>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>>
>
>>>>>> 
>>>>>> 
> [2]
>>>>>> http://libvirt.org/git/?p=libvirt.git;a=blob;f=examples/domain-events/events-c/event-test.c;h=52aa3d08d7326e422c12a8521717c3d55b2d8afd;hb=HEAD#l611
>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>>
>
>>>>>> 
>>>>>> 
> oh..., i missed it, thx for hint and sorry for stupid questions .
>>>> 
>>>> now it's working except for events from other connections,
>>>> for example i want to handle domain started by virt-manager,
>>>> now i do not have event when it's started, is exists any api
>>>> to handle this events, or i need to implement internal
>>>> polling of domains state in my application ?
> 
>>> The events system reports all lifecycle events, regardless of 
>>> which connection triggered them.
> 
>>> If you're not seeing events from domains started by
>>> virt-manager then your almost certainly connecting to a
>>> different libvirt URI than virt-manager is using.
> 
>>> Daniel
> 
>> also looks like i do not receiving last event, i mean last event 
>> what passed to callback is "eventcount - 1"
> 
>> _______________________________________________ libvirt-users 
>> mailing list libvirt-users at redhat.com 
>> https://www.redhat.com/mailman/listinfo/libvirt-users
> 
> 
> 
> after few days of trying i have not resolved problem, and have 
> followinf situation: i receiving events from my connection
> sometimes (not all and not always), i do not receiving events from
> other connections (virt-manager) at all (i am sure that connection
> url are same for both connections), my code follows:
> 
> static int	domain_event_handler(virConnectPtr conn, virDomainPtr
> dom, int event, int detail, void * opaque) { std::cout<<"domain
> event handler called\n"; }
> 
> void libvirt_eventloop_thr_func() { while(true) //TODO: stop
> somehow on exit { if(virEventRunDefaultImpl() < 0) { virErrorPtr
> err = virGetLastError(); fprintf(stderr, "Failed to run event loop:
> %s\n", err && err->message ? err->message : "Unknown error"); } } 
> }
> 
> .... virSetErrorFunc(NULL, libvirt_error_handler);  
> libvirt_connection = virConnectOpen("qemu:///system"); 
> if(libvirt_connection == NULL) { std::cout<<"failed to connect to
> qemu:///system\n"; return -1; } std::cout<<"connected to
> qemu:///system\n";
> 
> if (virEventRegisterDefaultImpl() < 0) { virErrorPtr err =
> virGetLastError(); fprintf(stderr, "Failed to register event
> implementation: %s\n", err && err->message ? err->message: "Unknown
> error"); return -1; } { int callback =
> virConnectDomainEventRegisterAny(libvirt_connection, NULL,
> VIR_DOMAIN_EVENT_ID_LIFECYCLE, 
> VIR_DOMAIN_EVENT_CALLBACK(domain_event_handler), NULL, NULL); 
> if(callback == -1) { std::cout<<"Error: failed to register domain
> event handle callback\n"; return -1; } }
> 
>  boost::thread(boost::bind(&libvirt_eventloop_thr_func)); ....
> 
> 
> am i doing something wrong here ?
> 
> _______________________________________________ libvirt-users
> mailing list libvirt-users at redhat.com 
> https://www.redhat.com/mailman/listinfo/libvirt-users
> 

also i have started
libvirt/libvirt-1.1.1/examples/domain-events/events-c example, and it
have same problems as my code, it does not receiving any events from
virt-manager
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.21 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJSFo6uAAoJEH3ap8veG8EHYO8H/3uFilTQAKz0xg4oTfKcfZMP
spdx10L3yAWCoL4GYjHtZD1mPNHtJo2MgUX5PrwEEnu+npF8a3yYqTGF6DZcNSdu
aurO3T5/Wljg5E1d0TuN3W7J/Xmb4U0sRW7HqtTsb6lAKGn9gRWFWmrj+FH+KSbb
D+CL4sKCqeYuiFnYbF4X3w0m9oXzsN36hZ1ALKhlL6/n93GeOyp32nx+NRaZchgz
/QiZEAyUwQL3AK37a8Mw8uNshuvQc+Gw5tnghLIeQivUTsHGPiUyPAqbW0b+aAfd
JLfJ7esOXsaOl916AFl68GBXzEH89y0b8RPNe4vS3VCOjp8UrXJGMju6YVMFVoM=
=KfMJ
-----END PGP SIGNATURE-----




More information about the libvirt-users mailing list