-#!@PERL@ -w
+#!@PERL@ -Tw
#
# Run perl.
require "newgetopt.pl";
use Time::Local;
+delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV', 'PATH'};
+$ENV{'PATH'} = "/usr/bin:/usr/sbin:/sbin:/bin";
+
$confdir="@CONFIG_DIR@";
$prefix='@prefix@';
$prefix=$prefix; # avoid warnings about possible typo
$exec_prefix=$exec_prefix; # ditto
$sbindir="@sbindir@";
+#$STATUS_STRANGE = 2;
+$STATUS_FAILED = 4;
+$STATUS_MISSING = 8;
+$STATUS_TAPE = 16;
+$exit_status = 0;
+
$USE_VERSION_SUFFIXES='@USE_VERSION_SUFFIXES@';
$suf = '';
if ( $USE_VERSION_SUFFIXES =~ /^yes$/i ) {
}
+if ( ! -e "$confdir/$conf" ) {
+ print "Configuration directory '" . $confdir/$conf . "' doesn't exist\n";
+ exit 1;
+}
if ( ! -d "$confdir/$conf" ) {
- die "amstatus$suf: could not find directory $confdir/$conf";
+ print "Configuration directory '" . $confdir/$conf . "' is not a directory\n";
+ exit 1;
}
-$oldPATH = $ENV{'PATH'};
-$ENV{'PATH'} = "/bin:/usr/bin:/usr/sbin:/sbin"; # force known path
-
$pwd = `pwd`;
chomp $pwd;
chdir "$confdir/$conf";
}
$unit=`$sbindir/amgetconf$suf displayunit`;
-$ENV{'PATH'} = $oldPATH;
chomp($unit);
$unitdivisor=1;
if($unit eq 'K') {
$ntsize{$nb_tape} = 0;
$ntesize{$nb_tape} = 0;
$tape_size = 0;
+$driver_finished = 0;
while(<AMDUMP>) {
chomp;
if(/(amdump|amflush): start at (.*)/) {
print " from $2\n";
- $starttime=&unctime(split(/[ ]+/,$2));
}
- elsif(/amdump: datestamp (\S+)/) {
- $gdatestamp = $1;
+ elsif(/(amdump|amflush): datestamp (\S+)/) {
+ $gdatestamp = $2;
if(!defined $datestamp{$gdatestamp}) {
$datestamp{$gdatestamp} = 1;
push @datestamp, $gdatestamp;
}
+ $starttime=&set_starttime($2);
+ }
+ elsif(/(amdump|amflush): starttime (\S+)/) {
+ $starttime=&set_starttime($2);
}
elsif(/planner: timestamp (\S+)/) {
$gdatestamp = $1;
$degr_level{$hostpart}=-1;
}
}
- elsif(/^DUMP (\S+) (\S+) (\S+) (\S+) (\d+) (\d+) \d+:\d+:\d+:\d+:\d+:\d+ (\d+) \d+/) {
+ elsif(/^DUMP (\S+) (\S+) (\S+) (\S+) (\d+) (\d+) \d+:\d+:\d+:\d+:\d+:\d+ \d+ (\d+) \d+/) {
if($generating_schedule == 1 ) {
$host=$1;
$features=$2;
$degr_size{$hostpart}=32 if ($7 < 32);
}
}
- elsif(/^DUMP (\S+) (\S+) (\S+) (\d+) (\d+) \d+:\d+:\d+:\d+:\d+:\d+ (\d+) \d+ (\d+) \d+:\d+:\d+:\d+:\d+:\d+ ([-]*\d+) \d+/) {
+ elsif(/^DUMP (\S+) (\S+) (\S+) (\d+) (\d+) \d+:\d+:\d+:\d+:\d+:\d+ \d+ (\d+) \d+ (\d+) \d+:\d+:\d+:\d+:\d+:\d+ [-]*\d+ ([-]*\d+) \d+/) {
if($generating_schedule == 1 ) {
$host=$1;
$partition=$2;
$serial=$4;
$serial{$serial}=$hostpart;
#$chunk_started{$hostpart}=1;
- #$chunk_time{$hostpart}=$1;
+ $chunk_time{$hostpart}=$1;
#$chunk_finished{$hostpart}=0;
$holding_file{$hostpart}=$5;
}
$serial=$4;
$serial{$serial}=$hostpart;
#$chunk_started{$hostpart}=1;
- #$chunk_time{$hostpart}=$1;
+ $chunk_time{$hostpart}=$1;
#$chunk_finished{$hostpart}=0;
$holding_file{$hostpart}=$5;
}
$hostpart=$serial{$serial};
$size{$hostpart}=$outputsize;
$dump_finished{$hostpart}=1;
- $busy_time{$2}+=($1-$dump_time{$hostpart});
+ $busy_time{$2}+=($1-$chunk_time{$hostpart});
$running_dumper{$2} = "0";
- $dump_time{$hostpart}=$1;
+ $chunk_time{$hostpart}=$1;
$error{$hostpart}="";
if ($3 eq "PARTIAL") {
$partial{$hostpart} = 1;
$taper_started{$hostpart}=1;
$taper_finished{$hostpart}=0;
$taper_time{$hostpart}=$1;
+ $ntchunk_size = 0;
}
#features (maybe missing features)
elsif(/driver: send-cmd time (\S+) to taper: FILE-WRITE (\d+-\d+) (\S+) (\S+) (\S*) (\S+) (\d*) (\S+)/){
$taper_started{$hostpart}=1;
$taper_finished{$hostpart}=0;
$taper_time{$hostpart}=$1;
+ $ntchunk_size = 0;
}
elsif(/driver: send-cmd time (\S+) to taper: PORT-WRITE (\d+-\d+) (\S+) (\S+) \d+( \d+|)/){
$current_time=$1;
$taper_started{$hostpart}=1;
$taper_finished{$hostpart}=0;
$taper_time{$hostpart}=$1;
+ $ntchunk_size = 0;
}
elsif(/driver: send-cmd time (\S+) to taper: PORT-WRITE (\d+-\d+) (\S+) (\S+) (\S+) \d+ \d+/){
$current_time=$1;
$taper_started{$hostpart}=1;
$taper_finished{$hostpart}=0;
$taper_time{$hostpart}=$1;
+ $ntchunk_size = 0;
}
elsif(/driver: result time (\S+) from taper: (DONE|PARTIAL) (\d+-\d+) (\S+) (\d+) "?\[sec (\S+) kb (\d+) kps/) {
$current_time=$1;
$size{$hostpart}=$size;
}
$ntpartition{$nb_tape}++;
- $ntsize{$nb_tape} += $size{$hostpart};
+ $ntsize{$nb_tape} += $size{$hostpart} - $ntchunk_size;
if(defined $esize{$hostpart} && $esize{$hostpart} > 1) {
- $ntesize{$nb_tape} += $esize{$hostpart};
+ $ntesize{$nb_tape} += $esize{$hostpart} - $ntchunk_size;
}
else {
- $ntesize{$nb_tape} += $size{$hostpart};
+ $ntesize{$nb_tape} += $size{$hostpart} - $ntchunk_size;
}
if ($3 eq "PARTIAL") {
$partial{$hostpart} = 1;
else {
$partial{$hostpart} = 0;
}
+ if($ntchunk_size > 0) {
+ $ntchunk{$nb_tape}++;
+ }
}
elsif(/driver: result time (\S+) from taper: (TRY-AGAIN|TAPE-ERROR) (\d+-\d+) (.+)/) {
$current_time=$1;
%free = split (/ +/, $2);
%qlen = split (/ +/, $5);
- if($status_driver ne "") {
- $dumpers_active[$dumpers_active_prev]
- +=$current_time-$state_time_prev;
- $dumpers_held[$dumpers_active_prev]{$status_driver}
- +=$current_time-$state_time_prev;
- }
- $state_time_prev=$current_time;
- $dumpers_active_prev=$dumpers_active;
- $status_driver=$6;
- if(! defined($dumpers_held[$dumpers_active]{$status_driver})) {
- $dumpers_held[$dumpers_active]{$status_driver}=0;
+ if(defined($dumpers_active)) {
+ if($status_driver ne "") {
+ $dumpers_active[$dumpers_active_prev]
+ +=$current_time-$state_time_prev;
+ $dumpers_held[$dumpers_active_prev]{$status_driver}
+ +=$current_time-$state_time_prev;
+ }
+ $state_time_prev=$current_time;
+ $dumpers_active_prev=$dumpers_active;
+ $status_driver=$6;
+ if(! defined($dumpers_held[$dumpers_active]{$status_driver})) {
+ $dumpers_held[$dumpers_active]{$status_driver}=0;
+ }
}
}
- elsif(/taper: wrote label `(\S*)'/) {
+ elsif(/taper: .*wrote label `(\S*)'/) {
$nb_tape++;
$ntlabel{$nb_tape} = $1;
$ntpartition{$nb_tape} = 0;
$ntsize{$nb_tape} = 0;
$ntesize{$nb_tape} = 0;
+ $ntchunk{$nb_tape} = 0;
+ }
+ elsif(/splitting chunk that started at \d*kb after (\d*)kb/) {
+ $ntchunk{$nb_tape}++;
+ $ntsize{$nb_tape} += $1 / $unitdivisor;
+ $ntesize{$nb_tape} += $1 / $unitdivisor;
+ $ntchunk_size += $1 / $unitdivisor;
+ }
+ elsif(/driver: FINISHED/) {
+ $driver_finished = 1;
}
else {
#print "Ignoring: $_\n";
(defined $opt_gestimate && $partialestimate{$hostpart} == 1)) {
printf "%8s ", $datestamp if defined $opt_date;
printf "%-${maxnamelength}s", "$host:$partition";
- printf "%2d", $level{$hostpart};
+ printf "%2d ", $level{$hostpart};
printf "%9d$unit", $esize{$hostpart};
if($partialestimate{$hostpart} == 1) {
print " partial";
elsif (!defined $dump_started{$hostpart} || $dump_started{$hostpart} == 0) {
if( defined $opt_failed) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf " no estimate\n";
}
+ $exit_status |= $STATUS_FAILED;
$fpartition++;
+ $fsize+=$esize{$hostpart};
}
}
else {
$desize += $esize{$hostpart};
}
if(defined $dump_started{$hostpart} &&
- $dump_started{$hostpart} == 1 &&
+ $dump_started{$hostpart} == 1 &&
+ $dump_finished{$hostpart} == -1) {
+ if(defined $opt_failed) {
+ printf "%8s ", $datestamp if defined $opt_date;
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
+ printf "%9d$unit", $esize{$hostpart};
+ print " dump to tape failed: " . $error{$hostpart};
+ print "\n";
+ }
+ $exit_status |= $STATUS_FAILED;
+ $fpartition++;
+ $fsize+=$esize{$hostpart};
+ }
+ elsif(defined $dump_started{$hostpart} &&
+ $dump_started{$hostpart} == 1 &&
$dump_finished{$hostpart} == 0 &&
$taper_started{$hostpart} == 1) {
if( defined $opt_dumpingtape ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $esize{$hostpart};
print " dumping to tape";
if( defined $starttime ) {
elsif($taper_finished{$hostpart} == 0) {
if( defined $opt_writingtape ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $size{$hostpart};
if($in_flush == 0) {
print " writing to tape";
if( defined $opt_failed ||
(defined $opt_waittaper && ($taper_finished{$hostpart} == -1))) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $xsize;
if($in_flush == 0) {
print " failed to tape";
}
print "\n";
}
+ $exit_status |= $STATUS_TAPE;
$tfpartition++;
$tfsize += $xsize;
elsif($taper_finished{$hostpart} == 1) {
if( defined $opt_finished ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $size{$hostpart};
if($in_flush == 0) {
print " finished";
if( defined $starttime ) {
print " (", &showtime($taper_time{$hostpart}), ")";
}
- print ", PARTIAL" if defined $partial{$hostpart} &&
- $partial{$hostpart} == 1;
+ if(defined $partial{$hostpart} && $partial{$hostpart} == 1) {
+ print ", PARTIAL";
+ $exit_status |= $STATUS_FAILED;
+ }
print "\n";
}
$tpartition++;
}
else {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
print " unknown state TAPER\n";
}
}
if($dump_started{$hostpart} == -1) {
if( defined $opt_failed ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf " " . $error{$hostpart} . "\n";
}
+ $exit_status |= $STATUS_FAILED;
+
$fpartition++;
$fsize+=$esize{$hostpart};
}
if($estimate{$hostpart} == 1) {
if( defined $opt_waitdumping ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $esize{$hostpart};
print " wait for dumping $error{$hostpart}\n";
}
+ if($driver_finished == 1) {
+ $exit_status |= $STATUS_MISSING;
+ }
$wpartition++;
$wsize += $esize{$hostpart};
}
$dump_finished{$hostpart} == -1) {
if( defined $opt_failed ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
print " ", $error{$hostpart};
if( defined $starttime ) {
print " (", &showtime($dump_time{$hostpart}), ")";
}
print "\n";
}
+ $exit_status |= $STATUS_FAILED;
$fpartition++;
$fsize+=$esize{$hostpart};
}
$dump_finished{$hostpart} != 1) {
if( defined $opt_dumping ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $esize{$hostpart};
printf " dumping %8d$unit", $size{$hostpart};
if($size{$hostpart} != 0) {
$taper_started{$hostpart} != 1) {
if( defined $opt_waittaper ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $size{$hostpart};
print " dump done";
if( defined $starttime ) {
print " (", &showtime($dump_time{$hostpart}), ")";
}
print ", wait for writing to tape";
- print ", PARTIAL" if defined $partial{$hostpart} &&
- $partial{$hostpart} == 1;;
+ if(defined $partial{$hostpart} && $partial{$hostpart} == 1) {
+ print ", PARTIAL";
+ $exit_status |= $STATUS_FAILED;
+ }
print "\n";
}
$dpartition++;
}
else {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
print " unknown state DUMPER\n";
}
}
elsif(defined $flush{$hostpart}) {
if( defined $opt_waittaper ) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
printf "%9d$unit", $size{$hostpart};
print " waiting to flush";
- print ", PARTIAL" if defined $partial{$hostpart} &&
- $partial{$hostpart} == 1;
+ if(defined $partial{$hostpart} && $partial{$hostpart} == 1) {
+ print ", PARTIAL";
+ $exit_status |= $STATUS_FAILED;
+ }
print "\n";
}
$wfpartition++;
}
elsif(defined $level{$hostpart}) {
printf "%8s ", $datestamp if defined $opt_date;
- printf "%-${maxnamelength}s%2d", "$host:$partition", $level{$hostpart};
+ printf "%-${maxnamelength}s%2d ", "$host:$partition", $level{$hostpart};
print " unknown state\n";
}
}
if($nb_tape > 1 || $tape_size != 0) {
for($i=1; $i <= $nb_tape; $i++) {
if($tape_size != 0) {
- printf " tape %-3d : %3d %9d$unit %9d$unit (%6.2f%%) %s\n",
+ printf " tape %-3d : %3d %9d$unit %9d$unit (%6.2f%%) %s",
$i, $ntpartition{$i}, $ntsize{$i}, $ntesize{$i}, 100*$ntsize{$i}/$tape_size, $ntlabel{$i};
+ if($ntchunk{$i} > 0) {
+ printf " (%d chunks)", $ntchunk{$i};
+ }
+ print "\n";
}
else {
printf " tape %-3d : %3d %9d$unit %9d$unit %s\n",
}
}
+exit $exit_status;
+
sub make_hostpart() {
local($host,$partition,$datestamp) = @_;
return $time;
}
+sub set_starttime() {
+ my (@tl);
+ my ($time);
+ my ($date);
+
+ # Preset an array of values in case some parts are not passed as
+ # arguments. This lets the date, etc, be omitted and default to
+ # today.
+
+ ($date)=@_;
+ @tl = localtime;
+
+ $tl[5] = substr($date, 0, 4) if(length($date) >= 4);
+ $tl[4] = substr($date, 4, 2)-1 if(length($date) >= 6);
+ $tl[3] = substr($date, 6, 2) if(length($date) >= 8);
+ $tl[2] = substr($date, 8, 2) if(length($date) >= 10);
+ $tl[1] = substr($date, 10, 2) if(length($date) >= 12);
+ $tl[0] = substr($date, 12, 2) if(length($date) >= 14);
+
+ $time = &timelocal (@tl);
+
+ return $time;
+}
+
sub showtime() {
my($delta)=shift;
my($oneday)=24*60*60;