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

Reply via email to