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 > dbi-announce@perl.org > 03/14/2005 12:24 cc > PM dbi-users@perl.org > 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], perl-qa@perl.org