Hi,

when trying to pass dbh handle to child after fork I have found that
parent still has opened unix sockets. Very simple program to reproduce
this problem provided.
Program in loop (3 times) opens DBI connection and forks.
Parent set InactiveDestroy before handle destroying.
While program is running I have run lsof (output attached).
You can see following:
        parent have 3 unix socket;
        child 1230 have 1 unix socket;
        child 1232 have 2 unix socket;
        child 1234 have 3 unix socket;
Looks, when perl destroys object, it does not close unix socket.

=============================================
Possible solution
=============================================
when destroying dbi handle DBD::Pg calls PQfinish function.
PQfinish contains two calls:
        closePGconn - sends disconect to backend;
        freePGconn - free resources (close socket as well);

So, in case of InactiveDestroy DBD::Pg have to call freePGconn
in DESTROY and PQfinish otherwise.

=============================================
environment
=============================================
redhat 7.1
linux 2.4.16
DBI 1.20
DBD::Pg 1.01
postgres 7.1.3

Summary of my perl5 (revision 5.0 version 6 subversion 1) configuration:
  Platform:
    osname=linux, osvers=2.4.9, archname=i386-linux
    uname='linux host 2.4.9 #4 smp mon sep 17 20:17:53 eest 2001 i686
unknown '
    config_args='-des -Doptimize=-O2 -march=i386 -mcpu=i686 -Dcc=gcc
-Dcccdlflags=-fPIC -Dinstallprefix=/usr -Dprefix=/usr
-Darchname=i386-linux -Dd_dosuid -Dd_semctl_semun -Ui_db -Ui_ndbm
-Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Uuselargefiles'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef
usemultiplicity=undef
    useperlio=undef d_sfio=undef uselargefiles=undef usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
  Compiler:
    cc='gcc', ccflags ='-fno-strict-aliasing',
    optimize='-O2 -march=i386 -mcpu=i686',
    cppflags='-fno-strict-aliasing'
    ccversion='', gccversion='2.96 20000731 (Red Hat Linux 7.1
2.96-85)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=4
    alignbytes=4, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lc -lcrypt -lutil
    perllibs=-lnsl -ldl -lm -lc -lcrypt -lutil
    libc=/lib/libc-2.2.2.so, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options:
  Built under linux
  Compiled at Sep 18 2001 15:45:22
  %ENV:
    PERL5LIB="/home/andrejs/lib"
  @INC:
    /home/andrejs/lib
    /usr/lib/perl5/5.6.1/i386-linux
    /usr/lib/perl5/5.6.1
    /usr/lib/perl5/site_perl/5.6.1/i386-linux
    /usr/lib/perl5/site_perl/5.6.1
    /usr/lib/perl5/site_perl

=============================================
test program
=============================================
[andrejs@host tmp]$ cat testpg.pl 
#!/usr/bin/perl -w

use DBI ;

$|++ ; # disable stdout buffering

for (1..3) {
  my $dbh = DBI->connect("DBI:Pg:dbname=test", "test", "") or die ;

  if (fork) {
    # parent
    $dbh->{InactiveDestroy} = 1 ;
  } else {
    # child
    print "child $$ going to sleep\n" ;
    sleep 20 ;
    exit ;
  }
}
print "parent $$ going to sleep\n" ;

sleep 20 ;


=============================================
run
=============================================
[andrejs@host tmp]$ ./testpg.pl &          
[1] 1228

[andrejs@host tmp]$ child 1230 going to sleep
child 1232 going to sleep
child 1234 going to sleep
parent 1228 going to sleep

=============================================
lsof
=============================================
[andrejs@host tmp]$ /usr/sbin/lsof | grep ^testpg
testpg.pl  1228  andrejs  cwd    DIR        8,5    4096    16232
/home/andrejs/tmp
testpg.pl  1228  andrejs  rtd    DIR        8,1    4096        2 /
testpg.pl  1228  andrejs  txt    REG        8,1  740284   370595
/usr/bin/perl
testpg.pl  1228  andrejs  mem    REG        8,1  471781   176763
/lib/ld-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1     244   497998
/usr/lib/locale/en_US/LC_IDENTIFICATION
testpg.pl  1228  andrejs  mem    REG        8,1      13   497999
/usr/lib/locale/en_US/LC_MEASUREMENT
testpg.pl  1228  andrejs  mem    REG        8,1      49   498002
/usr/lib/locale/en_US/LC_TELEPHONE
testpg.pl  1228  andrejs  mem    REG        8,1     145   497997
/usr/lib/locale/en_US/LC_ADDRESS
testpg.pl  1228  andrejs  mem    REG        8,1      67   498000
/usr/lib/locale/en_US/LC_NAME
testpg.pl  1228  andrejs  mem    REG        8,1  445289   176781
/lib/libnsl-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1   79024   176776
/lib/libdl-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1  627312   481968
/lib/i686/libm-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1 5634864   481966
/lib/i686/libc-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1   95362   176774
/lib/libcrypt-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1   61451   176816
/lib/libutil-2.2.2.so
testpg.pl  1228  andrejs  mem    REG        8,1      24   498001
/usr/lib/locale/en_US/LC_PAPER
testpg.pl  1228  andrejs  mem    REG        8,1      42    16096
/usr/lib/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
testpg.pl  1228  andrejs  mem    REG        8,1     276    32149
/usr/lib/locale/en_US/LC_MONETARY
testpg.pl  1228  andrejs  mem    REG        8,1   21484   224928
/usr/lib/locale/en_US/LC_COLLATE
testpg.pl  1228  andrejs  mem    REG        8,1    2441   498003
/usr/lib/locale/en_US/LC_TIME
testpg.pl  1228  andrejs  mem    REG        8,1      44   224924
/usr/lib/locale/en_US/LC_NUMERIC
testpg.pl  1228  andrejs  mem    REG        8,1  110304   385570
/usr/lib/locale/en_US/LC_CTYPE
testpg.pl  1228  andrejs  mem    REG        8,1   68999   337730
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBI/DBI.so
testpg.pl  1228  andrejs  mem    REG        8,1   95114    81673
/usr/lib/perl5/5.6.1/i386-linux/auto/POSIX/POSIX.so
testpg.pl  1228  andrejs  mem    REG        8,1   55554   627982
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBD/Pg/Pg.so
testpg.pl  1228  andrejs  mem    REG        8,1   76472   386571
/usr/lib/libpq.so.2.1
testpg.pl  1228  andrejs  mem    REG        8,1  203467   386560
/usr/lib/libssl.so.0.9.6
testpg.pl  1228  andrejs  mem    REG        8,1  872656   386559
/usr/lib/libcrypto.so.0.9.6
testpg.pl  1228  andrejs  mem    REG        8,1  426613   578572
/usr/kerberos/lib/libkrb5.so.3.0
testpg.pl  1228  andrejs  mem    REG        8,1   78257   578570
/usr/kerberos/lib/libk5crypto.so.3.0
testpg.pl  1228  andrejs  mem    REG        8,1    8681   578568
/usr/kerberos/lib/libcom_err.so.3.0
testpg.pl  1228  andrejs  mem    REG        8,1  274054   176810
/lib/libresolv-2.2.2.so
testpg.pl  1228  andrejs    0u   CHR      136,6                8
/dev/pts/6
testpg.pl  1228  andrejs    1u   CHR      136,6                8
/dev/pts/6
testpg.pl  1228  andrejs    2u   CHR      136,6                8
/dev/pts/6
testpg.pl  1228  andrejs    3u  unix 0xc33a2f60         39562840 socket
testpg.pl  1228  andrejs    4u  unix 0xdfa69ae0         39562842 socket
testpg.pl  1228  andrejs    5u  unix 0xc33a28e0         39562844 socket
testpg.pl  1230  andrejs  cwd    DIR        8,5    4096    16232
/home/andrejs/tmp
testpg.pl  1230  andrejs  rtd    DIR        8,1    4096        2 /
testpg.pl  1230  andrejs  txt    REG        8,1  740284   370595
/usr/bin/perl
testpg.pl  1230  andrejs  mem    REG        8,1  471781   176763
/lib/ld-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1     244   497998
/usr/lib/locale/en_US/LC_IDENTIFICATION
testpg.pl  1230  andrejs  mem    REG        8,1      13   497999
/usr/lib/locale/en_US/LC_MEASUREMENT
testpg.pl  1230  andrejs  mem    REG        8,1      49   498002
/usr/lib/locale/en_US/LC_TELEPHONE
testpg.pl  1230  andrejs  mem    REG        8,1     145   497997
/usr/lib/locale/en_US/LC_ADDRESS
testpg.pl  1230  andrejs  mem    REG        8,1      67   498000
/usr/lib/locale/en_US/LC_NAME
testpg.pl  1230  andrejs  mem    REG        8,1  445289   176781
/lib/libnsl-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1   79024   176776
/lib/libdl-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1  627312   481968
/lib/i686/libm-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1 5634864   481966
/lib/i686/libc-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1   95362   176774
/lib/libcrypt-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1   61451   176816
/lib/libutil-2.2.2.so
testpg.pl  1230  andrejs  mem    REG        8,1      24   498001
/usr/lib/locale/en_US/LC_PAPER
testpg.pl  1230  andrejs  mem    REG        8,1      42    16096
/usr/lib/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
testpg.pl  1230  andrejs  mem    REG        8,1     276    32149
/usr/lib/locale/en_US/LC_MONETARY
testpg.pl  1230  andrejs  mem    REG        8,1   21484   224928
/usr/lib/locale/en_US/LC_COLLATE
testpg.pl  1230  andrejs  mem    REG        8,1    2441   498003
/usr/lib/locale/en_US/LC_TIME
testpg.pl  1230  andrejs  mem    REG        8,1      44   224924
/usr/lib/locale/en_US/LC_NUMERIC
testpg.pl  1230  andrejs  mem    REG        8,1  110304   385570
/usr/lib/locale/en_US/LC_CTYPE
testpg.pl  1230  andrejs  mem    REG        8,1   68999   337730
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBI/DBI.so
testpg.pl  1230  andrejs  mem    REG        8,1   95114    81673
/usr/lib/perl5/5.6.1/i386-linux/auto/POSIX/POSIX.so
testpg.pl  1230  andrejs  mem    REG        8,1   55554   627982
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBD/Pg/Pg.so
testpg.pl  1230  andrejs  mem    REG        8,1   76472   386571
/usr/lib/libpq.so.2.1
testpg.pl  1230  andrejs  mem    REG        8,1  203467   386560
/usr/lib/libssl.so.0.9.6
testpg.pl  1230  andrejs  mem    REG        8,1  872656   386559
/usr/lib/libcrypto.so.0.9.6
testpg.pl  1230  andrejs  mem    REG        8,1  426613   578572
/usr/kerberos/lib/libkrb5.so.3.0
testpg.pl  1230  andrejs  mem    REG        8,1   78257   578570
/usr/kerberos/lib/libk5crypto.so.3.0
testpg.pl  1230  andrejs  mem    REG        8,1    8681   578568
/usr/kerberos/lib/libcom_err.so.3.0
testpg.pl  1230  andrejs  mem    REG        8,1  274054   176810
/lib/libresolv-2.2.2.so
testpg.pl  1230  andrejs    0u   CHR      136,6                8
/dev/pts/6
testpg.pl  1230  andrejs    1u   CHR      136,6                8
/dev/pts/6
testpg.pl  1230  andrejs    2u   CHR      136,6                8
/dev/pts/6
testpg.pl  1230  andrejs    3u  unix 0xc33a2f60         39562840 socket
testpg.pl  1232  andrejs  cwd    DIR        8,5    4096    16232
/home/andrejs/tmp
testpg.pl  1232  andrejs  rtd    DIR        8,1    4096        2 /
testpg.pl  1232  andrejs  txt    REG        8,1  740284   370595
/usr/bin/perl
testpg.pl  1232  andrejs  mem    REG        8,1  471781   176763
/lib/ld-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1     244   497998
/usr/lib/locale/en_US/LC_IDENTIFICATION
testpg.pl  1232  andrejs  mem    REG        8,1      13   497999
/usr/lib/locale/en_US/LC_MEASUREMENT
testpg.pl  1232  andrejs  mem    REG        8,1      49   498002
/usr/lib/locale/en_US/LC_TELEPHONE
testpg.pl  1232  andrejs  mem    REG        8,1     145   497997
/usr/lib/locale/en_US/LC_ADDRESS
testpg.pl  1232  andrejs  mem    REG        8,1      67   498000
/usr/lib/locale/en_US/LC_NAME
testpg.pl  1232  andrejs  mem    REG        8,1  445289   176781
/lib/libnsl-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1   79024   176776
/lib/libdl-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1  627312   481968
/lib/i686/libm-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1 5634864   481966
/lib/i686/libc-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1   95362   176774
/lib/libcrypt-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1   61451   176816
/lib/libutil-2.2.2.so
testpg.pl  1232  andrejs  mem    REG        8,1      24   498001
/usr/lib/locale/en_US/LC_PAPER
testpg.pl  1232  andrejs  mem    REG        8,1      42    16096
/usr/lib/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
testpg.pl  1232  andrejs  mem    REG        8,1     276    32149
/usr/lib/locale/en_US/LC_MONETARY
testpg.pl  1232  andrejs  mem    REG        8,1   21484   224928
/usr/lib/locale/en_US/LC_COLLATE
testpg.pl  1232  andrejs  mem    REG        8,1    2441   498003
/usr/lib/locale/en_US/LC_TIME
testpg.pl  1232  andrejs  mem    REG        8,1      44   224924
/usr/lib/locale/en_US/LC_NUMERIC
testpg.pl  1232  andrejs  mem    REG        8,1  110304   385570
/usr/lib/locale/en_US/LC_CTYPE
testpg.pl  1232  andrejs  mem    REG        8,1   68999   337730
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBI/DBI.so
testpg.pl  1232  andrejs  mem    REG        8,1   95114    81673
/usr/lib/perl5/5.6.1/i386-linux/auto/POSIX/POSIX.so
testpg.pl  1232  andrejs  mem    REG        8,1   55554   627982
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBD/Pg/Pg.so
testpg.pl  1232  andrejs  mem    REG        8,1   76472   386571
/usr/lib/libpq.so.2.1
testpg.pl  1232  andrejs  mem    REG        8,1  203467   386560
/usr/lib/libssl.so.0.9.6
testpg.pl  1232  andrejs  mem    REG        8,1  872656   386559
/usr/lib/libcrypto.so.0.9.6
testpg.pl  1232  andrejs  mem    REG        8,1  426613   578572
/usr/kerberos/lib/libkrb5.so.3.0
testpg.pl  1232  andrejs  mem    REG        8,1   78257   578570
/usr/kerberos/lib/libk5crypto.so.3.0
testpg.pl  1232  andrejs  mem    REG        8,1    8681   578568
/usr/kerberos/lib/libcom_err.so.3.0
testpg.pl  1232  andrejs  mem    REG        8,1  274054   176810
/lib/libresolv-2.2.2.so
testpg.pl  1232  andrejs    0u   CHR      136,6                8
/dev/pts/6
testpg.pl  1232  andrejs    1u   CHR      136,6                8
/dev/pts/6
testpg.pl  1232  andrejs    2u   CHR      136,6                8
/dev/pts/6
testpg.pl  1232  andrejs    3u  unix 0xc33a2f60         39562840 socket
testpg.pl  1232  andrejs    4u  unix 0xdfa69ae0         39562842 socket
testpg.pl  1234  andrejs  cwd    DIR        8,5    4096    16232
/home/andrejs/tmp
testpg.pl  1234  andrejs  rtd    DIR        8,1    4096        2 /
testpg.pl  1234  andrejs  txt    REG        8,1  740284   370595
/usr/bin/perl
testpg.pl  1234  andrejs  mem    REG        8,1  471781   176763
/lib/ld-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1     244   497998
/usr/lib/locale/en_US/LC_IDENTIFICATION
testpg.pl  1234  andrejs  mem    REG        8,1      13   497999
/usr/lib/locale/en_US/LC_MEASUREMENT
testpg.pl  1234  andrejs  mem    REG        8,1      49   498002
/usr/lib/locale/en_US/LC_TELEPHONE
testpg.pl  1234  andrejs  mem    REG        8,1     145   497997
/usr/lib/locale/en_US/LC_ADDRESS
testpg.pl  1234  andrejs  mem    REG        8,1      67   498000
/usr/lib/locale/en_US/LC_NAME
testpg.pl  1234  andrejs  mem    REG        8,1  445289   176781
/lib/libnsl-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1   79024   176776
/lib/libdl-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1  627312   481968
/lib/i686/libm-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1 5634864   481966
/lib/i686/libc-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1   95362   176774
/lib/libcrypt-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1   61451   176816
/lib/libutil-2.2.2.so
testpg.pl  1234  andrejs  mem    REG        8,1      24   498001
/usr/lib/locale/en_US/LC_PAPER
testpg.pl  1234  andrejs  mem    REG        8,1      42    16096
/usr/lib/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES
testpg.pl  1234  andrejs  mem    REG        8,1     276    32149
/usr/lib/locale/en_US/LC_MONETARY
testpg.pl  1234  andrejs  mem    REG        8,1   21484   224928
/usr/lib/locale/en_US/LC_COLLATE
testpg.pl  1234  andrejs  mem    REG        8,1    2441   498003
/usr/lib/locale/en_US/LC_TIME
testpg.pl  1234  andrejs  mem    REG        8,1      44   224924
/usr/lib/locale/en_US/LC_NUMERIC
testpg.pl  1234  andrejs  mem    REG        8,1  110304   385570
/usr/lib/locale/en_US/LC_CTYPE
testpg.pl  1234  andrejs  mem    REG        8,1   68999   337730
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBI/DBI.so
testpg.pl  1234  andrejs  mem    REG        8,1   95114    81673
/usr/lib/perl5/5.6.1/i386-linux/auto/POSIX/POSIX.so
testpg.pl  1234  andrejs  mem    REG        8,1   55554   627982
/usr/lib/perl5/site_perl/5.6.1/i386-linux/auto/DBD/Pg/Pg.so
testpg.pl  1234  andrejs  mem    REG        8,1   76472   386571
/usr/lib/libpq.so.2.1
testpg.pl  1234  andrejs  mem    REG        8,1  203467   386560
/usr/lib/libssl.so.0.9.6
testpg.pl  1234  andrejs  mem    REG        8,1  872656   386559
/usr/lib/libcrypto.so.0.9.6
testpg.pl  1234  andrejs  mem    REG        8,1  426613   578572
/usr/kerberos/lib/libkrb5.so.3.0
testpg.pl  1234  andrejs  mem    REG        8,1   78257   578570
/usr/kerberos/lib/libk5crypto.so.3.0
testpg.pl  1234  andrejs  mem    REG        8,1    8681   578568
/usr/kerberos/lib/libcom_err.so.3.0
testpg.pl  1234  andrejs  mem    REG        8,1  274054   176810
/lib/libresolv-2.2.2.so
testpg.pl  1234  andrejs    0u   CHR      136,6                8
/dev/pts/6
testpg.pl  1234  andrejs    1u   CHR      136,6                8
/dev/pts/6
testpg.pl  1234  andrejs    2u   CHR      136,6                8
/dev/pts/6
testpg.pl  1234  andrejs    3u  unix 0xc33a2f60         39562840 socket
testpg.pl  1234  andrejs    4u  unix 0xdfa69ae0         39562842 socket
testpg.pl  1234  andrejs    5u  unix 0xc33a28e0         39562844 socket

Reply via email to