Re: Memory leak in DBI ?

"H.Merijn Brand" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
On Thu, 10 Apr 2008 13:00:09 +0200, "Philippe Bruhat (BooK)"
<[email protected]> wrote:

> Hi,
> 
> While looking for memory leaks in our code using Devel::Leak, we
> pinpointed one of them to a call to selectcol_arrayref().

There was also a leak in Text::CSV_XS, which was fixed in version 0.37
I'm not sure - but I think so - if DBD::CSV uses Text::CSV_XS

> The attached script tries several DBI commands on various DBD drivers
> (it's easy to add one, or to add code to be tested for leakage), and
> reports how much leakage Devel::Leak caught.
> 
> Just to be sure that we're not mistaking for a leak some Perl/DBI internal
> structures that are initialized the first time the code is called,
> we run every command twice, and only look for leakage the second time.
> 
> It is very possible that the test script takes something expected for
> a memory leak, but I've tried to make it only report valid leaks. (try
> removing the first eval $cmd from the test script to see the difference)
> 
> Devel::Leak is *very* verbose (even more with a Perl compiled for
> debugging), so if you're only interested in the results, run:
> 
>     perl dbi_leak.t 2>&1 | grep ok
> 
> Here, with Perl 5.8.8, DBI 1.602, DBD::CSV 0.22, DBD::SQLite 1.14,
> DBD::mysql 4.006, I get the following results:
> 
>     ok 1 - leak = 0 for csv     my $sanity = 1;
>     not ok 2 - leak = 9 for csv     my $s = $dbh->prepare( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     not ok 3 - leak = 1 for csv     my $s = $dbh->prepare_cached( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     not ok 4 - leak = 2 for csv     my $c = $dbh->selectcol_arrayref( $sql, { Column => [1] } )
>     not ok 5 - leak = 2 for csv     my @a = $dbh->selectrow_array( $sql )
>     not ok 6 - leak = 2 for csv     my $a = $dbh->selectrow_arrayref( $sql )
>     ok 7 - leak = 0 for mysql   my $sanity = 1;
>     not ok 8 - leak = 1 for mysql   my $s = $dbh->prepare( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     ok 9 - leak = 0 for mysql   my $s = $dbh->prepare_cached( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     not ok 10 - leak = 1 for mysql   my $c = $dbh->selectcol_arrayref( $sql, { Column => [1] } )
>     not ok 11 - leak = 1 for mysql   my @a = $dbh->selectrow_array( $sql )
>     not ok 12 - leak = 1 for mysql   my $a = $dbh->selectrow_arrayref( $sql )
>     ok 13 - leak = 0 for sqlite  my $sanity = 1;
>     not ok 14 - leak = 1 for sqlite  my $s = $dbh->prepare( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     ok 15 - leak = 0 for sqlite  my $s = $dbh->prepare_cached( $sql ); $s->execute(); 1 while $s->fetchrow_arrayref(); $s->finish;
>     not ok 16 - leak = 1 for sqlite  my $c = $dbh->selectcol_arrayref( $sql, { Column => [1] } )
>     not ok 17 - leak = 1 for sqlite  my @a = $dbh->selectrow_array( $sql )
>     not ok 18 - leak = 1 for sqlite  my $a = $dbh->selectrow_arrayref( $sql )
>     # Looks like you failed 13 tests of 18.
> 
> I've been told that it also leaks on 5.10.0.

-- 
H.Merijn Brand         Amsterdam Perl Mongers (http://amsterdam.pm.org/)
using & porting perl 5.6.2, 5.8.x, 5.10.x  on HP-UX 10.20, 11.00, 11.11,
& 11.23, SuSE 10.1 & 10.2, AIX 5.2, and Cygwin.       http://qa.perl.org
http://mirrors.develooper.com/hpux/            http://www.test-smoke.org
                        http://www.goldmark.org/jeff/stupid-disclaimers/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.