예제 #1
0
def submit(job_row):
    """
    Submits a job to QueueManager, if successful will store returned queue id.

    Input:
        job_row: A row from the jobs table. The datafiles associated
            with this job will be submitted to be processed.
    Outputs:
        None
    """
    fns = pipeline_utils.get_fns_for_jobid(job_row["id"])

    script = os.path.join(config.basic.pipelinedir, "bin", "%s_search.py" % config.basic.survey)

    # Specify requested resources for job submission
    if job_row["task"] == "rfifind":
        res = [4 * 60 * 60, 1024, 25]
    elif "search" in job_row["task"]:
        res = [165240, 1024, 28]  # 45.9 hrs
    elif job_row["task"] == "sifting":  # Sifting should be quick
        res = [30 * 60, 256, 5]
    elif "folding" in job_row["task"]:
        res = [96 * 60 * 60, 3000, 28]
    # elif job_row['task']=='tidyup':
    #    res = [30*60, 256, 5]
    options = job_row["task"]

    try:
        SPAN512_job.presubmission_check(fns)
        outdir = SPAN512_job.get_output_dir(fns)
        # Attempt to submit the job
        queue_id = config.jobpooler.queue_manager.submit(
            fns, outdir, job_row["id"], resources=res, script=script, opts=options
        )
    except (FailedPreCheckError):
        # Error caught during presubmission check.
        exceptionmsgs = traceback.format_exception(*sys.exc_info())
        errormsg = "Job ID: %d " % job_row["id"]
        errormsg += "failed presubmission check!\n\n"
        errormsg += "".join(exceptionmsgs)

        jobpool_cout.outs("Job ID: %d failed presubmission check!\n\t%s\n" % (job_row["id"], exceptionmsgs[-1]))

        if config.email.send_on_terminal_failures:
            # Send error email
            msg = "Presubmission check failed!\n"
            msg += "Job ID: %d\n\n" % (job_row["id"])
            msg += errormsg
            msg += "\n*** Job has been terminally failed. ***\n"
            msg += "*** Job will NOT be re-submitted! ***\n"
            if config.basic.delete_rawdata:
                jobpool_cout.outs("Job #%d will NOT be retried. " "Data files will be deleted." % job_row["id"])
                msg += "*** Raw data files will be deleted. ***\n"
            else:
                jobpool_cout.outs("Job #%d will NOT be retried. " % job_row["id"])
            notification = mailer.ErrorMailer(msg, subject="Job failed presubmission check - Terminal")
            notification.send()

        if config.basic.delete_rawdata:
            pipeline_utils.clean_up(job_row["id"])

        queries = []
        arglist = []
        queries.append(
            "INSERT INTO job_submits ("
            "job_id, "
            "status, "
            "created_at, "
            "updated_at, "
            "details) "
            "VALUES (%d, %s, '%s', '%s', %s)"
            % (job_row["id"], "precheck_failed", jobtracker.nowstr(), jobtracker.nowstr(), errormsg)
        )
        queries.append(
            "UPDATE jobs "
            "SET status='terminal_failure', "
            "details='Failed presubmission check', "
            "updated_at='%s'"
            "WHERE id=%d" % (jobtracker.nowstr(), job_row["id"])
        )
        jobtracker.query(queries)

    except (queue_managers.QueueManagerJobFatalError, datafile.DataFileError):
        # Error caught during job submission.
        exceptionmsgs = traceback.format_exception(*sys.exc_info())
        errormsg = "Error while submitting job!\n"
        errormsg += "\tJob ID: %d\n\n" % job_row["id"]
        errormsg += "".join(exceptionmsgs)

        jobpool_cout.outs("Error while submitting job!\n" "\tJob ID: %d\n\t%s\n" % (job_row["id"], exceptionmsgs[-1]))

        queries = []
        arglist = []
        queries.append(
            "INSERT INTO job_submits ("
            "job_id, "
            "status, "
            "created_at, "
            "updated_at, "
            "details) "
            "VALUES (%d, %s, '%s', '%s', %s)"
            % (job_row["id"], "submission_failed", jobtracker.nowstr(), jobtracker.nowstr(), errormsg)
        )
        queries.append(
            "UPDATE jobs "
            "SET status='failed', "
            "details='Error while submitting job', "
            "updated_at='%s' "
            "WHERE id=%d" % (jobtracker.nowstr(), job_row["id"])
        )
        jobtracker.execute(queries)
    except queue_managers.QueueManagerNonFatalError:
        # Do nothing. Don't submit the job. Don't mark the job as 'submitted'.
        # Don't mark the job as 'failed'. The job submission will be retried.
        pass
    except queue_managers.QueueManagerFatalError:
        # A fatal error occurred. Re-raise!
        raise
    else:
        # No error occurred
        msg = "Submitted job to process:\n"
        msg += "\tJob ID: %d, Queue ID: %s\n" % (job_row["id"], queue_id)
        msg += "\tData file(s):\n"
        for fn in fns:
            msg += "\t%s\n" % fn
        jobpool_cout.outs(msg)
        queries = []
        queries.append(
            "INSERT INTO job_submits ("
            "job_id, "
            "queue_id, "
            "output_dir, "
            "status, "
            "created_at, "
            "updated_at, "
            "details) "
            "VALUES (%d,'%s','%s','%s','%s','%s','%s')"
            % (
                job_row["id"],
                queue_id,
                outdir,
                "running",
                jobtracker.nowstr(),
                jobtracker.nowstr(),
                "Job submitted to queue",
            )
        )
        queries.append(
            "UPDATE jobs "
            "SET status='submitted', "
            "details='Job submitted to queue', "
            "updated_at='%s' "
            "WHERE id=%d" % (jobtracker.nowstr(), job_row["id"])
        )
        jobtracker.query(queries)