[Libguestfs] virt-v2v valgrind errors in libosinfo

Richard W.M. Jones rjones at redhat.com
Wed Apr 15 17:31:02 UTC 2020


On Tue, Apr 14, 2020 at 05:42:13PM +0200, Pino Toscano wrote:
> On Tuesday, 14 April 2020 15:16:49 CEST Richard W.M. Jones wrote:
> > On Tue, Apr 14, 2020 at 12:37:07PM +0200, Pino Toscano wrote:
> > > > Unfortunately we never free the database.
> > > 
> > > Hm it is never freed? Wouldn't that result in actual leaks, since
> > > OsinfoDb_t_finalize (g_object_unref'ing the OsinfoDb) wouldn't be
> > > called?
> > 
> > I was thinking because of this:
> > 
> > https://github.com/libguestfs/virt-v2v/blob/cc294b7735dda467179b93a061d3631ac3547f26/v2v/libosinfo_utils.ml#L24
> > 
> > which IIUC will allocate a DB (on first access) but it is never
> > released.
> 
> Oh this is interesting. I read in the documentation that custom blocks
> have tag Custom_tag, which is higher than No_scan_tag, and thus they
> aren't scanned by the GC. Indeed, even trying to Gc.finalize on the
> object inside the lazy seems to have no effect.

So this is correct about custom blocks, but you can still attach a
C finalizer and it will run if the object is finalized.  However the
problem is this object cannot be finalized because of (as you say
below) db being a top-level entry.

As an aside, C-level finalizers and Gc.finalize work quite a bit
differently (I didn't check, but I believe they must use different
paths in the garbage collector).

> I guess this is becase db is a top-level variable in Libosinfo_utils;
> is there a way to change that behaviour somehow?

I can't think of a way to make that happen, and to have the db being
created at most once in the program (which is what you're achieving
with the top level / lazy construction).  I added a suppression for
the db already:

https://github.com/libguestfs/virt-v2v/commit/8e870da79b5a61513f568b0b81c773084b8d7997

> > > > It could be that to express
> > > > this properly we'd need to expose (db, os) tuples to the OCaml garbage
> > > > collector.
> > > 
> > > I thought about this, and according to knowledge this would be needed
> > > only if we want osinfo_os objects alive even when the osinfo_db gets
> > > "out of scope". Considering that the osinfo_db is kept basically
> > > statically this should be fine.
> > 
> > Right.
> > 
> > I don't believe the current code is wrong, my concern is more about
> > clearing up valgrind errors before the release.
> 
> Yup, it makes sense to do that.

I'll add further suppressions for the other valgrind errors.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html




More information about the Libguestfs mailing list