def build_job(self, session): """Produce the Job for this operation. Return the Job object that has to be sent to Workers to have them perform the operation this object describes. session (Session): the database session to use to fetch objects if necessary. return (Job): the job encoding of the operation, as understood by Workers and TaskTypes. """ result = None dataset = Dataset.get_from_id(self.dataset_id, session) if self.type_ == ESOperation.COMPILATION: submission = Submission.get_from_id(self.object_id, session) result = CompilationJob.from_submission(submission, dataset) elif self.type_ == ESOperation.EVALUATION: submission = Submission.get_from_id(self.object_id, session) result = EvaluationJob.from_submission(submission, dataset, self.testcase_codename) elif self.type_ == ESOperation.USER_TEST_COMPILATION: user_test = UserTest.get_from_id(self.object_id, session) result = CompilationJob.from_user_test(user_test, dataset) elif self.type_ == ESOperation.USER_TEST_EVALUATION: user_test = UserTest.get_from_id(self.object_id, session) result = EvaluationJob.from_user_test(user_test, dataset) return result
def build_job(self, session): """Produce the Job for this operation. Return the Job object that has to be sent to Workers to have them perform the operation this object describes. session (Session): the database session to use to fetch objects if necessary. return (Job): the job encoding of the operation, as understood by Workers and TaskTypes. """ result = None dataset = Dataset.get_from_id(self.dataset_id, session) if self.type_ == ESOperation.COMPILATION: submission = Submission.get_from_id(self.object_id, session) result = CompilationJob.from_submission(submission, dataset) elif self.type_ == ESOperation.EVALUATION: submission = Submission.get_from_id(self.object_id, session) result = EvaluationJob.from_submission( submission, dataset, self.testcase_codename) elif self.type_ == ESOperation.USER_TEST_COMPILATION: user_test = UserTest.get_from_id(self.object_id, session) result = CompilationJob.from_user_test(user_test, dataset) elif self.type_ == ESOperation.USER_TEST_EVALUATION: user_test = UserTest.get_from_id(self.object_id, session) result = EvaluationJob.from_user_test(user_test, dataset) return result
def acquire_worker(self, job, side_data=None): """Tries to assign a job to an available worker. If no workers are available then this returns None, otherwise this returns the chosen worker. job (job): the job to assign to a worker side_data (object): object to attach to the worker for later use returns (int): None if no workers are available, the worker assigned to the job otherwise """ # We look for an available worker try: shard = self.find_worker(WorkerPool.WORKER_INACTIVE, require_connection=True, random_worker=True) except LookupError: return None # Then we fill the info for future memory self._job[shard] = job self._start_time[shard] = make_datetime() self._side_data[shard] = side_data logger.debug("Worker %s acquired." % shard) # And finally we ask the worker to do the job action, object_id = job timestamp = side_data[1] queue_time = self._start_time[shard] - timestamp logger.info( "Asking worker %s to %s submission/user test %d " " (%s after submission)." % (shard, action, object_id, queue_time) ) with SessionGen(commit=False) as session: if action == EvaluationService.JOB_TYPE_COMPILATION: submission = Submission.get_from_id(object_id, session) job_ = CompilationJob.from_submission(submission) elif action == EvaluationService.JOB_TYPE_EVALUATION: submission = Submission.get_from_id(object_id, session) job_ = EvaluationJob.from_submission(submission) elif action == EvaluationService.JOB_TYPE_TEST_COMPILATION: user_test = UserTest.get_from_id(object_id, session) job_ = CompilationJob.from_user_test(user_test) elif action == EvaluationService.JOB_TYPE_TEST_EVALUATION: user_test = UserTest.get_from_id(object_id, session) job_ = EvaluationJob.from_user_test(user_test) job_.get_output = True job_.only_execution = True self._worker[shard].execute_job( job_dict=job_.export_to_dict(), callback=self._service.action_finished.im_func, plus=(action, object_id, side_data, shard), ) return shard
def debugSubmission(submission_id, dataset_id, testcase_codename): config.keep_sandbox = True file_cacher = FileCacher() with SessionGen() as session: submission = session.query(Submission)\ .filter(Submission.id == submission_id)\ .first() if submission is None: logger.error("There's no submission with id %d" % submission_id) return False if dataset_id is None: dataset = submission.task.active_dataset dataset_id = submission.task.active_dataset_id else: dataset = session.query(Dataset)\ .filter(Dataset.id == dataset_id)\ .first() # Compilation operation = ESOperation(ESOperation.COMPILATION, submission_id, dataset_id) comp_job = CompilationJob.from_submission(operation, submission, dataset) task_type = get_task_type(comp_job.task_type, comp_job.task_type_parameters) task_type.execute_job(comp_job, file_cacher) for sandbox_path in comp_job.sandboxes: logger.info("Compilation sandbox created in %s" % sandbox_path) # Check if the compilation is successful result = submission.get_result(dataset) if result is None or result.compilation_failed(): logger.error("Compilatoin Failed") return True # Evaluation operation = ESOperation(ESOperation.EVALUATION, submission_id, dataset_id, testcase_codename) eval_job = EvaluationJob.from_submission(operation, submission, dataset) task_type = get_task_type(eval_job.task_type, eval_job.task_type_parameters) task_type.execute_job(eval_job, file_cacher) for sandbox_path in eval_job.sandboxes: logger.info("Evaluation sandbox created in %s" % sandbox_path) return True