On 07/23/2013 12:45 PM, Eric Blake wrote:
On 07/23/2013 09:59 AM, John Ferlan wrote:
> Update based on recent run/failures seen
> ---
> tests/.valgrind.supp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 60 insertions(+)
>
> diff --git a/tests/.valgrind.supp b/tests/.valgrind.supp
> index 10cc3c0..f04912d 100644
> --- a/tests/.valgrind.supp
> +++ b/tests/.valgrind.supp
> @@ -75,3 +75,63 @@
> ...
> obj:*/lib*/libc-2.*so*
> }
> +#
> +# commandtest validates the various threaded commands. The
> +# virThreadCreate() routine allocates and passes args to the
> +# new thread which now owns the 'args' and thus cannot be free'd
> +#
> +{
> + commandtestLeak1
> + Memcheck:Leak
> + fun:calloc
> + fun:virAlloc
> + fun:virThreadCreate
> + fun:mymain
> + fun:virtTestMain
Can't we call VIR_FREE(args) in the forked process? Or is this one of
those inconsequential leaks right before we exec in the child process?
We do call VIR_FREE() in virThreadHelper() from the pthread_create().
> +}
> +#
> +# The Error code requires static memory that is never free'd
> +# for thread local storage to store error message/data
> +#
> +{
> + commandtestLeak2
> + Memcheck:Leak
> + fun:calloc
> + fun:virAlloc
> + ...
> + fun:vir*LastError*
> + fun:virEventRunDefaultImpl
> + fun:virCommandThreadWorker
> + fun:virThreadHelper
> + fun:start_thread
> + fun:clone
I thought we had the ability to wire up destructors for thread local
storage, that gets called when the thread completes?
The LastError code does wire up the destructor from how I read it.
It's very strange - running the same ranges of tests two times in a row
had different results... That is, if I did "make -C tests valgrind
TESTS=commandtest VIR_TEST_RANGE=1-4" two times in a row - one time I'd
get 1 set of tracebacks and the next time I get 2. If I run just one
test (1-1), I get none. I'm not sure I completely understand why
At any rate, since all of these suppressions are solely for test
files,
we aren't masking leaks in libvirtd proper, so if it makes it easier to
spot the introduction of new leaks, I'm okay with this patch as-is.
Strange - I thought commandtestLeak3 was the most odd - only 4 tests
cause issues, but "sometimes" running them singly using VIR_TEST_RANGE
resulted in no leak shown.
I assume the failures were related to perhaps the "timing" or
"synchronization" between determining which thread was doing what and
how quickly or slowly it did it.
I can hold off on patch 3 if that's desired, too.
John