
On Tue, Jan 22, 2013 at 11:31:27AM +0000, Pankaj Rawat wrote:
Hi, I am using libvirt api to create an app, I am facing a problem. I can connect to connection object 20 number of times in programm after that it gives connection object null.
By default libvirtd has a limit of 20 concurrent active connections/
Here is the sample code.
Normally code should run 1000 times but it only runs 20 times Filename: list.cpp
#include<pthread.h> #include<stdlib.h> #include<stdio.h> #include<malloc.h> #include <iostream> #include<string.h> #include <libvirt/libvirt.h> #include <libvirt/virterror.h> static int count; static void customErrorFunc(void *userdata, virErrorPtr err) { }
int main() { virConnectPtr conn;
for ( int i=0; i< 1000;i++) { conn = virConnectOpen("qemu:///system"); if (conn == NULL) { fprintf(stderr, "Failed to open connection to qemu:///system\n"); printf("Failed to open connection to qemu:///system\n"); virConnectClose(conn); return NULL; } printf("Hello %d\n",i); virError err; virSetErrorFunc(NULL, customErrorFunc); int j; int numDomains1,numDomains2,numDomains; int *activeDomains; numDomains1 = virConnectNumOfDomains(conn); activeDomains = (int*)malloc(sizeof(int) * numDomains1); numDomains1 = virConnectListDomains(conn, activeDomains, numDomains1); for (int j = 0 ; j < numDomains1 ; j++) { virDomainPtr dom; dom = virDomainLookupByID(conn,activeDomains[j]); free(dom);
You should be using virDomainFree(dom), not 'free(dom)' The latter is leaking memory & loosing the reference on virConnectPtr causing the connection to be left open. Hence you are hitting the 20 conn limit.
} free(activeDomains); count--; virConnectClose(conn); } }
Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|