On Fri, 15 Apr 2005 12:54:48 -0400, DB2PERL <[EMAIL PROTECTED]> wrote:
> Hi,
>
> Using Perl 5.8.1 DBI 1.48 and DBD-DB2 0.78 on Linux, I'm seeing a memory
> leak looping through $sth->{NAME_lc}.
> The repro script and trace is below. Note that looping through the
> $dbh->prepare does not leak.
It might very well be due to the rather old version of perl-5.8
The current version of perl-5.8 is 5.8.6
grepping the delta's shows three:
pod/perl582delta.pod:Several memory leaks associated with variables shared
between threads
pod/perl586delta.pod:Using C<delete> on an array no longer leaks memory. A
C<pop> of an item from a
pod/perl586delta.pod:shared array reference no longer causes a leak.
grepping the changes:
Changes5.8.2: is called. Also, avoid posible memory leaks by
wrapping all shared
Changes5.8.2: Fix more shared threads leaks: add SAVETMPS to the
second branch
Changes5.8.3: Log: Revert 21936 (which solves leaks with threads and
weak references)
Changes5.8.3: plumb a leak with pos().
Changes5.8.3: yet another 2 leaks. example for the second:
Changes5.8.3: yet another leak. bigger fish still swimming around.
Changes5.8.3: #21866 was wrong. another try to plumb that damn leak.
Changes5.8.4: [perl #27206] Memory leak in continue loop
Changes5.8.4: deleting keys in restricted hashes was leaking the
entry. Yow!
Changes5.8.4: It's better to localize *_ than $_, to avoid magic
leakage
Changes5.8.4: [perl #26959] fix memory leak in @_ = ...; goto &sub
Changes5.8.4: SVs. This causes those XSUBs to leak memory and
cannot be fixed
Changes5.8.4: 2. Fix a memory leak of that kind in POSIX::localconv.
Changes5.8.4: Remove small memory leak in newATTRSUB that
manifested as a
Changes5.8.4: leaking scalar after the interpeter was cloned
Changes5.8.4: add test for change 22209 (Remove small memory leak
in newATTRSUB)
Changes5.8.5: [perl #30509] use encoding and "eq" cause memory leak
Changes5.8.5: Subject: [patch] Windows/Win32 thread handle leak
with threads join
Changes5.8.6: The FETCH code for shared aggregate elements could
leak a shared RV
Changes5.8.6: Change 22373 to stop a memory leak in goto &foo
intead caused
Changes5.8.6: include flags and refcount in the list of leaked
scalars
Changes5.8.6: [perl #30066] Memory leak in nested shared data
structures in 5.8.4
Changes5.8.6: A pop of an item from a shared array ref causes a
leak due to
Changes5.8.6: [perl #30733] memory leak in array delete
> Has someone else seen this before? or know where I can start looking?
> This looks like a leak in DBI since the DBD-DB2 does not touch the NAME_lc
> attribute.
Would you be able to check with perl-5.8.6 + DBI-1.48?
> Any suggestion/comment/help would be greatly appreciated!
> Thanks
>
>
> Repro script:
>
> use DBI;
> $tracelevel=9;
> $trace_filename="Trace.out";
> DBI->trace($tracelevel, $trace_filename);
>
> my $dbh = DBI->connect( 'dbi:DB2:sample', '', '' ) || die "Unable to
> connect: $DBI::errstr\n";
> while( 1 )
> {
> my $sth = $dbh->prepare("SELECT procname FROM syscat.procedures");
> my $x = $sth->{NAME_lc};
> print ".";
> }
>
>
> $uname -a
> Linux cox32.torolab.ibm.com 2.4.21-20.EL #1 Wed Aug 18 20:58:25 EDT 2004
> i686 i686 i386 GNU/Linux
> (Perl 5.8, DBI 1.48, DBD-DB2 0.78 )
>
>
> The Trace.out:
>
> DBI 1.48-ithread default trace level set to 0x0/9 (pid 30282)
> Note: perl is running without the recommended perl -w option
> -> DBI->connect(dbi:DB2:sample, , ****)
> -> DBI->install_driver(DB2) for linux perl=5.008 pid=30282 ruid=7839
> euid=7839
> install_driver: DBD::DB2 version 0.78 loaded from
> /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/DB2.pm
> New DBI::dr (for DBD::DB2::dr, parent=, id=)
> dbih_setup_handle(DBI::dr=HASH(0x99c8c4c)=>DBI::dr=HASH(0x9a6f8a0),
> DBD::DB2::dr, 0, Null!)
> dbih_make_com(Null!, 0, DBD::DB2::dr, 96, 0) thr#98bd008
> dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), Err, Null!)
> SCALAR(0x9babcac) (already defined)
> dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), State, Null!)
> SCALAR(0x9a64740) (already defined)
> dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), Errstr, Null!)
> SCALAR(0x9a58e8c) (already defined)
> dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), TraceLevel, Null!) 0
> (already defined)
> dbih_setup_attrib(DBI::dr=HASH(0x9a6f8a0), FetchHashKeyName, Null!)
> 'NAME' (already defined)
> <- install_driver= DBI::dr=HASH(0x99c8c4c)
> >> connect DISPATCH (DBI::dr=HASH(0x99c8c4c) rc2/3 @5 g0 ima1
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 598
> !! warn: 0 CLEARED by call to connect method
> -> connect for DBD::DB2::dr (DBI::dr=HASH(0x99c8c4c)~0x9a6f8a0 'sample'
> '' **** HASH(0x9a707e0)) thr#98bd008
> New DBI::db (for DBD::DB2::db, parent=DBI::dr=HASH(0x9a6f8a0), id=)
> dbih_setup_handle(DBI::db=HASH(0x9a6f864)=>DBI::db=HASH(0x9a70858),
> DBD::DB2::db, 99c89a0, Null!)
> dbih_make_com(DBI::dr=HASH(0x9a6f8a0), 9a58e00, DBD::DB2::db, 104, 0)
> thr#98bd008
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), Err,
> DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced30) (already defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), State,
> DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced90) (already defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), Errstr,
> DBI::dr=HASH(0x9a6f8a0)) SCALAR(0x99ced60) (already defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), TraceLevel,
> DBI::dr=HASH(0x9a6f8a0)) 0 (already defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), FetchHashKeyName,
> DBI::dr=HASH(0x9a6f8a0)) 'NAME' (already defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), HandleSetErr,
> DBI::dr=HASH(0x9a6f8a0)) undef (not defined)
> dbih_setup_attrib(DBI::db=HASH(0x9a70858), HandleError,
> DBI::dr=HASH(0x9a6f8a0)) undef (not defined)
> connect 'sample', '', '' <- connect= DBI::db=HASH(0x9a6f864) at
> /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm line 598
> >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 645
> -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'PrintError'
> 1) thr#98bd008
> STORE DBI::db=HASH(0x9a70858) 'PrintError' => 1
> <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0
> /i386-linux-thread-multi/DBI.pm line 645
> >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 645
> -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'AutoCommit'
> 1) thr#98bd008
> <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0
> /i386-linux-thread-multi/DBI.pm line 645
> >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 648 via repro.pl line 10
> -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER 'Username' '')
> thr#98bd008
> STORE DBI::db=HASH(0x9a70858) 'Username' => ''
> <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0
> /i386-linux-thread-multi/DBI.pm line 648 via repro.pl line 10
> >> FETCH DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @2 g0 ima404
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 648
> <> FETCH= '' ('Username' from cache) at /usr/lib/perl5/site_perl/5.8.0
> /i386-linux-thread-multi/DBI.pm line 648
> <- connect= DBI::db=HASH(0x9a6f864)
> >> STORE DISPATCH (DBI::db=HASH(0x9a70858) rc2/1 @3 g0 ima41c
> pid#30282) at /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBI.pm
> line 668 via repro.pl line 10
> -> STORE for DBD::DB2::db (DBI::db=HASH(0x9a70858)~INNER
> 'dbi_connect_closure' CODE(0x9a6f7b0)) thr#98bd008
> STORE DBI::db=HASH(0x9a70858) 'dbi_connect_closure' => CODE(0x9a6f7b0)
> <- STORE= 1 at /usr/lib/perl5/site_perl/5.8.0
> /i386-linux-thread-multi/DBI.pm line 668 via repro.pl line 10
> >> prepare DISPATCH (DBI::db=HASH(0x9a6f864) rc1/1 @2 g0 ima2201
> pid#30282) at repro.pl line 14
> -> prepare for DBD::DB2::db (DBI::db=HASH(0x9a6f864)~0x9a70858 'SELECT
> procname FROM syscat.procedures') thr#98bd008
> New DBI::st (for DBD::DB2::st, parent=DBI::db=HASH(0x9a70858), id=)
> dbih_setup_handle(DBI::st=HASH(0x9a708dc)=>DBI::st=HASH(0x9a708d0),
> DBD::DB2::st, 9a708e8, Null!)
> dbih_make_com(DBI::db=HASH(0x9a70858), 9978b28, DBD::DB2::st, 160, 0)
> thr#98bd008
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), Err,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced30) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), State,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced90) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), Errstr,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced60) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), TraceLevel,
> DBI::db=HASH(0x9a70858)) 0 (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), FetchHashKeyName,
> DBI::db=HASH(0x9a70858)) 'NAME' (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), HandleSetErr,
> DBI::db=HASH(0x9a70858)) undef (not defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a708d0), HandleError,
> DBI::db=HASH(0x9a70858)) undef (not defined)
> dbd_st_prepare'd sql f65537
> SELECT procname FROM syscat.procedures
> fbh 0: 'PROCNAME' , type 12, 128, dsize 128, p0 s4335563
> out: ftype 1, indp 0, bufl 129, rlen 129
> <- prepare= DBI::st=HASH(0x9a708dc) at repro.pl line 14
> >> FETCH DISPATCH (DBI::st=HASH(0x9a708d0) rc2/1 @2 g0 ima404
> pid#30282) at repro.pl line 15
> -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER 'NAME_lc')
> thr#98bd008
> >> FETCH DISPATCH (DBI::st=HASH(0x9a708d0) rc3/1 @2 g0 ima404
> pid#30282) at repro.pl line 15
> 1 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER 'NAME')
> thr#98bd008
> 1 <- FETCH= [ 'PROCNAME' ] at repro.pl line 15
> .. FETCH DBI::st=HASH(0x9a708d0) 'NAME_lc' = ARRAY(0x9a70a38) (cached)
> <- FETCH= [ 'procname' ] at repro.pl line 15
> >> DESTROY DISPATCH (DBI::st=HASH(0x9a708dc) rc1/1 @1 g0 ima4
> pid#30282) at repro.pl line 16
> <> DESTROY(DBI::st=HASH(0x9a708dc)) ignored for outer handle (inner
> DBI::st=HASH(0x9a708d0) has ref cnt 1)
> >> DESTROY DISPATCH (DBI::st=HASH(0x9a708d0) rc1/1 @1 g0 ima4
> pid#30282) at repro.pl line 16
> -> DESTROY for DBD::DB2::st (DBI::st=HASH(0x9a708d0)~INNER) thr#98bd008
> <- DESTROY= undef at repro.pl line 16
> DESTROY (dbih_clearcom) (sth 0x9a708dc, com 0x9a36b90, imp
> DBD::DB2::st):
> FLAGS 0x111: COMSET Warn PrintError
> PARENT DBI::db=HASH(0x9a70858)
> KIDS 0 (0 Active)
> IMP_DATA undef
> LongReadLen 32700
> NUM_OF_FIELDS 1
> NUM_OF_PARAMS 0
> dbih_clearcom 0x9a708dc (com 0x9a36b90, type 3) done.
>
> >> prepare DISPATCH (DBI::db=HASH(0x9a6f864) rc1/1 @2 g0 ima2201
> pid#30282) at repro.pl line 14
> -> prepare for DBD::DB2::db (DBI::db=HASH(0x9a6f864)~0x9a70858 'SELECT
> procname FROM syscat.procedures') thr#98bd008
> New DBI::st (for DBD::DB2::st, parent=DBI::db=HASH(0x9a70858), id=)
> dbih_setup_handle(DBI::st=HASH(0x9a70984)=>DBI::st=HASH(0x9a70aa4),
> DBD::DB2::st, 9a7099c, Null!)
> dbih_make_com(DBI::db=HASH(0x9a70858), 9978b28, DBD::DB2::st, 160, 0)
> thr#98bd008
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), Err,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced30) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), State,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced90) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), Errstr,
> DBI::db=HASH(0x9a70858)) SCALAR(0x99ced60) (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), TraceLevel,
> DBI::db=HASH(0x9a70858)) 0 (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), FetchHashKeyName,
> DBI::db=HASH(0x9a70858)) 'NAME' (already defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), HandleSetErr,
> DBI::db=HASH(0x9a70858)) undef (not defined)
> dbih_setup_attrib(DBI::st=HASH(0x9a70aa4), HandleError,
> DBI::db=HASH(0x9a70858)) undef (not defined)
> dbd_st_prepare'd sql f65537
> SELECT procname FROM syscat.procedures
> fbh 0: 'PROCNAME' , type 12, 128, dsize 128, p0 s4335563
> out: ftype 1, indp 0, bufl 129, rlen 129
> <- prepare= DBI::st=HASH(0x9a70984) at repro.pl line 14
> >> FETCH DISPATCH (DBI::st=HASH(0x9a70aa4) rc2/1 @2 g0 ima404
> pid#30282) at repro.pl line 15
> -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER 'NAME_lc')
> thr#98bd008
> >> FETCH DISPATCH (DBI::st=HASH(0x9a70aa4) rc3/1 @2 g0 ima404
> pid#30282) at repro.pl line 15
> 1 -> FETCH for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER 'NAME')
> thr#98bd008
> 1 <- FETCH= [ 'PROCNAME' ] at repro.pl line 15
> .. FETCH DBI::st=HASH(0x9a70aa4) 'NAME_lc' = ARRAY(0x9a708e8) (cached)
> <- FETCH= [ 'procname' ] at repro.pl line 15
> >> DESTROY DISPATCH (DBI::st=HASH(0x9a70984) rc1/1 @1 g0 ima4
> pid#30282) at repro.pl line 16
> <> DESTROY(DBI::st=HASH(0x9a70984)) ignored for outer handle (inner
> DBI::st=HASH(0x9a70aa4) has ref cnt 1)
> >> DESTROY DISPATCH (DBI::st=HASH(0x9a70aa4) rc1/1 @1 g0 ima4
> pid#30282) at repro.pl line 16
> -> DESTROY for DBD::DB2::st (DBI::st=HASH(0x9a70aa4)~INNER) thr#98bd008
> <- DESTROY= undef at repro.pl line 16
> DESTROY (dbih_clearcom) (sth 0x9a70984, com 0x9a70490, imp
> DBD::DB2::st):
> FLAGS 0x111: COMSET Warn PrintError
> PARENT DBI::db=HASH(0x9a70858)
> KIDS 0 (0 Active)
> IMP_DATA undef
> LongReadLen 32700
> NUM_OF_FIELDS 1
> NUM_OF_PARAMS 0
> dbih_clearcom 0x9a70984 (com 0x9a70490, type 3) done.
>
>
> ... then repeats back to line beginning with >> prepare
>
>
>
> Regards,
> Michael
>
>
>
>
> Tim Bunce
> <[EMAIL PROTECTED]
> com> To
> [email protected]
> 03/14/2005 12:24 cc
> PM [email protected]
> Subject
> ANNOUNCE DBI 1.48
> Please respond to
> dbi-users
>
>
>
>
>
>
>
>
> file: $CPAN/authors/id/T/TI/TIMB/DBI-1.48.tar.gz
> size: 378698 bytes
> md5: 87396e1a9c06d1190f1ca70e1da1163e
>
> =head2 Changes in DBI 1.48 (svn rev 928), 14th March 2005
>
> Fixed DBI::DBD::Metadata generation of type_info_all thanks to Steffen
> Goeldner
> (driver authors who have used it should rerun it).
>
> Updated docs for NULL Value placeholders thanks to Brian Campbell.
>
> Added multi-keyfield nested hash fetching to fetchall_hashref()
> thanks to Zhuang (John) Li for polishing up my draft.
> Added registered driver prefixes: amzn_ for DBD::Amazon and yaswi_ for
> DBD::Yaswi.
>
> =cut
>
> Enjoy!
>
> Tim.
>
>
--
H.Merijn Brand Amsterdam Perl Mongers (http://amsterdam.pm.org/)
using Perl 5.6.2, 5.8.0, 5.8.5, & 5.9.2 on HP-UX 10.20, 11.00 & 11.11,
AIX 4.3 & 5.2, SuSE 9.1 & 9.2, and Cygwin. http://www.cmve.net/~merijn
Smoking perl: http://www.test-smoke.org, perl QA: http://qa.perl.org
reports to: [EMAIL PROTECTED], [email protected]