IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 29582


Ignore:
Timestamp:
Oct 27, 2010, 12:10:49 PM (16 years ago)
Author:
rhenders
Message:

added runAnalysis() method; removed older redundant, versions of the same thing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/czartool/CzarDb.pm

    r29437 r29582  
    267267###########################################################################
    268268#
     269# Analysis this stage between these times
     270#
     271###########################################################################
     272sub runAnalysis {
     273    my ($self,
     274            $label,
     275            $stage,
     276            $fromTime,
     277            $toTime,
     278            $_started,
     279            $_finished,
     280            $_stuck,
     281            $_processed,
     282            $_pending,
     283            $_faults,
     284            $_totalTime) = @_;
     285
     286    my $query = $self->{_db}->prepare(<<SQL);
     287    SELECT
     288        timestamp, pending, faults, processed
     289        FROM $stage
     290        WHERE label LIKE '$label'
     291        AND timestamp >= '$fromTime' AND timestamp <= '$toTime'
     292        ORDER BY timestamp;
     293SQL
     294
     295    $query->execute;
     296
     297    my $lastProcessed = -1;
     298    my $lastPending = -1;
     299    my $lastFaults = -1;
     300    my $lastTimestamp = undef;
     301    my ($linearProcessed, $linearPending, $linearFaults);
     302    my ($derivProcessed, $derivPending, $derivFaults);
     303    my $started = undef;
     304    my $finished = undef;
     305   
     306    my $notProcessing = undef;
     307    my $howLongNotProcessing = undef;
     308    my $notProcessingLongerThanInterval = 0;
     309
     310    my $stuck = undef;
     311    my $howLongStuck = undef;
     312    my $stuckLongerThanInterval = 0;
     313
     314    my $stuffToDo = undef;
     315    my $interval = "00:20:00";
     316
     317    $linearProcessed = 0;
     318    while (my @row = $query->fetchrow_array()) {
     319        my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row;
     320
     321        # get linear values
     322        if($lastProcessed != -1 && $thisProcessed > $lastProcessed) {
     323           
     324            $linearProcessed = $linearProcessed + ($thisProcessed - $lastProcessed);
     325        }
     326        $linearPending = $thisPending;
     327        $linearFaults = $thisFaults;
     328
     329        # get first derivative values
     330        if (defined $lastTimestamp) {
     331
     332            my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp);
     333               
     334            if ($thisProcessed >= $lastProcessed){
     335                $derivProcessed = abs($thisProcessed - $lastProcessed)/$timeDiff;
     336            }
     337            else {$derivProcessed = 0;}
     338            $derivPending = abs($thisPending - $lastPending)/$timeDiff;   
     339            $derivFaults = abs($thisFaults - $lastFaults)/$timeDiff;   
     340        }
     341        else {
     342       
     343            $derivProcessed = 0;
     344            $derivPending = 0;
     345            $derivFaults = 0;
     346        }
     347
     348        # analysis
     349        if (defined $lastTimestamp) {
     350
     351            # anything to do?
     352            $stuffToDo = $linearPending - $linearFaults;
     353
     354            # we are not processing
     355            if ($derivProcessed < 0.001 ) {
     356
     357                if (!defined $notProcessing) {$notProcessing = $lastTimestamp;}
     358                if ($stuffToDo && !defined $stuck) {$stuck = $lastTimestamp;}
     359            }
     360
     361            # we are processing
     362            else {
     363                if (defined $notProcessing) {
     364                   
     365                    if ($stuckLongerThanInterval) {
     366
     367#                        print "* $stage procesing was stuck for  $howLongStuck, from $stuck until $lastTimestamp\n";
     368                    }
     369                    if ($notProcessingLongerThanInterval) {
     370
     371            #            print " * $stage not procesing for  $howLongNotProcessing, from $notProcessing until $thisTimestamp\n";
     372                    }
     373                    $notProcessing = undef;
     374                    $stuck = undef;
     375                }
     376                if (!defined $started) {
     377                    $started = $lastTimestamp;
     378                    $finished = undef;
     379#                    print "* $stage processing started at $started\n";
     380                }
     381            }
     382
     383            # how long stuck?
     384            if (defined $stuck) {
     385
     386                $howLongStuck = $self->diffTimes($lastTimestamp, $stuck);
     387                $stuckLongerThanInterval = $self->isBefore($interval, $howLongStuck)
     388            }
     389            else {
     390
     391                $howLongStuck = 0;
     392                $stuckLongerThanInterval = 0;
     393            }
     394
     395            # how long not processing?
     396            if (defined $notProcessing) {
     397               
     398                $howLongNotProcessing = $self->diffTimes($lastTimestamp, $notProcessing);
     399                $notProcessingLongerThanInterval = $self->isBefore($interval, $howLongNotProcessing);
     400            }
     401            else {
     402           
     403                $howLongNotProcessing = 0;
     404                $notProcessingLongerThanInterval = 0;
     405            }
     406
     407            if ($stuffToDo) {$finished = undef;}
     408            elsif (!defined $finished && $started && $notProcessingLongerThanInterval) {
     409
     410                $finished = $notProcessing;
     411            }
     412        }
     413
     414        $lastProcessed = $thisProcessed;
     415        $lastPending = $thisPending;
     416        $lastFaults = $thisFaults;
     417        $lastTimestamp = $thisTimestamp;
     418    }
     419
     420    ${$_processed} = $linearProcessed;
     421    ${$_pending} = $stuffToDo;
     422    ${$_faults} = $lastFaults;
     423
     424    if (defined $finished) {
     425        ${$_finished} = $finished;
     426        ${$_totalTime} = $self->diffTimes($finished, $started);
     427    }
     428
     429    elsif(defined $started) {
     430   
     431        ${$_finished} = undef;
     432    }
     433   
     434    if (!defined $started){
     435   
     436        ${$_started} = undef;
     437    }
     438    else {
     439   
     440        ${$_started} = $started;
     441    }
     442    if ($stuck && $stuckLongerThanInterval && !defined $finished) {
     443
     444        ${$_stuck} = $stuck;
     445    }
     446    else {
     447   
     448        ${$_stuck} = undef;
     449    }
     450
     451    return 1;
     452}
     453###########################################################################
     454#
    269455# Gets time series data and stores it to temp file
    270456#
     
    282468
    283469    if (!$query->execute) {return 0;}
    284     my $minProcessed = scalar  $query->fetchrow_array(); # TODO remove
     470    my $minProcessed = scalar  $query->fetchrow_array();
    285471    if (!defined $minProcessed) {return 0;}
    286472
     
    305491    my $lastFaults = -1;
    306492    my $lastTimestamp = undef;
    307     my $processed = 0;
    308     my $runningProcessed = 0;
    309     my $pending = 0;
    310     my $faults = 0;
     493    my ($linearProcessed, $linearPending, $linearFaults);
     494    my ($logProcessed, $logPending, $logFaults);
     495    my ($derivProcessed, $derivPending, $derivFaults);
    311496    my $timestamp = undef;
     497   
     498    $linearProcessed = 0;
    312499    while (my @row = $query->fetchrow_array()) {
    313500        my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row;
    314501
    315         if ($showCleanup ) {
     502        # get linear values
     503        if ($showCleanup) {
    316504       
    317             $runningProcessed = $thisProcessed - $minProcessed;
     505            $linearProcessed = $thisProcessed - $minProcessed;
    318506        }
    319507        elsif($lastProcessed != -1 && $thisProcessed > $lastProcessed) {
    320508           
    321             $runningProcessed = $runningProcessed + ($thisProcessed - $lastProcessed);
     509            $linearProcessed = $linearProcessed + ($thisProcessed - $lastProcessed);
    322510        }
    323 
    324 
    325         if ($firstDeriv) {
    326 
    327             if (defined $lastTimestamp) {
    328 
    329                 my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp);
     511        $linearPending = $thisPending;
     512        $linearFaults = $thisFaults;
     513
     514        # get first derivative values
     515        if (defined $lastTimestamp) {
     516
     517            my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp);
    330518               
    331                 if ($thisProcessed > $lastProcessed){
    332                 $processed = abs($thisProcessed - $lastProcessed)/$timeDiff;
    333 #print "$processed = ($thisProcessed - $lastProcessed)/$timeDiff\n";
    334                 }
    335                 else {$processed = 0;}
    336                 #$pending = abs($thisPending - $lastPending)/$timeDiff;   
    337                 #$faults = abs($thisFaults - $lastFaults)/$timeDiff;   
     519            if ($thisProcessed >= $lastProcessed){
     520                $derivProcessed = abs($thisProcessed - $lastProcessed)/$timeDiff;
    338521            }
    339             else {
    340                 $processed = 0;
    341                 $pending = 0;
    342                 $faults = 0;
    343             }
    344         }
    345         elsif ($isLog) {
    346 
    347             $processed = ($runningProcessed < 0) ? 0 : $runningProcessed;
    348             $pending =  ($thisPending < 0) ? 0 : $thisPending;
    349             $faults =  ($thisFaults < 0) ? 0 : $thisFaults;
    350 
    351             $processed = log($runningProcessed + 1)/log(10);
    352             $pending = log($thisPending + 1)/log(10);
    353             $faults = log($faults + 1)/log(10);
     522            else {$derivProcessed = 0;}
     523            $derivPending = 0;
     524            $derivFaults = 0;
     525        #    $derivPending = abs($thisPending - $lastPending)/$timeDiff;   
     526        #    $derivFaults = abs($thisFaults - $lastFaults)/$timeDiff;   
    354527        }
    355528        else {
    356529       
    357             $processed = $runningProcessed;
    358             $pending = $thisPending;
    359             $faults = $thisFaults;
     530            $derivProcessed = 0;
     531            $derivPending = 0;
     532            $derivFaults = 0;
    360533        }
    361534
     535        # get log values
     536        $logProcessed = ($linearProcessed < 0) ? 0 : $linearProcessed;
     537        $logPending =  ($linearPending < 0) ? 0 : $linearPending;
     538        $logFaults =  ($linearFaults < 0) ? 0 : $linearFaults;
     539        $logProcessed = log($logProcessed + 1)/log(10);
     540        $logPending = log($logPending + 1)/log(10);
     541        $logFaults = log($logFaults + 1)/log(10);
     542
     543        # print to data file
    362544        $timestamp = $self->getFormattedDate($thisTimestamp);
    363 
    364         print GNUDAT "$timestamp $pending $faults $processed\n";
     545        if ($firstDeriv) {print GNUDAT "$timestamp $derivPending $derivFaults $derivProcessed\n";}
     546        elsif($isLog) {print GNUDAT "$timestamp $logPending $logFaults $logProcessed\n";}
     547        else {print GNUDAT "$timestamp $linearPending $linearFaults $linearProcessed\n";}
    365548
    366549        $lastProcessed = $thisProcessed;
     
    608791###########################################################################
    609792#
    610 # When did this stage finish?
    611 #
    612 ###########################################################################
    613 sub getFinishTime {
    614     my ($self, $label, $stage, $begin, $end) = @_;
    615 
    616     my $query = $self->{_db}->prepare(<<SQL);
    617     SELECT
    618         timestamp, pending, faults
    619         FROM $stage
    620         WHERE label LIKE '$label'
    621         AND timestamp >= '$begin'
    622         AND timestamp <= '$end'
    623 SQL
    624     $query->execute;
    625 
    626     my $array = $query->fetchall_arrayref();
    627 
    628     my $row;
    629     my $thisPending = -1;
    630     my $lastPending = -1;
    631     my $thisFaults = -1;
    632     my $lastFaults = -1;
    633     my $timestamp;
    634     my $started = undef;
    635     my $finished = undef;
    636     my $thisLeft = 0;
    637     my $lastLeft = 0;
    638     my $finishTimeout = "01:00:00";
    639     my $numRows = @{$array};
    640     print "$numRows rows\n";
    641     my $n = 0;
    642     foreach $row ( @{$array} ){
    643 
    644         ($timestamp, $thisPending, $thisFaults) = @{$row};
    645 
    646 #        print "$timestamp, $thisPending, $thisFaults\n";
    647 
    648         $thisLeft = $thisPending - $thisFaults;
    649         $lastLeft = $lastPending - $lastFaults;
    650 
    651 
    652         if ($n == 0 && $thisLeft > 0) {
    653 
    654             print "Starting this time period with stuff pending ($thisLeft)\n";
    655             $started = $timestamp;
    656         }
    657 
    658         if (!defined $started && $lastLeft == 0 && $thisLeft > 0) {
    659 
    660             $started = $timestamp;
    661             print "STARTED at $started\n";
    662         }
    663 
    664         if ($started && !defined $finished && $thisLeft == 0) {
    665 
    666             $finished = $timestamp;
    667             print "setting FINISHED to $finished\n";
    668         }
    669 
    670         if (defined $finished) {
    671 
    672             if ($thisLeft != 0) {
    673                
    674                 $finished = undef;
    675            
    676                 print "NEW pending  at $timestamp\n";
    677            
    678             }
    679             elsif ($thisLeft == 0) {
    680                
    681                 my $howLongFinished = $self->diffTimes($timestamp, $finished);
    682 
    683 print "$howLongFinished = $timestamp, $finished\n";
    684 
    685                 if ($self->isIntervalGreaterThan($howLongFinished, $finishTimeout)) {
    686                    
    687                     print "0 pending for $howLongFinished. We're done \n";
    688                     last;
    689                 }
    690 
    691             }
    692 
    693         }
    694 
    695 
    696         $lastPending = $thisPending;
    697         $lastFaults = $thisFaults;
    698         $n++;
    699         if ($n == $numRows) {
    700 
    701             if ($thisLeft == 0) {
    702 
    703                 print "exceeded interval before reaching finished timeout\n";
    704             }
    705             else {
    706                 print "Reached end of interval and not finished yet. $thisLeft left\n";
    707             }
    708         }
    709     }
    710 
    711     if ($finished) {
    712 
    713         my $timeTaken = $self->diffTimes($finished, $started);
    714         print "FINISHED at $finished with $thisFaults remaining faults, time taken = $timeTaken\n";
    715     }
    716 
    717 }
    718 
    719 ###########################################################################
    720 #
    721 # Figures out if a stage has plateaued
    722 #
    723 ###########################################################################
    724 sub hasPlateaued {
    725     my ($self, $label, $stage, $end, $interval) = @_;
    726 
    727     my $query = $self->{_db}->prepare(<<SQL);
    728     SELECT
    729         timestamp, pending, faults
    730         FROM $stage
    731         WHERE label LIKE '$label'
    732         AND timestamp >= '$end - INTERVAL $interval'
    733         AND timestamp <= '$end'
    734         ORDER BY timestamp DESC;
    735 SQL
    736     $query->execute;
    737 
    738     my $array = $query->fetchall_arrayref();
    739 
    740     my $thisPending = -1;
    741     my $lastPending = -1;
    742     my $thisFaults = -1;
    743     my $lastFaults = -1;
    744     my $timestamp;
    745     my $thisLeft = 0;
    746     my $lastLeft = 0;
    747     my $row;
    748     my $numRows = @{$array};
    749     my $n = 0;
    750     foreach $row ( @{$array} ){
    751 
    752         ($timestamp, $thisPending, $thisFaults) = @{$row};
    753 
    754         $thisLeft = $thisPending - $thisFaults;
    755         $lastLeft = $lastPending - $lastFaults;
    756 
    757         print "$timestamp $thisPending\n";
    758 
    759         if ($n>0) {
    760 
    761             #if () {}
    762 
    763         }
    764 
    765         $lastPending = $thisPending;
    766         $lastFaults = $thisFaults;
    767         $n++;
    768     }
    769 }
    770 
    771 ###########################################################################
    772 #
    773793# Gets count of processed stuff in a given time period
    774794#
     
    972992###########################################################################
    973993#
     994# Returns if a particular server has been stopped for a certain interval
     995#
     996###########################################################################
     997sub isServerStopped {
     998    my ($self, $server, $interval, $since) = @_;
     999
     1000    return $self->getServerStatus($server, $interval, $since, "running");
     1001}
     1002
     1003###########################################################################
     1004#
    9741005# Returns if a particular server has been down for a certain interval
    9751006#
    9761007###########################################################################
    9771008sub isServerDown {
    978     my ($self, $server, $interval) = @_;
     1009    my ($self, $server, $interval, $since) = @_;
     1010
     1011    return $self->getServerStatus($server, $interval, $since, "alive");
     1012}
     1013
     1014###########################################################################
     1015#
     1016# Returns if a particular server has been down for a certain interval
     1017#
     1018###########################################################################
     1019sub getServerStatus {
     1020    my ($self, $server, $interval, $since, $mode) = @_;
    9791021
    9801022    my $query = $self->{_db}->prepare(<<SQL);
    9811023    SELECT COUNT(*)
    9821024        FROM servers
    983         WHERE server = "$server"
     1025        WHERE server = '$server'
    9841026        AND timestamp > now() - INTERVAL $interval
    9851027SQL
     
    9931035    SELECT COUNT(*)
    9941036        FROM servers
    995         WHERE server = "$server"
     1037        WHERE server = '$server'
    9961038        AND timestamp > now() - INTERVAL $interval
    997         AND !running
     1039        AND !$mode
    9981040SQL
    9991041
     
    10011043    my $numNotRunning = scalar $query->fetchrow_array();
    10021044
    1003     if ($numOfReadings == $numNotRunning) {return 1;}
    1004 
    1005     return 0;
     1045    if ($numOfReadings != $numNotRunning) {return 0;}
     1046
     1047    $query = $self->{_db}->prepare(<<SQL);
     1048    SELECT
     1049        timestamp
     1050        FROM servers
     1051        WHERE server = '$server'
     1052        AND $mode
     1053        ORDER BY timestamp DESC
     1054        LIMIT 1
     1055
     1056SQL
     1057    $query->execute;
     1058    ${$since} = scalar $query->fetchrow_array();
     1059
     1060    return 1;
    10061061}
    10071062
Note: See TracChangeset for help on using the changeset viewer.