IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Oct 21, 2010, 2:45:13 PM (16 years ago)
Author:
eugene
Message:

merge changes from trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20100823/ippTools/src/pstamptool.c

    r28937 r29515  
    4646static bool pendingjobMode(pxConfig *config);
    4747static bool updatejobMode(pxConfig *config);
     48static bool stopdependentjobMode(pxConfig *config);
    4849static bool revertjobMode(pxConfig *config);
    4950static bool addprojectMode(pxConfig *config);
     
    6364    break;
    6465
     66// XXX make this a configurable parameter
     67#define PSTAMP_MAX_JOB_FAULTS 5
     68#define PSTAMP_MAX_DEP_FAULTS 5
    6569
    6670int main(int argc, char **argv)
     
    8993        MODECASE(PSTAMPTOOL_MODE_PENDINGJOB, pendingjobMode);
    9094        MODECASE(PSTAMPTOOL_MODE_UPDATEJOB, updatejobMode);
     95        MODECASE(PSTAMPTOOL_MODE_STOPDEPENDENTJOB, stopdependentjobMode);
    9196        MODECASE(PSTAMPTOOL_MODE_REVERTJOB, revertjobMode);
    9297        MODECASE(PSTAMPTOOL_MODE_ADDPROJECT, addprojectMode);
     
    715720            outputBase,
    716721            options,
    717             dep_id
     722            dep_id,
     723            0   // fault_count
    718724            )) {
    719725        psError(PS_ERR_UNKNOWN, false, "database error");
     
    877883    PXOPT_LOOKUP_S64(req_id,    config->args, "-req_id", false, false);
    878884    PXOPT_LOOKUP_S64(dep_id,    config->args, "-dep_id", false, false);
    879 
    880     if (!job_id && !req_id && !dep_id) {
    881         psError(PS_ERR_UNKNOWN, true, "at least one of -job_id -req_id or -dep_id is required");
     885    PXOPT_LOOKUP_S32(fault_count, config->args, "-fault_count",  false, false);
     886
     887    if (!job_id && !req_id && !dep_id && !fault_count) {
     888        psError(PS_ERR_UNKNOWN, true, "at least one of -job_id -req_id -dep_id or -fault_count is required");
    882889        return false;
    883890    }
     
    898905    PXOPT_COPY_S32(config->args, where, "-fault",  "pstampJob.fault", "==");
    899906    PXOPT_COPY_STR(config->args, where, "-state",  "pstampJob.state", "==");
     907    PXOPT_COPY_S32(config->args, where, "-fault_count", "pstampJob.fault_count", ">=");
     908    pxAddLabelSearchArgs(config, where, "-label", "pstampRequest.label", "LIKE");
    900909
    901910    psString query = pxDataGet("pstamptool_updatejob.sql");
     
    909918        psStringAppend(&query, "\n %c pstampJob.fault = %d", c, fault);
    910919        c = ',';
     920        psStringAppend(&query, ", pstampJob.fault_count = pstampJob.fault_count+ 1");
    911921    }
    912922   
     
    925935    psU64 affected = psDBAffectedRows(config->dbh);
    926936    psLogMsg("pstamptool", PS_LOG_INFO, "Updated %" PRIu64 " pstampJobs", affected);
     937
     938    return true;
     939}
     940// Terminate jobs which have dependents setting both the pstampDependent and pstampJob.fault
     941static bool stopdependentjobMode(pxConfig *config)
     942{
     943    PS_ASSERT_PTR_NON_NULL(config, false);
     944
     945    PXOPT_LOOKUP_S32(fault,  config->args, "-set_fault",  true, false);
     946
     947    psMetadata *where = psMetadataAlloc();
     948
     949    PXOPT_COPY_S64(config->args, where, "-req_id", "req_id", "==");
     950    PXOPT_COPY_S64(config->args, where, "-job_id", "job_id", "==");
     951    PXOPT_COPY_S64(config->args, where, "-dep_id", "dep_id", "==");
     952    PXOPT_COPY_S32(config->args, where, "-fault",  "pstampDependent.fault", "==");
     953    pxAddLabelSearchArgs(config, where, "-label", "pstampRequest.label", "LIKE");
     954    // if (fault_count) {
     955        PXOPT_COPY_S32(config->args, where, "-fault_count", "pstampDependent.fault_count", ">=");
     956    // }
     957
     958    // XXX: How about selecting by pstampRequest.label? No. That is too dangerous by itself.
     959
     960    psString query = pxDataGet("pstamptool_stopdependentjob.sql");
     961
     962    if (psListLength(where->list)) {
     963        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
     964        psStringAppend(&query, " AND %s", whereClause);
     965        psFree(whereClause);
     966    } else {
     967        psFree(where);
     968        psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
     969        return false;
     970    }
     971    psFree(where);
     972
     973    if (!p_psDBRunQueryF(config->dbh, query, fault, fault)) {
     974        psError(PS_ERR_UNKNOWN, false, "database error");
     975        psFree(query);
     976        return false;
     977    }
     978    psFree(query);
     979
     980    psU64 affected = psDBAffectedRows(config->dbh);
     981    psLogMsg("pstamptool", PS_LOG_INFO, "Updated %" PRIu64 " pstampJobs and pstampDependents", affected);
    927982
    928983    return true;
     
    941996    pxAddLabelSearchArgs(config, where, "-label", "pstampRequest.label", "LIKE");
    942997
     998    PXOPT_LOOKUP_BOOL(clear_fault_count, config->args, "-clear_fault_count", false);
     999
    9431000    PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
     1001
     1002    // XXX: we don't actually use -limit. It doesn't work for UPDATE
     1003    // it's an allowed arg because add_poll_args adds it
    9441004    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
    9451005    PXOPT_LOOKUP_S16(fault, config->args, "-fault",  false, false);
     
    9471007    // By default only revert faults < PSTAMP_FIRST_ERROR_CODE which are our "ipp exit codes"
    9481008    // codes larger than that are the pstamp request interface.
    949     // Don't fault those unless -fault waa provided
     1009    // Don't fault those unless -fault was explicitly provided
    9501010    psString faultClause = psStringCopy("");
    9511011    if (!fault) {
     
    9661026    psFree(where);
    9671027
    968     if (!p_psDBRunQueryF(config->dbh, query, faultClause)) {
     1028    // don't keep reverting once the number of faults reaches some value unless
     1029    // a parameter asking us to clear that count is provided
     1030    psString faultCountClause = NULL;
     1031    if (clear_fault_count) {
     1032        psStringAppend(&faultCountClause, "\n, pstampJob.fault_count = 0");
     1033    } else {
     1034        psStringAppend(&query, " AND pstampJob.fault_count < %d", PSTAMP_MAX_JOB_FAULTS);
     1035    }
     1036
     1037    if (!p_psDBRunQueryF(config->dbh, query, faultCountClause, faultClause)) {
     1038        psFree(faultCountClause);
    9691039        psFree(faultClause);
    9701040        psFree(query);
     
    9741044
    9751045    psFree(faultClause);
     1046    psFree(faultCountClause);
     1047    psFree(query);
    9761048
    9771049    return true;
     
    11781250        need_magic,
    11791251        outdir,
    1180         0               // fault
     1252        0,              // fault
     1253        0               // fault_count
    11811254        )) {
    11821255        if (!psDBRollback(config->dbh)) {
     
    13001373        psStringAppend(&query, "%s fault = %d", needComma ? ", " : "", fault);
    13011374        needComma = true;
     1375        psStringAppend(&query, ", pstampDependent.fault_count = pstampDependent.fault_count + 1");
    13021376    }
    13031377    psStringAppend(&query, " WHERE dep_id = %" PRId64, dep_id);
     
    13251399    PXOPT_COPY_S64(config->args, where, "-fault", "pstampDependent.fault", "==");
    13261400    PXOPT_COPY_S64(config->args, where, "-dep_id", "dep_id", "==");
     1401    PXOPT_COPY_S64(config->args, where, "-job_id", "job_id", "==");
     1402    PXOPT_COPY_S64(config->args, where, "-req_id", "req_id", "==");
    13271403    pxAddLabelSearchArgs(config, where, "-label", "pstampRequest.label", "==");
     1404    PXOPT_LOOKUP_BOOL(clear_fault_count, config->args, "-clear_fault_count", false);
     1405
     1406    // XXX: we don't actually use -limit. It doesn't work for UPDATE
     1407    // it's an allowed arg because add_poll_args adds it
     1408    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
    13281409
    13291410    if (!psListLength(where->list)) {
     
    13521433    }
    13531434
    1354     if (!p_psDBRunQuery(config->dbh, query)) {
     1435    // don't keep reverting once the number of faults reaches some value unless
     1436    // a parameter asking us to clear that count is provided
     1437    psString faultCountClause = NULL;
     1438    if (clear_fault_count) {
     1439        psStringAppend(&faultCountClause, "\n, pstampDependent.fault_count = 0");
     1440    } else {
     1441        psStringAppend(&faultCountClause, " ");
     1442        psStringAppend(&query, " AND pstampDependent.fault_count < %d", PSTAMP_MAX_DEP_FAULTS);
     1443    }
     1444
     1445    if (!p_psDBRunQueryF(config->dbh, query, faultCountClause)) {
    13551446        psError(PS_ERR_UNKNOWN, false, "database error");
    13561447        psFree(query);
Note: See TracChangeset for help on using the changeset viewer.