mq中有关比赛的操作增加事务

This commit is contained in:
virusdefender 2015-09-16 17:28:36 +08:00
parent 8e60d08f14
commit 571b42cfb5

View File

@ -4,6 +4,8 @@ import logging
import redis import redis
import json import json
from django.db import transaction
from judge.judger_controller.settings import redis_config from judge.judger_controller.settings import redis_config
from judge.judger.result import result from judge.judger.result import result
from submission.models import Submission from submission.models import Submission
@ -37,6 +39,7 @@ class MessageQueue(object):
problem.save() problem.save()
except Problem.DoesNotExist: except Problem.DoesNotExist:
logger.warning("Submission problem does not exist, submission_id: " + submission_id) logger.warning("Submission problem does not exist, submission_id: " + submission_id)
continue
# 更新该用户的解题状态 # 更新该用户的解题状态
try: try:
user = User.objects.get(pk=submission.user_id) user = User.objects.get(pk=submission.user_id)
@ -69,50 +72,46 @@ class MessageQueue(object):
contest_submission = ContestSubmission.objects.get(user_id=submission.user_id, contest=contest, contest_submission = ContestSubmission.objects.get(user_id=submission.user_id, contest=contest,
problem_id=contest_problem.id) problem_id=contest_problem.id)
# 提交次数加1 # 提交次数加1
with transaction.atomic():
if submission.result == result["accepted"]: if submission.result == result["accepted"]:
# 避免这道题已经 ac 了,但是又重新提交了一遍 # 避免这道题已经 ac 了,但是又重新提交了一遍
if not contest_submission.ac: if not contest_submission.ac:
# 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时 # 这种情况是这个题目前处于错误状态,就使用已经存储了的罚时加上这道题的实际用时
# logger.debug(contest.start_time) contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds())
# logger.debug(submission.create_time) contest_submission.total_time += contest_submission.ac_time
# logger.debug((submission.create_time - contest.start_time).total_seconds()) contest_submission.total_submission_number += 1
# logger.debug(int((submission.create_time - contest.start_time).total_seconds() / 60)) # 标记为已经通过
contest_submission.ac_time = int((submission.create_time - contest.start_time).total_seconds()) if contest_problem.total_accepted_number == 0:
contest_submission.total_time += contest_submission.ac_time contest_submission.first_achieved = True
contest_submission.ac = True
# contest problem ac 计数器加1
contest_problem.total_accepted_number += 1
else:
# 如果这个提交是错误的就罚时20分钟
contest_submission.total_time += 1200
contest_submission.total_submission_number += 1 contest_submission.total_submission_number += 1
# 标记为已经通过 contest_submission.save()
if contest_problem.total_accepted_number == 0: contest_problem.save()
contest_submission.first_achieved = True
contest_submission.ac = True
# contest problem ac 计数器加1
contest_problem.total_accepted_number += 1
else:
# 如果这个提交是错误的就罚时20分钟
contest_submission.total_time += 1200
contest_submission.total_submission_number += 1
contest_submission.save()
contest_problem.save()
except ContestSubmission.DoesNotExist: except ContestSubmission.DoesNotExist:
# 第一次提交 # 第一次提交
is_ac = submission.result == result["accepted"] with transaction.atomic():
first_achieved = False is_ac = submission.result == result["accepted"]
ac_time = 0 first_achieved = False
if is_ac: ac_time = 0
ac_time = int((submission.create_time - contest.start_time).total_seconds()) if is_ac:
total_time = int((submission.create_time - contest.start_time).total_seconds()) ac_time = int((submission.create_time - contest.start_time).total_seconds())
# 增加题目总的ac数计数器 total_time = int((submission.create_time - contest.start_time).total_seconds())
if contest_problem.total_accepted_number == 0: # 增加题目总的ac数计数器
first_achieved = True if contest_problem.total_accepted_number == 0:
contest_problem.total_accepted_number += 1 first_achieved = True
contest_problem.save() contest_problem.total_accepted_number += 1
else: contest_problem.save()
# 没过罚时20分钟 else:
total_time = 1200 # 没过罚时20分钟
ContestSubmission.objects.create(user_id=submission.user_id, contest=contest, problem=contest_problem, total_time = 1200
ac=is_ac, total_time=total_time, first_achieved=first_achieved, ContestSubmission.objects.create(user_id=submission.user_id, contest=contest, problem=contest_problem,
ac_time=ac_time) ac=is_ac, total_time=total_time, first_achieved=first_achieved,
ac_time=ac_time)
logger.debug("Start message queue") logger.debug("Start message queue")
MessageQueue().listen_task() MessageQueue().listen_task()