|
|
|
@ -86,6 +86,10 @@ class CandidateGone(Exception):
|
|
|
|
|
"""Exception indicating a job candidate is no longer available"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class JobCancelled(Exception):
|
|
|
|
|
"""Exception indicating a job was cancelled by an operator after we had claimed it."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Cutter(object):
|
|
|
|
|
NO_CANDIDATES_RETRY_INTERVAL = 1
|
|
|
|
|
ERROR_RETRY_INTERVAL = 5
|
|
|
|
@ -125,7 +129,10 @@ class Cutter(object):
|
|
|
|
|
self.claim_job(job)
|
|
|
|
|
except CandidateGone:
|
|
|
|
|
continue
|
|
|
|
|
try:
|
|
|
|
|
self.cut_job(job)
|
|
|
|
|
except JobCancelled:
|
|
|
|
|
self.logger.info("Job was cancelled while we were cutting it: {}".format(format_job(job)))
|
|
|
|
|
|
|
|
|
|
def refresh_conn(self):
|
|
|
|
|
"""After errors, we reconnect in case the error was connection-related."""
|
|
|
|
@ -332,6 +339,10 @@ class Cutter(object):
|
|
|
|
|
))
|
|
|
|
|
result = query(self.conn, built_query, id=job.id, name=self.name, **kwargs)
|
|
|
|
|
if result.rowcount != 1:
|
|
|
|
|
# If we hadn't yet set finalizing, then this means an operator cancelled the job
|
|
|
|
|
# while we were cutting it. This isn't a problem.
|
|
|
|
|
if not finalize_begun:
|
|
|
|
|
raise JobCancelled()
|
|
|
|
|
raise JobConsistencyError("No job with id {} and uploader {} when setting: {}".format(
|
|
|
|
|
job.id, self.name, ", ".join("{} = {!r}".format(k, v) for k, v in kwargs.items())
|
|
|
|
|
))
|
|
|
|
@ -372,7 +383,7 @@ class Cutter(object):
|
|
|
|
|
tags=self.tags + [job.category, job.sheet_name],
|
|
|
|
|
data=upload_wrapper(),
|
|
|
|
|
)
|
|
|
|
|
except (JobConsistencyError, UploadError):
|
|
|
|
|
except (JobConsistencyError, JobCancelled, UploadError):
|
|
|
|
|
raise # this ensures these aren't not caught in the except Exception block
|
|
|
|
|
except Exception as ex:
|
|
|
|
|
self.refresh_conn()
|
|
|
|
|