Example #1
0
 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)
Example #2
0
 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)
Example #3
0
File: judge.py Project: vijos/vj4
 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)
Example #4
0
File: judge.py Project: JoshOY/vj4
 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()
Example #5
0
 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()
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
File: judge.py Project: JoshOY/vj4
 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)