On Tue, Apr 14, 2009 at 03:56:28PM +0200, Radek Hladik wrote:
So one thing is that every memory allocated by libvirt (using
malloc())
I need to copy to memory allocated using emalloc(). Also every memory,
that would be free()ed by libvirt I need to malloc() and copy from
emmaloc()ed memory. The first one is done by simple macro:
#define RECREATE_STRING_WITH_E(str_out, str_in) \
str_out = estrndup(str_in, strlen(str_in)); \
free(str_in);
Yeah, that's painful, but there is no good workaround. Trying to
export an api to register new memory allocation routines for the
library is usually unpractical because it becomes a global library
setting. At least in the libxml2 case where I added that's why it's
actually hard to use in practice except very controlled environments.
The second case I encountered only on authentication callback and I
use
simple strndup() to copy it for libvirt.
When running from command line everything seems to work fine. This is of
course singlethreaded and potential resource leaks need not to cause a
problem. However when running from webserver, the result is much more
interesting. When connecting to qemu:///system (via local socket) using
<?
libvirt_connect($uri,true);
?>
I can crash the libvirt daemon after cca 10 page reloads - sometimes
with message
Apr 13 15:32:44 kvmtest kernel: libvirtd[8263]: segfault at 4 ip
00000039d7223fc0 sp 00007fa6fbc29a88 error 6 in
libdbus-1.so.3.4.0[39d7200000+3c000]
in system log, sometimes without any message.
(When running the same script from command line it worked for 1000
executions without noticing a problem).
When connecting to qemu+tcp:///system using credentials (explained later):
<?
libvirt_connect($uri,true,Array(VIR_CRED_AUTHNAME=>"fred",VIR_CRED_PASSPHRASE=>"fred"));
?>
It works but httpd processes open a lot pipes and after a few hours with
page refreshing every 10 sec I even ran into error:
[Mon Apr 13 02:40:26 2009] [error] [client 10.38.25.152] PHP Warning:
libvirt_connect() unable to make pipe: Too many open files
[...]
libvirt-0.6.0-2.fc11.x86_64
Don't look further, you need 0.6.2 for this kind of things to not
crash and burn on any serious reggression tests. forget about 0.6.0 !
Next issue I am not sure about is callbacks. I need them mainly for
authentication. As PHP is intended to run the whole script
non-interactively at most times, I've created this solution. When
calling the libvirt_connect() PHP function you can provide list of
credentials in form of an array
Array(VIR_CRED_AUTHNAME=>"fred",VIR_CRED_PASSPHRASE=>"fred").
This PHP
array is parsed to C array and this prepopulated array is passed to my
authentication callback function. That function receives the requested
credential, looks it up in the provided array and returns it. I think
this suits more the PHP nature but in future I may provide real callback
solution.
Little trouble is that libvirt free()s the values returned by callback
so I need to copy them to malloc()ed memory.
I am not sure about multithread safety of callback functions but I think
that if the function only obtains the parameters via cbdata and operates
only with them then it should be safe. However sometimes I get error:
[Mon Apr 13 14:19:48 2009] [error] [client 10.38.25.152] PHP Warning:
libvirt_connect(): Failed to collect auth credentials
and I need to restart http daemon for a few times to make it work again.
No idea here, danpb might know more about this.
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/