PEPPLER.ORG
Michael Peppler
Sybase Consulting
Menu
Home
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
Freeware
Sybperl
Sybase::Simple
DBD::Sybase
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
FAQs
Sybase on Linux FAQ
Sybperl FAQ
Personal
Michael Peppler's resume

sybperl-l Archive

Up    Prev    Next    

From: Jonathan Swartz <swartz at pobox dot com>
Subject: Re: strange bug with DBD::Sybase and mod_perl
Date: Jan 7 2010 6:29PM

Ok, take sendmail out of the equation. The bug will occur iff the  
subprocess sends output to STDOUT.

Here's a slightly simplified version.

   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();
       system(qq{perl -e 'print "hi"'});
       testdb("dbh1", $dbh1);
       testdb("dbh2", $dbh2);

       return 0;
   }

This outputs

   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.

However, if I replace the system with

   system(qq{perl -e ''});
or
   system(qq{perl -e 'print "hi"' > /dev/null});

then it outputs

  dbh1 - ok
  dbh2 - ok

On Jan 6, 2010, at 1:20 PM, Jonathan Swartz wrote:

> This is a very bizarre bug occurring with DBD::Sybase, sendmail and  
> mod_perl. 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
> 
>   SetHandler perl-script
>   PerlHandler Handler
> 
>
> 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