Ok, take Sybase out of the equation. I've gotten it to happen with mysql as well.

   jswartz> ./test.sh
   dbh1 - ok
dbh2 - error: DBD::mysql::db do failed: Lost connection to MySQL server during query at /home/jswartz/projects/unchained-transaction/ lib/Handler.pm line 23.

On Jan 7, 2010, at 10:03 AM, Jonathan Swartz wrote:

Ok, take sendmail out of the equation. The bug will occur iff the program sends output to STDOUT (which sendmail was doing because of a warning).

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 disco\
  nnect
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 7, 2010, at 2:20 AM, Tim Bunce wrote:

On Wed, Jan 06, 2010 at 04:08:17PM -0800, Jonathan Swartz wrote:
Thanks for your help...this bug has me feeling very isolated...

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

That's the most interesting one to me. Try replacing it with a perl
script that reports what open file descriptors have been inherited.

Ok. What's the easiest way to do that? :) Sorry, probably dumb
question, but never did this before and scanning perlipc and
perlopentut and google didn't yield anything obvious.

I had to rummage around a bit, but this seems to work:

  $ perl -e 'open(FH, ">&=$_") and printf "$_\n" for 0..100'
  0
  1
  2

  $ perl -e 'open(FH, ">&=$_") and printf "$_\n" for 0..100' 42<&1
  0
  1
  2
  42

(Using >&= or <&= doesn't seem to matter for this simple case.)

Tim.


Reply via email to