[Libvir] Remote daemon & virDomainFree interaction

Daniel P. Berrange berrange at redhat.com
Tue Jul 24 13:22:58 UTC 2007


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  -=| 




More information about the libvir-list mailing list