2010/11/24 Paweł Krześniak <[email protected]>:
> On Tue, Nov 23, 2010 at 14:28, Chris Lalancette <[email protected]> wrote:
>> In terms of making this automatically happen during connection closing, I'm
>> not entirely sure what we can (and should) do. I guess we could keep some
>> sort
>> of list of objects that "depend" on this connection object, and then during
>> connection close free them all up. Does anyone know how the python bindings
>> handle this?
>
> python bindings work more or less the same way (see attachment).
>
> So conclusion is, that all objects must be free() before closing connection.
> It's not so intuitive, so maybe info about that should be somewhere in docs?
>
Actually it is supposed to work correctly as long as you match every
virConnectOpen* call with a virConnectFree call and each call that
returns a virDomainPtr, virStorageVolPtr etc with the corresponding
free call. It should not matter in which order you call the close/free
functions, the internal refcounting should make it work.
Obviously the order seems to matter regarding the output of "netstat
-na | grep -v LISTENING | grep -c libvirt-sock". The problem is not in
the Python or Ruby bindings as I can reproduce it using the C API
(current git version). This might indicate a problem in libvirt.
I attached the test program. With NORMAL_ORDER = 1 the initial value
stays the same, with NORMAL_ORDER = 0 it grows by 1 per iteration.
Matthias
#include <stdio.h>
#include <stdlib.h>
#include <libvirt/libvirt.h>
#define NORMAL_ORDER 1
int main(void)
{
int ret, i;
for (i = 0; i < 2; ++i) {
printf("initial:\n");
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
virConnectPtr conn = virConnectOpen("qemu:///system");
printf("after virConnectOpen -> conn=%p:\n", conn);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
virDomainPtr domain = virDomainLookupByName(conn, "esxi4");
printf("after virDomainLookupByName -> domain=%p:\n", domain);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
#if NORMAL_ORDER
ret = virDomainFree(domain);
printf("after virDomainFree -> ret=%d:\n", ret);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
ret = virConnectClose(conn);
printf("after virConnectClose -> ret=%d:\n", ret);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
#else
ret = virConnectClose(conn);
printf("after virConnectClose -> ret=%d:\n", ret);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
ret = virDomainFree(domain);
printf("after virDomainFree -> ret=%d:\n", ret);
system("netstat -na | grep -v LISTENING | grep -c libvirt-sock");
#endif
}
return 0;
}
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list