perhaps you should set InactiveDestroy true on your handle before you
open the pipe to sendmail?

allan

On Wed, Jan 6, 2010 at 2:50 PM, Jonathan Swartz <[email protected]> wrote:
> This is one of the most bizarre and specific bugs I've ever seen. I've
> minimized it as much as I can. Please bear with me. :)
>
> Here is my mod_perl handler:
>
>   package Handler;
>   use DBI;
>   use strict;
>   use warnings;
>
>   our ($dbh1, $dbh2);
>
>   sub dbconnect {
>       return DBI->connect( 'DBI:Sybase:...', '...', '...', { RaiseError => 1
> } );
>   }
>
>   sub testdb {
>       my ( $name, $dbh ) = @_;
>       eval { $dbh->do("select 1") };
>       print "$name - " . ($@ ? "error: $@" : "ok") . "\n";
>   }
>
>   sub handler {
>       my ($r) = @_;
>
>       # connect.pl contains one line: BEGIN { $Handler::dbh1 =
> Handler::dbconnect() }
>       do "/home/jswartz/projects/unchained-transaction/connect.pl";
>       $dbh2 = dbconnect();
>
>       open( MAIL, "|/usr/sbin/sendmail" ) || die "Can't open";
>       testdb("dbh1", $dbh1);
>       testdb("dbh2", $dbh2);
>       close(MAIL);
>       testdb("dbh1", $dbh1);
>       testdb("dbh2", $dbh2);
>
>       return 0;
>   }
>
>   1;
>
> When I hit / on this server, it outputs:
>
>   dbh1 - ok
>   dbh2 - ok
>   dbh1 - ok
>   dbh2 - error: DBD::Sybase::db do failed: OpenClient message: LAYER = (5)
> ORIGIN = (3) SEVERITY = (5) NUMBER = (6)
>   Server SANDBOX5, database
>   Message String: ct_results(): network packet layer: internal net library
> error: Net-Library operation terminated due to disconnect
>   OpenClient message: LAYER = (1) ORIGIN = (1) SEVERITY = (1) NUMBER = (50)
>   Server SANDBOX5, database
>   Message String: ct_cmd_drop(): user api layer: external error: The
> connection has been marked dead.
>
> That is, $dbh2 goes "bad" when the pipe to sendmail is closed. (?!) Note
> that ping() still returns 1, I have to call do() to get the error.
>
> Just about everything here is necessary to generate the bug. In particular,
> I cannot generate the bug...
> * If I move the code from connect.pl into the handler, even as a string eval
> * If I remove the "BEGIN" from connect.pl
> * If I replace sendmail with another program
> * If I run this in a script outside of mod_perl - even a script that forks
>
> Obviously, I can change around our current code base to not hit this
> particular condition, but that gives me no confidence that it won't
> accidentally arise again, in this or another form.
>
> Any advice on how to proceed appreciated!
>
> Thanks
> Jon
>
> --------------
> Using perl 5.10.1, DBI 1.609 , DBD::Sybase 1.09, Apache 2.2.14 (latest
> versions of all).
>
> httpd.conf contains:
>
> LoadModule perl_module /home/mercury/vendor/httpd/modules/mod_perl.so
>
> ServerRoot         /home/jswartz/projects/unchained-transaction
> DocumentRoot       /home/jswartz/projects/unchained-transaction/htdocs
> PidFile            logs/httpd.pid
> TypesConfig        conf/mime.types
>
> MinSpareServers      2
> MaxSpareServers      3
> StartServers         2
> MaxClients           4
> MaxRequestsPerChild  100
>
> PerlPostConfigRequire
> /home/jswartz/projects/unchained-transaction/conf/startup.pl
> Listen 3010
> <Location />
>    SetHandler perl-script
>    PerlHandler Handler
> </Location>
>
> Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
>
>  Platform:
>    osname=linux, osvers=2.6.18-53.el5, archname=i686-linux
>    uname='linux hp-lt-171-rnebel.ensenda.com 2.6.18-53.el5 #1 smp wed oct 10
> 16:34:02 edt 2007 i686 i686 i386 gnulinux '
>    config_args='-des -Uusethreads -Dprefix=/home/mercury/vendor/perl'
>    hint=recommended, useposix=true, d_sigaction=define
>    useithreads=undef, usemultiplicity=undef
>    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
>    use64bitint=undef, use64bitall=undef, uselongdouble=undef
>    usemymalloc=n, bincompat5005=undef
>  Compiler:
>    cc='cc', ccflags ='-fno-strict-aliasing -pipe -fstack-protector
> -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_B\
> ITS=64',
>    optimize='-O2',
>    cppflags='-fno-strict-aliasing -pipe -fstack-protector
> -I/usr/local/include'
>    ccversion='', gccversion='4.1.2 20070626 (Red Hat 4.1.2-14)',
> 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=8
>    alignbytes=4, prototype=define
>  Linker and Libraries:
>    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
>    libpth=/usr/local/lib /lib /usr/lib
>    libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc
>    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
>    libc=/lib/libc-2.5.so, so=so, useshrplib=false, libperl=libperl.a
>    gnulibc_version='2.5'
>  Dynamic Linking:
>    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
>    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib
> -fstack-protector'
>
>
> Characteristics of this binary (from libperl):
>  Compile-time options: PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP
>                        USE_LARGE_FILES USE_PERLIO
>  Built under linux
>  Compiled at Nov 20 2009 15:56:22
>



-- 
"The truth is an offense, but not a sin"

Reply via email to