On Tue, Jul 24, 2007 at 03:29:40AM -0400, Daniel Veillard wrote: > On Tue, Jul 24, 2007 at 03:41:32AM +0100, Daniel P. Berrange wrote: > > On Tue, Jul 24, 2007 at 02:38:40AM +0100, Daniel P. Berrange wrote: > > > In looking at a problem with domain object cleanup in virt-manager I came > > > across a problem in the remote driver, well the internal driver API itself > > > actually. Specifically the implmenetation of virDomainFree() never calls > > > into the driver API - it simply uses virFreeDomain() release the memory > > > associated with the virDomainPtr object. > > > > > > Couple this with the remote driver though, and virDomainPtr objects in the > > > remote daemon never get released, because the virDomainFree call is never > > > propagated over the wire to the server. > > > > > > Its quite easy to see this in practice. Simply add a printf to the impl > > > of virDomainLookupByName which prints out the ref count. Then run either > > > virsh or virt-manager for a while > > > > > > Get info QEMUGuest1 69 c7a5fdbd-edaf-9455-926a-d65c16db1809 > > > Get info QEMUGuest1 70 c7a5fdbd-edaf-9455-926a-d65c16db1809 > > > Get info QEMUGuest1 71 c7a5fdbd-edaf-9455-926a-d65c16db1809 > > > > > > We need to make virDomainFree call into the driver API, and also make sure > > > that the remote driver implements it. > > > > Actually I was wrong in this. It is not just that the virDomainLookupByName > > which cause virDomainPtr objects to be allocated. Every single API call into > > the daemon which uses get_nonnull_domain() causes a virDomainPtr object > > to have its ref count increased. So we don't want to pass the virDomainFree > > API through the driver API at all. > > > > Instead in the server side of the remote driver, any API call which returns > > a virDomainPtr *and* any call which accepts a virDomainPtr needs to have a > > corresponding call to virDomainFree to reduce the ref-count in all of its > > exit paths. The same goes for virNetwork objects & its calls. > > > > I'm attaching a patch which I believe hits all the neccessary codepaths. > > With a few prints in virGetDomain, I can see the refcount correctly being > > incremented & decremented per API call, rather than growing without bound. > > Dohh, giant memory leak ! Good catch ! It is not a permanent leak - when the virConnectPtr object is free'd the virDomainPtr objects are all freed too. Fortunately the virConnectPtr is free'd whenever the client disconnects. It causes problems if a single client creates a VM, destroys it and creates another with the same name though, because you get different UUID. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list