6 jobs are running at the same time and accessing same dbm file for writing and reading. These are daily jobs and failing only some times not regularly. So i thought of this is just because of dead lock situation. So i tried to put flock here in the following code. But i got the following error.
Can't locate object method "fd" via package "SDBM_File"
Can any body help me in this case.
[code=perl]
use strict ;
use warnings ;
use SDBM_File ;
use Fcntl ;
use vars qw($ctl);
my $dir;
my $LOCK_EX = 2;
# determine application base directory
require("rupBas e.pl");
$dir = &rupBase($0) ;
#---load supplemental routines
# $SLAYER_ON = 1; #-- slayer inititalized if variable defined --#
push(@INC,$dir) ;
require("utlIni tPerl.pl") || die "could not locate 'utlInitPerl.pl '";
#
#----------------------------End of Common Code------------------------------
#
my $date;
chop($date=`dat e '+%Y%m%d.%H%M`) ;
my $dpc = $$ctl{MTT_JURIS DICTION};
my $fileName = $$ctl{MTT_OUTPU T_EOP_XPORT_OUT }."/GAPSOUT.".$date ;
my $fileRecall;
my $tName = $$ctl{MTT_STAT_ DIR}."/FTP_FILE_NAMES" ;
my $cycnum = '';
my $cycFile = $$ctl{MTT_CYCLE _FILE};
my $javaHome=$ENV{ JAVA_HOME};
my $db;
my $stat;
my %FILE_NAMES;
$ENV{'MTT_CYCLE _FILE'} = $cycFile;
$ENV{'GAPSOUT'} = "$fileName" ;
$ENV{'PATH'}="$ javaHome/bin:$javaHome/jre/bin:$ENV{PATH}" ;
#----------------------------------------------------------------------------
# get cycle number
#----------------------------------------------------------------------------
open(FILE,"<$cy cFile");
{ local $/ = undef;
my $data = <FILE>;
$cycnum = substr($data,11 ,7);
print "Cycle Number = $cycnum\n";
}
close(FILE);
print "\n============ ==========Start Java=========== ===========\n";
my $cmd = "java -DDPCH=$dpc -DCycleDt=$cycnu m GapsOutRpt $fileName";
print "============== ==========End Java=========== ============\n\ n";
print "$cmd\n";
$! = system("$cmd");
$stat = $!>>8;
if ($stat > 4) {
&postlude($stat ,$!);
exit $stat;
}
my $i = 0;
local *DBM;
while ($i++ < 5) {
$db = tie(%FILE_NAMES , 'SDBM_File', $tName, O_RDWR|O_CREAT, 0666)
or die "Cannot open $tName: $!\n" ;
my $fd = $db->fd;
open DBM, "+<&=$fd" or die "Could not dup DBM for lock: $!";
flock DBM, $LOCK_EX;
undef $db;
$FILE_NAMES{'GA PSOUT'} = $fileName;
$fileRecall = $FILE_NAMES{'GA PSOUT'};
if ($fileRecall eq $fileName) {
print "$i: DB update successful: $fileName\n";
last;
} else {
print "$i: DB update failed: sleep (1): try again\n";
sleep (1);
}
}
$stat = $!>>8;
if ($stat != 0) {
&postlude($stat ,$!);
}
exit $stat;
[/code]
Can't locate object method "fd" via package "SDBM_File"
Can any body help me in this case.
[code=perl]
use strict ;
use warnings ;
use SDBM_File ;
use Fcntl ;
use vars qw($ctl);
my $dir;
my $LOCK_EX = 2;
# determine application base directory
require("rupBas e.pl");
$dir = &rupBase($0) ;
#---load supplemental routines
# $SLAYER_ON = 1; #-- slayer inititalized if variable defined --#
push(@INC,$dir) ;
require("utlIni tPerl.pl") || die "could not locate 'utlInitPerl.pl '";
#
#----------------------------End of Common Code------------------------------
#
my $date;
chop($date=`dat e '+%Y%m%d.%H%M`) ;
my $dpc = $$ctl{MTT_JURIS DICTION};
my $fileName = $$ctl{MTT_OUTPU T_EOP_XPORT_OUT }."/GAPSOUT.".$date ;
my $fileRecall;
my $tName = $$ctl{MTT_STAT_ DIR}."/FTP_FILE_NAMES" ;
my $cycnum = '';
my $cycFile = $$ctl{MTT_CYCLE _FILE};
my $javaHome=$ENV{ JAVA_HOME};
my $db;
my $stat;
my %FILE_NAMES;
$ENV{'MTT_CYCLE _FILE'} = $cycFile;
$ENV{'GAPSOUT'} = "$fileName" ;
$ENV{'PATH'}="$ javaHome/bin:$javaHome/jre/bin:$ENV{PATH}" ;
#----------------------------------------------------------------------------
# get cycle number
#----------------------------------------------------------------------------
open(FILE,"<$cy cFile");
{ local $/ = undef;
my $data = <FILE>;
$cycnum = substr($data,11 ,7);
print "Cycle Number = $cycnum\n";
}
close(FILE);
print "\n============ ==========Start Java=========== ===========\n";
my $cmd = "java -DDPCH=$dpc -DCycleDt=$cycnu m GapsOutRpt $fileName";
print "============== ==========End Java=========== ============\n\ n";
print "$cmd\n";
$! = system("$cmd");
$stat = $!>>8;
if ($stat > 4) {
&postlude($stat ,$!);
exit $stat;
}
my $i = 0;
local *DBM;
while ($i++ < 5) {
$db = tie(%FILE_NAMES , 'SDBM_File', $tName, O_RDWR|O_CREAT, 0666)
or die "Cannot open $tName: $!\n" ;
my $fd = $db->fd;
open DBM, "+<&=$fd" or die "Could not dup DBM for lock: $!";
flock DBM, $LOCK_EX;
undef $db;
$FILE_NAMES{'GA PSOUT'} = $fileName;
$fileRecall = $FILE_NAMES{'GA PSOUT'};
if ($fileRecall eq $fileName) {
print "$i: DB update successful: $fileName\n";
last;
} else {
print "$i: DB update failed: sleep (1): try again\n";
sleep (1);
}
}
$stat = $!>>8;
if ($stat != 0) {
&postlude($stat ,$!);
}
exit $stat;
[/code]
Comment