async def on_message(self, *, key, tag, **kwargs): if key == 'next': rid = self.rids[tag] update = {} if 'status' in kwargs: update.setdefault('$set', {})['status'] = int(kwargs['status']) if 'compiler_text' in kwargs: update.setdefault('$push', {})['compiler_texts'] = str(kwargs['compiler_text']) if 'judge_text' in kwargs: update.setdefault('$push', {})['judge_texts'] = str(kwargs['judge_text']) if 'case' in kwargs: update.setdefault('$push', {})['cases'] = { 'status': int(kwargs['case']['status']), 'score': int(kwargs['case']['score']), 'time_ms': int(kwargs['case']['time_ms']), 'memory_kb': int(kwargs['case']['memory_kb']), 'judge_text': str(kwargs['case']['judge_text']), } if 'progress' in kwargs: update.setdefault('$set', {})['progress'] = float(kwargs['progress']) await record.next_judge(rid, self.user['_id'], self.id, **update) await bus.publish('record_change', rid) elif key == 'end': rid = self.rids.pop(tag) rdoc, _ = await asyncio.gather(record.end_judge(rid, self.user['_id'], self.id, int(kwargs['status']), int(kwargs['score']), int(kwargs['time_ms']), int(kwargs['memory_kb'])), self.channel.basic_client_ack(tag)) await _post_judge(rdoc) elif key == 'nack': await self.channel.basic_client_nack(tag)
async def _on_queue_message(self, tag, *, rid): # TODO(iceboy): Error handling? rdoc = await record.begin_judge(rid, self.user['_id'], self.id, constant.record.STATUS_FETCHED) if rdoc: used_time = await opcount.get(**opcount.OPS['run_code'], ident=opcount.PREFIX_USER + str(rdoc['uid'])) if used_time >= opcount.OPS['run_code']['max_operations']: await asyncio.gather( record.end_judge(rid, self.user['_id'], self.id, constant.record.STATUS_CANCELED, 0, 0, 0), self.channel.basic_client_ack(tag)) await bus.publish('record_change', rid) return self.rids[tag] = rdoc['_id'] self.send(rid=str(rdoc['_id']), tag=tag, pid=str(rdoc['pid']), domain_id=rdoc['domain_id'], lang=rdoc['lang'], code=rdoc['code'], type=rdoc['type']) await bus.publish('record_change', rdoc['_id']) else: # Record not found, eat it. await self.channel.basic_client_ack(tag)
async def on_message(self, *, key, tag, **kwargs): if key == 'next': rid = self.rids[tag] update = {} if 'status' in kwargs: update.setdefault('$set', {})['status'] = int(kwargs['status']) if 'compiler_text' in kwargs: update.setdefault('$push', {})['compiler_texts'] = str(kwargs['compiler_text']) if 'judge_text' in kwargs: update.setdefault('$push', {})['judge_texts'] = str(kwargs['judge_text']) if 'case' in kwargs: update.setdefault('$push', {})['cases'] = { 'status': int(kwargs['case']['status']), 'score': int(kwargs['case']['score']), 'time_ms': int(kwargs['case']['time_ms']), 'memory_kb': int(kwargs['case']['memory_kb']), 'judge_text': str(kwargs['case']['judge_text']), } if 'progress' in kwargs: update.setdefault('$set', {})['progress'] = float(kwargs['progress']) rdoc = await record.next_judge(rid, self.user['_id'], self.id, **update) if not rdoc: return bus.publish_throttle('record_change', rdoc, rdoc['_id']) elif key == 'end': rid = self.rids.pop(tag) rdoc, _ = await asyncio.gather(record.end_judge(rid, self.user['_id'], self.id, int(kwargs['status']), int(kwargs['score']), int(kwargs['time_ms']), int(kwargs['memory_kb'])), self.channel.basic_client_ack(tag)) if not rdoc: return await _post_judge(self, rdoc)
async def close(): await asyncio.gather(*[record.end_judge(rid, self.user['_id'], self.id, record.STATUS_CANCELED, 0, 0, 0) for rid in self.rids.values()]) await asyncio.gather(*[bus.publish('record_change', rid) for rid in self.rids.values()]) # There is a bug in current version's aioamqp and we cannot use no_wait=True here. await self.channel.close()
async def on_message(self, *, key, tag, **kwargs): if key == 'next': rid = self.rids[tag] update = {} if 'status' in kwargs: update.setdefault('$set', {})['status'] = int(kwargs['status']) if 'compiler_text' in kwargs: update.setdefault('$push', {})['compiler_texts'] = str( kwargs['compiler_text']) if 'judge_text' in kwargs: update.setdefault('$push', {})['judge_texts'] = str( kwargs['judge_text']) if 'case' in kwargs: update.setdefault('$push', {})['cases'] = { 'status': int(kwargs['case']['status']), 'score': int(kwargs['case']['score']), 'time_ms': int(kwargs['case']['time_ms']), 'memory_kb': int(kwargs['case']['memory_kb']), } await record.next_judge(rid, self.user['_id'], self.id, **update) await bus.publish('record_change', rid) elif key == 'end': rid = self.rids.pop(tag) rdoc, _ = await asyncio.gather( record.end_judge(rid, self.user['_id'], self.id, int(kwargs['status']), int(kwargs['score']), int(kwargs['time_ms']), int(kwargs['memory_kb'])), self.channel.basic_client_ack(tag)) accept = True if rdoc['status'] == record.STATUS_ACCEPTED else False # TODO(twd2): update problem post_coros = [ problem.update_status(rdoc['domain_id'], rdoc['pid'], rdoc['uid'], rdoc['_id'], rdoc['status']), bus.publish('record_change', rid) ] if rdoc['tid']: post_coros.append( contest.update_status(rdoc['domain_id'], rdoc['tid'], rdoc['uid'], rdoc['_id'], rdoc['pid'], accept, rdoc['score'])) if accept: post_coros.append( training.update_status_by_pid(rdoc['domain_id'], rdoc['uid'], rdoc['pid'])) await asyncio.gather(*post_coros) elif key == 'nack': await self.channel.basic_client_nack(tag)
async def on_message(self, *, key, tag, **kwargs): if key == 'next': rid = self.rids[tag] update = {} if 'status' in kwargs: update.setdefault('$set', {})['status'] = int(kwargs['status']) if 'compiler_text' in kwargs: update.setdefault('$push', {})['compiler_texts'] = str( kwargs['compiler_text']) if 'judge_text' in kwargs: update.setdefault('$push', {})['judge_texts'] = str( kwargs['judge_text']) if 'case' in kwargs: update.setdefault('$push', {})['cases'] = { 'status': int(kwargs['case']['status']), 'score': int(kwargs['case']['score']), 'time_ms': int(kwargs['case']['time_ms']), 'memory_kb': int(kwargs['case']['memory_kb']), 'stdout': str(kwargs['case']['stdout']), 'stderr': str(kwargs['case']['stderr']), 'answer': str(kwargs['case']['answer']), 'execute_status': int(kwargs['case']['execute_status']) } if 'progress' in kwargs: update.setdefault('$set', {})['progress'] = float(kwargs['progress']) rdoc = await record.next_judge(rid, self.user['_id'], self.id, **update) if not rdoc: return bus.publish_throttle('record_change', rdoc, rdoc['_id']) elif key == 'end': rid = self.rids.pop(tag) rdoc, _ = await asyncio.gather( record.end_judge(rid, self.user['_id'], self.id, int(kwargs['status']), int(kwargs['score']), int(kwargs['time_ms']), int(kwargs['memory_kb'])), self.channel.basic_client_ack(tag)) if not rdoc: return await _post_judge(self, rdoc)
async def on_message(self, *, key, tag, **kwargs): if key == 'next': rid = self.rids[tag] update = {} if 'status' in kwargs: update.setdefault('$set', {})['status'] = int(kwargs['status']) if 'compiler_text' in kwargs: update.setdefault('$push', {})['compiler_texts'] = str(kwargs['compiler_text']) if 'judge_text' in kwargs: update.setdefault('$push', {})['judge_texts'] = str(kwargs['judge_text']) if 'case' in kwargs: update.setdefault('$push', {})['cases'] = { 'status': int(kwargs['case']['status']), 'score': int(kwargs['case']['score']), 'time_ms': int(kwargs['case']['time_ms']), 'memory_kb': int(kwargs['case']['memory_kb']), } await record.next_judge(rid, self.user['_id'], self.id, **update) await bus.publish('record_change', rid) elif key == 'end': rid = self.rids.pop(tag) rdoc, _ = await asyncio.gather(record.end_judge(rid, self.user['_id'], self.id, int(kwargs['status']), int(kwargs['score']), int(kwargs['time_ms']), int(kwargs['memory_kb'])), self.channel.basic_client_ack(tag)) accept = True if rdoc['status'] == record.STATUS_ACCEPTED else False # TODO(twd2): update problem post_coros = [problem.update_status(rdoc['domain_id'], rdoc['pid'], rdoc['uid'], rdoc['_id'], rdoc['status']), bus.publish('record_change', rid)] if rdoc['tid']: post_coros.append(contest.update_status(rdoc['domain_id'], rdoc['tid'], rdoc['uid'], rdoc['_id'], rdoc['pid'], accept, rdoc['score'])) if accept: post_coros.append(training.update_status_by_pid(rdoc['domain_id'], rdoc['uid'], rdoc['pid'])) await asyncio.gather(*post_coros) elif key == 'nack': await self.channel.basic_client_nack(tag)