IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 24963


Ignore:
Timestamp:
Jul 31, 2009, 3:36:15 PM (17 years ago)
Author:
bills
Message:

various cleanup mostly with error handling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/pstamp/scripts/pstamp_job_run.pl

    r24944 r24963  
    1414use Digest::MD5::File qw( file_md5_hex );
    1515use PS::IPP::PStamp::RequestFile qw( :standard );
    16 
    17 my $verbose;
    18 my $dbname;
    19 my $dbserver;
    20 my $job_id;
    21 my $redirect_output;
    22 my $output_base;
    23 
    24 my $host = hostname();
    25 
     16use IPC::Cmd 0.36 qw( can_run run );
     17
     18use PS::IPP::Metadata::Config;
     19#use PS::IPP::Metadata::Stats;
     20#use PS::IPP::Metadata::List qw( parse_md_list );
     21
     22use PS::IPP::Config qw( :standard );
     23
     24my ($job_id, $redirect_output, $outputBase, $rownum, $jobType);
     25my ($verbose, $dbname, $dbserver, $no_update);
    2626
    2727GetOptions(
    2828    'job_id=s'          =>  \$job_id,
    29     'output_base=s'     =>  \$output_base,
    30     'redirect-output'   => \$redirect_output,
     29    'job_type=s'        =>  \$jobType,
     30    'rownum=s'          =>  \$rownum,
     31    'output_base=s'     =>  \$outputBase,
     32    'redirect-output'   =>  \$redirect_output,
    3133    'dbname=s'          =>  \$dbname,
    3234    'dbserver=s'        =>  \$dbserver,
    3335    'verbose'           =>  \$verbose,
     36    'no-update'         =>  \$no_update,
    3437);
    3538
    3639
     40my $host = hostname();
    3741if ($verbose) {
    3842    print "\n\n";
     
    4145
    4246die "job_id is required" if !$job_id;
    43 die "output_base is required" if !$output_base;
    44 
    45 use IPC::Cmd 0.36 qw( can_run run );
    46 
    47 use PS::IPP::Metadata::Config;
    48 use PS::IPP::Metadata::Stats;
    49 use PS::IPP::Metadata::List qw( parse_md_list );
    50 
    51 use PS::IPP::Config qw($PS_EXIT_SUCCESS
    52                        $PS_EXIT_UNKNOWN_ERROR
    53                        $PS_EXIT_SYS_ERROR
    54                        $PS_EXIT_CONFIG_ERROR
    55                        $PS_EXIT_PROG_ERROR
    56                        $PS_EXIT_DATA_ERROR
    57                        $PS_EXIT_TIMEOUT_ERROR
    58                        metadataLookupStr
    59                        metadataLookupBool
    60                        caturi
    61                        );
     47
     48my_die( "job_type is required", $job_id, $PS_EXIT_PROG_ERROR) if !$jobType;
     49my_die("rownum is required", $job_id, $PS_EXIT_PROG_ERROR) if !$rownum;
     50my_die("output_base is required", $job_id, $PS_EXIT_PROG_ERROR) if !$outputBase;
     51
     52
    6253my $ipprc = PS::IPP::Config->new(); # IPP Configuration
    63 
    6454if ($redirect_output) {
    65     my $logDest = "$output_base.log";
    66     $ipprc->redirect_output($logDest);
    67 }
     55    my $logDest = "$outputBase.log";
     56    $ipprc->redirect_output($logDest)
     57        or my_die ("unable to redirect output to $logDest", $job_id, $PS_EXIT_UNKNOWN_ERROR);
     58}
     59
    6860
    6961if (!$dbserver) {
     
    7870
    7971if ($missing_tools) {
    80     warn("Can't find required tools.");
    81     exit ($PS_EXIT_CONFIG_ERROR);
     72    my_die("Can't find required tools", $job_id, $PS_EXIT_CONFIG_ERROR);
    8273}
    8374
    8475my $mdcParser = PS::IPP::Metadata::Config->new; # Parser for metadata config files
    85 
    86 my $psjob;
    87 #Look up the uri for the given job
    88 {
    89     my $command = "$pstamptool -pendingjob -job_id $job_id";
    90     $command .= " -dbname $dbname" if $dbname;
    91     $command .= " -dbserver $dbserver" if $dbserver;
    92     my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
    93         run(command => $command, verbose => $verbose);
    94     unless ($success) {
    95         die("Unable to perform pstamptool -pendingjob: $error_code");
    96     }
    97 
    98     if (@$stdout_buf == 0) {
    99         print STDERR "pending pstamp job id $job_id not found\n";
    100         exit 0;
    101     }
    102     my $metadata = $mdcParser->parse(join "", @$stdout_buf) or
    103         die("Unable to parse metdata config doc");
    104 
    105     my $jobs = parse_md_list($metadata);
    106     my $num = @$jobs;
    107     die "unexpected number of jobs $num found for job: $job_id" if $num > 1;
    108 
    109     $psjob = $jobs->[0];
    110 }
    111 
    112 if (!$psjob) {
    113     print STDERR "postage stamp job $job_id not found\n";
    114     exit 1;
    115 }
    116 
    117 my $rownum = $psjob->{rownum};
    118 my $uri = $psjob->{uri};
    119 my $outputBase = $psjob->{outputBase};
    120 my $jobType = $psjob->{jobType};
    121 #my $argString = $psjob->{args};
    12276
    12377my $jobStatus;
    12478if ($jobType eq "stamp") {
    125     open ARGSLIST, "<$uri" or die "failed to open argslist file $uri";
     79    my $argslist = "$outputBase.args";
     80    open ARGSLIST, "<$argslist" or my_die("failed to open argslist file $argslist", $job_id, $PS_EXIT_UNKNOWN_ERROR);
    12681    my $argString = <ARGSLIST>;
    12782    close ARGSLIST;
     
    12984
    13085    # XXX: should we do any other sanity checking?
    131     die "arglist file $uri is empty" if !$argString;
     86    my_die("arglist file $argslist is empty", $job_id, $PS_EXIT_DATA_ERROR) if !$argString;
    13287
    13388    my $command = "$ppstamp $outputBase $argString";
     
    13893
    13994    if ($success) {
    140         # XXX shouldn't need to do this, review schema`
    14195        my $dir = dirname($outputBase);
    14296
    14397        my $reglist = "$dir/reglist$job_id";
    14498
    145         open F, ">$reglist" or die "can't open $reglist for output";
    146 
    147         # figure out what output images we should expect
    148 
    149         # Note: we are assuming the contents of the filerules here.
    150         my @extensions = ( "fits", "mk.fits", "wt.fits");
    151 
    152         # we always require an image
     99        open F, ">$reglist" or my_die( "can't open $reglist for output", $job_id, $PS_EXIT_UNKNOWN_ERROR);
     100
     101        # Figure out what output images were produced
     102
     103        # Note: we are assuming the contents of the PSTAMP filerules here.
     104        my %extensions = ( $PSTAMP_SELECT_IMAGE  => "fits",
     105                           $PSTAMP_SELECT_MASK   => "mk.fits",
     106                           $PSTAMP_SELECT_WEIGHT => "wt.fits");
     107
     108        # we always create a stamp of the image
    153109        my $output_mask = $PSTAMP_SELECT_IMAGE;
    154110
    155         # we search the argString for -mask and -weight.
     111        # we search the argString for -mask and -variance.
    156112        # searching the arg string allows us to avoid adding a column in pstampJob
    157         # XXX yeah but does this make us susceptible to user input fouling us up?
    158         # For example, what if somebody sets the output base to file-mask-weight
    159         # TODO: clean this up
    160         $output_mask |= $PSTAMP_SELECT_MASK   if ($argString =~ /-mask/);
    161         $output_mask |= $PSTAMP_SELECT_WEIGHT if ($argString =~ /-weight/);
    162 
    163         # XXX we're getting a bit intimate with the bit field definitions here.
    164         # do better use a hash
    165 
    166         my $m = 1;
    167         foreach my $extension (@extensions) {
    168             my $do_this_one = $m & $output_mask;
    169             $m = $m << 1;
     113        $output_mask   |= $PSTAMP_SELECT_MASK   if ($argString =~ /-mask/);
     114        $output_mask   |= $PSTAMP_SELECT_WEIGHT if ($argString =~ /-variance/);
     115
     116        foreach my $key (keys (%extensions)) {
     117            my $do_this_one = $key & $output_mask;
     118
    170119            next if (! $do_this_one);
     120
     121            my $extension = $extensions{$key};
    171122
    172123            my $basename = basename($outputBase);
     
    183134    } else {
    184135        $jobStatus = $error_code >> 8;
    185         print STDERR "ppstamp failed with error code: $jobStatus\n";
     136        my_die( "ppstamp failed with error code: $jobStatus", $job_id, $jobStatus);
    186137    }
    187138} elsif ($jobType eq "get_image") {
     139    my_die( "get_image jobs not working right now", $job_id, $PS_EXIT_CONFIG_ERROR);
     140
     141    my $uri = "";
    188142    my $command = "$pstamp_get_image_job --job_id $job_id --uri $uri --out_dir $outputBase --rownum $rownum";
    189143    $command .= " --dbname $dbname" if $dbname;
     
    196150    } else {
    197151        $jobStatus = $error_code >> 8;
    198         print STDERR "ppstamp failed with error code: $jobStatus\n";
     152        my_die( "pstamp_get_image_job failed with error code: $jobStatus", $job_id, $jobStatus);
    199153    }
    200154} elsif ($jobType eq "detect_query") {
    201     die("multiple detect_query jobs not supported yet");
     155    my_die("detect_query jobs not supported yet", $job_id,$PS_EXIT_CONFIG_ERROR);
    202156} else {
    203     die("unknown jobType $jobType found");
    204 }
    205 
    206 # stop the job and set the result value
     157    my_die("unknown jobType $jobType found", $job_id, $PS_EXIT_PROG_ERROR);
     158}
     159
     160# mark the job stopped in the database
    207161{
    208     my $command = "$pstamptool -updatejob -job_id $job_id -state stop -fault $jobStatus";
     162    my $command = "$pstamptool -updatejob -job_id $job_id -state stop";
    209163    $command .= " -dbname $dbname" if $dbname;
    210164    $command .= " -dbserver $dbserver" if $dbserver;
    211     my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
    212         run(command => $command, verbose => $verbose);
    213     unless ($success) {
    214         die("Unable to perform $command: $error_code");
    215     }
    216 }
    217 
    218 exit $jobStatus;
     165    if (!$no_update) {
     166        my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     167            run(command => $command, verbose => $verbose);
     168        unless ($success) {
     169            die("Unable to perform $command: $error_code");
     170        }
     171    } else {
     172        print STDERR "skipping command: $command\n"
     173    }
     174}
     175
     176exit 0;
    219177
    220178# create a string to be passed as input to dsreg when registering this file in a fileset
     
    227185    if (-e $path) {
    228186        my @finfo = stat($path);
    229         die "failed to stat $path" unless (@finfo);    # XXX clean up
     187        my_die("failed to stat $path", $job_id, $PS_EXIT_UNKNOWN_ERROR) unless (@finfo);
    230188        my $bytes = $finfo[7];
    231189        my $md5sum = file_md5_hex($path);
     
    233191        return "$filename|$bytes|$md5sum|$filetype|";
    234192    } else {
    235         die "$filename not found at $path";
    236     }
    237 }
     193        my_die("$filename not found at $path", $job_id, $PS_EXIT_UNKNOWN_ERROR);
     194    }
     195}
     196
     197sub my_die
     198{
     199    my $msg = shift;            # Warning message on die
     200    my $job_id = shift;         # job identifier
     201    my $exit_code = shift;      # Exit code to add
     202
     203    $exit_code = $PS_EXIT_PROG_ERROR unless defined $exit_code;
     204
     205    carp($msg);
     206    if (defined $job_id and not $no_update) {
     207        my $command = "$pstamptool -updatejob";
     208        $command .= " -job_id $job_id";
     209        $command .= " -fault $exit_code";
     210        $command .= " -dbname $dbname" if defined $dbname;
     211        $command .= " -dbserver $dbserver" if defined $dbserver;
     212        system($command);
     213    }
     214    exit $exit_code;
     215}
     216
Note: See TracChangeset for help on using the changeset viewer.