Please ignore my questions below. I have found the cause of the memory
leak.
Thanks.
Regards,
Michael
__________________
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.
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.
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.