[libvirt-users] virConnectDomainEventRegisterAny problem

Alexandr sss at sss.chaoslab.ru
Thu Aug 22 21:51:32 UTC 2013


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

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 ?
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.21 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJSFofkAAoJEH3ap8veG8EHFowH/ipkeTcQZeX6MMaYVazm4kQL
IUsnhTuQt/OIVCD7LU3g27ii4T4Y4YeXuMI9p5DrqEjL9TE6jS2ZlZXE29ji48xJ
PMpTERz78R/bs0lcffk2pO1MuH8nMDpNT7HI1zdaYZ9vRP9IS4ksGWvw3Jif4lXw
o/pLpCTPGQkWJO3ppKo4EVvJbaGi/YyuepOBPFWC2YYD+5zRfFhxZVbfAG1TdilN
jMqfrqObeVKIOyCnikGCIwU7XTLY3beTf3g9cgX+Lq03GvS8OpjHDIkd90qX5MNs
yt0cJCKX8S4OBv1xsYelXrGulC57YqiQek6o8pQV4qFv2yp8FgRVb4GBNNKsFAE=
=5vgP
-----END PGP SIGNATURE-----




More information about the libvirt-users mailing list