def on_internal_error(self, packet): try: raise ValueError('\n\n' + packet['message']) except ValueError: logger.exception('Judge %s failed while handling submission %s', self.name, packet['submission-id']) self._free_self(packet) id = packet['submission-id'] if Submission.objects.filter(id=id).update(status='IE', result='IE', error=packet['message']): event.post('sub_%s' % Submission.get_id_secret(id), {'type': 'internal-error'}) self._post_update_submission(id, 'internal-error', done=True) json_log.info( self._make_json_log(packet, action='internal-error', message=packet['message'], finish=True, result='IE')) else: logger.warning('Unknown submission: %s', id) json_log.error( self._make_json_log(packet, action='internal-error', info='unknown submission', message=packet['message'], finish=True, result='IE'))
def on_submission_terminated(self, packet): logger.info('%s: Submission aborted: %s', self.name, packet['submission-id']) self._free_self(packet) if Submission.objects.filter(id=packet['submission-id']).update( status='AB', result='AB'): event.post( 'sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'aborted-submission'}) self._post_update_submission(packet['submission-id'], 'terminated', done=True) json_log.info( self._make_json_log(packet, action='aborted', finish=True, result='AB')) else: logger.warning('Unknown submission: %s', packet['submission-id']) json_log.error( self._make_json_log(packet, action='aborted', info='unknown submission', finish=True, result='AB'))
def on_grading_begin(self, packet): logger.info('%s: Grading has begun on: %s', self.name, packet['submission-id']) self.batch_id = None if Submission.objects.filter(id=packet['submission-id']).update( status='G', is_pretested=packet['pretested'], current_testcase=1, batch=False, judged_date=timezone.now()): SubmissionTestCase.objects.filter( submission_id=packet['submission-id']).delete() event.post( 'sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'grading-begin'}) self._post_update_submission(packet['submission-id'], 'grading-begin') json_log.info(self._make_json_log(packet, action='grading-begin')) else: logger.warning('Unknown submission: %s', packet['submission-id']) json_log.error( self._make_json_log(packet, action='grading-begin', info='unknown submission'))
def on_compile_error(self, packet): logger.info('%s: Submission failed to compile: %s', self.name, packet['submission-id']) self._free_self(packet) if Submission.objects.filter(id=packet['submission-id']).update( status='CE', result='CE', error=packet['log']): event.post( 'sub_%s' % Submission.get_id_secret(packet['submission-id']), { 'type': 'compile-error', 'log': packet['log'], }) self._post_update_submission(packet['submission-id'], 'compile-error', done=True) json_log.info( self._make_json_log(packet, action='compile-error', log=packet['log'], finish=True, result='CE')) else: logger.warning('Unknown submission: %s', packet['submission-id']) json_log.error( self._make_json_log(packet, action='compile-error', info='unknown submission', log=packet['log'], finish=True, result='CE'))
def on_internal_error(self, packet): super(DjangoJudgeHandler, self).on_internal_error(packet) id = packet['submission-id'] if Submission.objects.filter(id=id).update(status='IE', result='IE', error=packet['message']): event.post('sub_%s' % Submission.get_id_secret(id), {'type': 'internal-error'}) self._post_update_submission(id, 'internal-error', done=True) json_log.info( self._make_json_log(packet, action='internal-error', message=packet['message'], finish=True, result='IE')) else: logger.warning('Unknown submission: %d', id) json_log.error( self._make_json_log(packet, action='internal-error', info='unknown submission', message=packet['message'], finish=True, result='IE'))
def on_compile_error(self, packet): super(DjangoJudgeHandler, self).on_compile_error(packet) if Submission.objects.filter(id=packet['submission-id']).update( status='CE', result='CE', error=packet['log']): event.post( 'sub_%s' % Submission.get_id_secret(packet['submission-id']), { 'type': 'compile-error', 'log': packet['log'] }) self._post_update_submission(packet['submission-id'], 'compile-error', done=True) json_log.info( self._make_json_log(packet, action='compile-error', log=packet['log'], finish=True, result='CE')) else: logger.warning('Unknown submission: %d', packet['submission-id']) json_log.error( self._make_json_log(packet, action='compile-error', info='unknown submission', log=packet['log'], finish=True, result='CE'))
def on_submission_processing(self, packet): id = packet['submission-id'] if Submission.objects.filter(id=id).update(status='P', judged_on=self.judge): event.post('sub_%s' % Submission.get_id_secret(id), {'type': 'processing'}) self._post_update_submission(id, 'processing') json_log.info(self._make_json_log(packet, action='processing')) else: logger.warning('Unknown submission: %d', id) json_log.error(self._make_json_log(packet, action='processing', info='unknown submission'))
def on_compile_message(self, packet): logger.info('%s: Submission generated compiler messages: %s', self.name, packet['submission-id']) if Submission.objects.filter(id=packet['submission-id']).update(error=packet['log']): event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'compile-message'}) json_log.info(self._make_json_log(packet, action='compile-message', log=packet['log'])) else: logger.warning('Unknown submission: %s', packet['submission-id']) json_log.error(self._make_json_log(packet, action='compile-message', info='unknown submission', log=packet['log']))
def on_compile_message(self, packet): super(DjangoJudgeHandler, self).on_compile_message(packet) if Submission.objects.filter(id=packet['submission-id']).update(error=packet['log']): event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'compile-message'}) json_log.info(self._make_json_log(packet, action='compile-message', log=packet['log'])) else: logger.warning('Unknown submission: %d', packet['submission-id']) json_log.error(self._make_json_log(packet, action='compile-message', info='unknown submission', log=packet['log']))
def on_grading_begin(self, packet): super(DjangoJudgeHandler, self).on_grading_begin(packet) if Submission.objects.filter(id=packet['submission-id']).update( status='G', is_pretested=packet['pretested'], current_testcase=1, batch=False): SubmissionTestCase.objects.filter(submission_id=packet['submission-id']).delete() event.post('sub_%s' % Submission.get_id_secret(packet['submission-id']), {'type': 'grading-begin'}) self._post_update_submission(packet['submission-id'], 'grading-begin') json_log.info(self._make_json_log(packet, action='grading-begin')) else: logger.warning('Unknown submission: %d', packet['submission-id']) json_log.error(self._make_json_log(packet, action='grading-begin', info='unknown submission'))
def on_test_case(self, packet, max_feedback=SubmissionTestCase._meta.get_field('feedback').max_length): logger.info('%s: %d test case(s) completed on: %s', self.name, len(packet['cases']), packet['submission-id']) id = packet['submission-id'] updates = packet['cases'] max_position = max(map(itemgetter('position'), updates)) if not Submission.objects.filter(id=id).update(current_testcase=max_position + 1): logger.warning('Unknown submission: %s', id) json_log.error(self._make_json_log(packet, action='test-case', info='unknown submission')) return bulk_test_case_updates = [] for result in updates: test_case = SubmissionTestCase(submission_id=id, case=result['position']) status = result['status'] if status & 4: test_case.status = 'TLE' elif status & 8: test_case.status = 'MLE' elif status & 64: test_case.status = 'OLE' elif status & 2: test_case.status = 'RTE' elif status & 16: test_case.status = 'IR' elif status & 1: test_case.status = 'WA' elif status & 32: test_case.status = 'SC' else: test_case.status = 'AC' test_case.time = result['time'] test_case.memory = result['memory'] test_case.points = result['points'] test_case.total = result['total-points'] test_case.batch = self.batch_id if self.in_batch else None test_case.feedback = (result.get('feedback') or '')[:max_feedback] test_case.extended_feedback = result.get('extended-feedback') or '' test_case.output = result['output'] bulk_test_case_updates.append(test_case) json_log.info(self._make_json_log( packet, action='test-case', case=test_case.case, batch=test_case.batch, time=test_case.time, memory=test_case.memory, feedback=test_case.feedback, extended_feedback=test_case.extended_feedback, output=test_case.output, points=test_case.points, total=test_case.total, status=test_case.status, )) do_post = True if id in self.update_counter: cnt, reset = self.update_counter[id] cnt += 1 if time.monotonic() - reset > UPDATE_RATE_TIME: del self.update_counter[id] else: self.update_counter[id] = (cnt, reset) if cnt > UPDATE_RATE_LIMIT: do_post = False if id not in self.update_counter: self.update_counter[id] = (1, time.monotonic()) if do_post: event.post('sub_%s' % Submission.get_id_secret(id), { 'type': 'test-case', 'id': max_position, }) self._post_update_submission(id, state='test-case') SubmissionTestCase.objects.bulk_create(bulk_test_case_updates)
do_post = True if id in self.update_counter: cnt, reset = self.update_counter[id] cnt += 1 if TIMER() - reset > UPDATE_RATE_TIME: del self.update_counter[id] else: self.update_counter[id] = (cnt, reset) if cnt > UPDATE_RATE_LIMIT: do_post = False if id not in self.update_counter: self.update_counter[id] = (1, TIMER()) if do_post: event.post('sub_%s' % Submission.get_id_secret(id), { 'type': 'test-case', 'id': packet['position'], 'status': test_case.status, 'time': '%.3f' % round(float(packet['time']), 3), 'memory': packet['memory'], 'points': float(test_case.points), 'total': float(test_case.total), 'output': packet['output'] }) self._post_update_submission(id, state='test-case') def on_supported_problems(self, packet): super(DjangoJudgeHandler, self).on_supported_problems(packet) self.judge.problems.set(Problem.objects.filter(code__in=list(self.problems.keys()))) json_log.info(self._make_json_log(action='update-problems', count=len(self.problems)))
if id in self.update_counter: cnt, reset = self.update_counter[id] cnt += 1 if TIMER() - reset > UPDATE_RATE_TIME: del self.update_counter[id] else: self.update_counter[id] = (cnt, reset) if cnt > UPDATE_RATE_LIMIT: do_post = False if id not in self.update_counter: self.update_counter[id] = (1, TIMER()) if do_post: event.post( 'sub_%s' % Submission.get_id_secret(id), { 'type': 'test-case', 'id': packet['position'], 'status': test_case.status, 'time': '%.3f' % round(float(packet['time']), 3), 'memory': packet['memory'], 'points': float(test_case.points), 'total': float(test_case.total), 'output': packet['output'], }) self._post_update_submission(id, state='test-case') def on_supported_problems(self, packet): super(DjangoJudgeHandler, self).on_supported_problems(packet) self.judge.problems.set( Problem.objects.filter(code__in=list(self.problems.keys())))