RE: Automatically managing inactiveDestroy property.
"Lenga, Yair " <[email protected]> Thu, 10 Apr 2008 10:02:03 -0400
| Newsgroups | gmane.comp.lang.perl.modules.dbi.sybase |
|---|---|
| Message-ID | <[email protected]> |
Michael,
Thanks for taking the time to look into this. Attached is a mini-version
of one of my programs - hopefully, it will demonstrate the problem.
The code make an RPC call, capture the output (using a child process),
and then record the result in the database.
I've found that without the inactiveDestory, the child 'exit' will
invalidate the DBH connection to Sybase.
Many Thanks
Yair
sub host_check {
my ($dbh, $account, $hostid, $target, $cmd) = @_ ;
warn "Trying $hostid ($target)\n" ;
my($remote) = new IO::Socket::INET(PeerAddr => $target, Timeout =>
15) ;
if ( !$remote ) {
my $code = 0+$! ;
my $desc = $! ;
warn "Network Error: $account on $hostid ($target): $!
($code)\n" ;
print "M - Failed to launch on $hostid\n" ;
my $retry =
$code == ECONNREFUSED ? 5*60 : # Machine refuse connection
10*60 ;
record_host_error($dbh, $hostid, $retry, "E" . 0+$! . "/" . $!)
;
print "M - Host $hostid Network Error: $code ($desc), retry in
$retry\n" ;
next ;
} ;
warn "Connected to $hostid '$target'\n" ;
my $child = new IO::Handle ;
my $pid = open($child, "-|") ;
die "Error forking helper: $!" unless defined($pid) ;
unless ( $pid ) {
# Child Helper
$dbh->{InactiveDestroy} = 1 ;
alarm(15) ;
print $remote $cmd ;
if ( <$remote> ) {
print $_ ;
alarm(60) ;
print while ( <$remote> ) ;
} ;
exit ;
} ;
# Parent Here
close $remote ;
my $run_stat = 'NA' ;
my $line_count = 0 ;
while ( <$child> ) {
chomp ;
if ( m{^//X\s+(\d+)$} ) {
$run_stat = $1 ;
} else {
warn "$_" ;
} ;
$line_count++ ;
} ;
close $child ;
# Check the return code (6/7/8/9 indicate OK )
if ( $run_stat >= 5 && $run_stat <= 9 ) {
warn "Launch OK: Feedback: $line_count lines,
status=$run_stat\n" ;
$dbh->do(...) # Record Error in DB
record_launch_ok($dbh, $hostid, $account) ;
print "M - Host $hostid PASS\n" ;
return 1 ;
# High error code indicate problem with license - no retry!
-----Original Message-----
From: [email protected] [mailto:[email protected]]
On Behalf Of [email protected]
Sent: Thursday, April 10, 2008 9:18 AM
To: [email protected]
Subject: Re: Automatically managing inactiveDestroy property.
Quick response (I'll respond more completely from home tonight):
DBD::Sybase should support accessing the db handle from both the parent
and the child as that's supported by OpenClient (although I haven't
tried it with DBD::Sybase - I *have* done it with Sybase::CTlib).
Anyway - the PID idea seems reasonable at first glance, but I need to
think about it a bit to see if there might be any downsides...
Michael
"Lenga, Yair " <[email protected]>
Sent by: [email protected]
10.04.2008 14:38
To
<[email protected]>
cc
Subject
Automatically managing inactiveDestroy property.