def submit_jobs(): """ Submits jobs to the queue for processing. ***NOTE: Priority is given to jobs with status 'retrying'. """ jobs = [] special_query1 = "SELECT distinct j.* FROM jobs AS j JOIN job_files AS jf " \ "ON j.id=jf.job_id JOIN files AS f ON f.id=jf.file_id WHERE " \ "j.status in ('new','retrying') AND f.filename LIKE " \ "'%p2030.2019____.G__.%.fits' ORDER BY j.updated_at ASC" special_query2 = "SELECT distinct j.* FROM jobs AS j JOIN job_files AS jf " \ "ON j.id=jf.job_id JOIN files AS f ON f.id=jf.file_id WHERE " \ "j.status in ('new','retrying') AND f.filename LIKE " \ "'%p2030.2018____.G__.%.fits' ORDER BY j.updated_at ASC" special_query3 = "SELECT distinct j.* FROM jobs AS j JOIN job_files AS jf " \ "ON j.id=jf.job_id JOIN files AS f ON f.id=jf.file_id WHERE " \ "j.status in ('new','retrying') AND f.filename LIKE " \ "'%p2030.2019____.G___.%.fits' ORDER BY j.updated_at ASC" special_query4 = "SELECT distinct j.* FROM jobs AS j JOIN job_files AS jf " \ "ON j.id=jf.job_id JOIN files AS f ON f.id=jf.file_id WHERE " \ "j.status in ('new','retrying') AND f.filename LIKE " \ "'%p2030.2018____.G___.%.fits' ORDER BY j.updated_at ASC" if not len(jobs): jobs.extend(jobtracker.query(special_query1)) print len(jobs),"in inner galaxy (2019 data)." jobs.extend(jobtracker.query(special_query2)) print len(jobs),"in inner galaxy (2018 data)." if len(jobs)<50: jobs.extend(jobtracker.query(special_query3)) print len(jobs),"in outer galaxy (2019 data)." jobs.extend(jobtracker.query(special_query4)) print len(jobs),"in outer galaxy (2018 data)." if len(jobs)<50: jobs.extend(jobtracker.query("SELECT * FROM jobs " \ "WHERE status='retrying' " \ "ORDER BY updated_at ASC")) jobs.extend(jobtracker.query("SELECT * FROM jobs " \ "WHERE status='new'" \ "ORDER BY updated_at ASC")) for job in jobs[:500]: if config.jobpooler.queue_manager.can_submit(): try: submit(job) if config.jobpooler.submit_sleep: time.sleep(config.jobpooler.submit_sleep) #time.sleep(5) except: fn = pipeline_utils.get_fns_for_jobid(job['id'])[0] fn = fn.split('results/')[-1] print "Skipping job-id: %d (%s)"%(job['id'],fn) else: break
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']) try: outdir = get_output_dir(fns) # Submit job queue_id = config.jobpooler.queue_manager.submit(fns, outdir) 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) except pipeline_utils.PipelineError: # 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 = [] 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.query(queries)
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']) bad_days = [ '20170414', '20170419', '20170420', '20170423', '20170423', '20170427', '20170429', '20170503', '20170510', '20170516' ] bad_beams = ['b5', 'b6'] for bad_day in bad_days: if bad_day in fns[0]: if (bad_beams[0] in fns[0]) or (bad_beams[1] in fns[0]): print "Files affected by the bad beams 5, 6 60Hz signal: ", fns print "Will delete the raw data files." queries = [] arglist = [] queries.append("INSERT INTO job_submits (" \ "job_id, " \ "status, " \ "created_at, " \ "updated_at, " \ "details) " \ "VALUES (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'Beams 5 and 6', \ jobtracker.nowstr(), jobtracker.nowstr(), \ "Affected by 60Hz signal") ) queries.append("UPDATE jobs " \ "SET status='terminal_failure', " \ "details='Beams 5 and 6 affected by 60Hz signal', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) return try: presubmission_check(fns) print "\t file has been checked" outdir, created = get_output_dir(fns) if not created: #current_usr = getpass.getuser() #errormsg = "Permission denied to %s when attempting to create output directory %s"%(current_usr,outdir) #f = open('/scratch/eparent/eparent/PALFA4/results/missing_permission.out','a') #f.write(errormsg+'\n') #f.close() print "Permission issues while creating output directory, skipping" pass # Attempt to submit the job if job_row['status'] == 'retrying': ## ppn=2 ppn = 1 tfact = 1.25 else: ppn = 1 tfact = 1. if config.jobpooler.alternative_submit_script: print "Submitting:", config.jobpooler.alternative_submit_script queue_id = config.jobpooler.queue_manager.submit\ (fns, outdir, job_row['id'],\ script=config.jobpooler.alternative_submit_script,\ ppn=ppn) else: queue_id = config.jobpooler.queue_manager.submit(fns, outdir, job_row['id'], ppn=ppn, tfact=tfact) 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) 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.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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'precheck_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='terminal_failure', " \ "details='Failed presubmission check', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'submission_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='failed', " \ "details='Error while submitting job', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) 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 except (MissingFilesError): # Unexpected error exceptionmsgs = traceback.format_exception(*sys.exc_info()) errormsg = "Job ID: %d " % job_row['id'] errormsg += "Raw data files missing from /scratch/ area.!\n\n" errormsg += "".join(exceptionmsgs) queries = [] arglist = [] queries.append("INSERT INTO job_submits (" \ "job_id, " \ "status, " \ "created_at, " \ "updated_at, " \ "details) " \ "VALUES (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'submission_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='failed',details='Error while submitting job',updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) print errormsg
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']) try: presubmission_check(fns) outdir = get_output_dir(fns) # Attempt to submit the job queue_id = config.jobpooler.queue_manager.submit\ (fns, outdir, job_row['id']) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'precheck_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='terminal_failure', " \ "details='Failed presubmission check', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append( (jobtracker.nowstr(), job_row['id']) ) jobtracker.execute(queries, arglist) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'submission_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='failed', " \ "details='Error while submitting job', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append( (jobtracker.nowstr(), job_row['id']) ) jobtracker.execute(queries, arglist) 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)
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']) try: outdir = get_output_dir(fns) # Submit job queue_id = config.jobpooler.queue_manager.submit(fns, outdir) 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) except pipeline_utils.PipelineError: # 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 = [] 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.query(queries)
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']) try: presubmission_check(fns) outdir = get_output_dir(fns) # Attempt to submit the job queue_id = config.jobpooler.queue_manager.submit\ (fns, outdir, job_row['id']) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'precheck_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='terminal_failure', " \ "details='Failed presubmission check', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'submission_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='failed', " \ "details='Error while submitting job', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) 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)
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']) try: outdir = get_output_dir(fns) # Attempt to submit the job queue_id = config.jobpooler.queue_manager.submit\ (fns, outdir, job_row['id']) 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 (?, ?, ?, ?, ?)" ) arglist.append( ( job_row['id'], 'submission_failed', \ jobtracker.nowstr(), jobtracker.nowstr(), \ errormsg) ) queries.append("UPDATE jobs " \ "SET status='failed', " \ "details='Error while submitting job', " \ "updated_at=? " \ "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row['id'])) jobtracker.execute(queries, arglist) 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)
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"]) try: outdir = get_output_dir(fns) # Attempt to submit the job queue_id = config.jobpooler.queue_manager.submit(fns, outdir, job_row["id"]) 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 (?, ?, ?, ?, ?)" ) arglist.append((job_row["id"], "submission_failed", jobtracker.nowstr(), jobtracker.nowstr(), errormsg)) queries.append( "UPDATE jobs " "SET status='failed', " "details='Error while submitting job', " "updated_at=? " "WHERE id=?" ) arglist.append((jobtracker.nowstr(), job_row["id"])) jobtracker.execute(queries, arglist) 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)
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)