Try optimizing batch rejudge

This commit is contained in:
cuom1999 2023-05-27 08:33:19 +07:00
parent f65238ba42
commit fbd1d865fa
2 changed files with 12 additions and 5 deletions

View file

@ -56,7 +56,7 @@ def judge_request(packet, reply=True):
return result return result
def judge_submission(submission, rejudge=False, batch_rejudge=False, judge_id=None): def judge_submission(submission, rejudge=False, batch_rejudge=False, judge_id=None, delete_testcases=True):
from .models import ContestSubmission, Submission, SubmissionTestCase from .models import ContestSubmission, Submission, SubmissionTestCase
CONTEST_SUBMISSION_PRIORITY = 0 CONTEST_SUBMISSION_PRIORITY = 0
@ -101,6 +101,7 @@ def judge_submission(submission, rejudge=False, batch_rejudge=False, judge_id=No
): ):
return False return False
if delete_testcases:
SubmissionTestCase.objects.filter(submission_id=submission.id).delete() SubmissionTestCase.objects.filter(submission_id=submission.id).delete()
try: try:

View file

@ -2,7 +2,7 @@ from celery import shared_task
from django.core.cache import cache from django.core.cache import cache
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from judge.models import Problem, Profile, Submission from judge.models import Problem, Profile, Submission, SubmissionTestCase
from judge.utils.celery import Progress from judge.utils.celery import Progress
__all__ = ("apply_submission_filter", "rejudge_problem_filter", "rescore_problem") __all__ = ("apply_submission_filter", "rejudge_problem_filter", "rescore_problem")
@ -30,9 +30,15 @@ def rejudge_problem_filter(
queryset = apply_submission_filter(queryset, id_range, languages, results, contest) queryset = apply_submission_filter(queryset, id_range, languages, results, contest)
rejudged = 0 rejudged = 0
with Progress(self, queryset.count()) as p: with Progress(self, queryset.count() * 2) as p:
for submission in queryset:
SubmissionTestCase.objects.filter(submission_id=submission.id).delete()
rejudged += 1
if rejudged % 10 == 0:
p.done = rejudged
for submission in queryset.iterator(): for submission in queryset.iterator():
submission.judge(rejudge=True, batch_rejudge=True) submission.judge(rejudge=True, batch_rejudge=True, delete_testcases=False)
rejudged += 1 rejudged += 1
if rejudged % 10 == 0: if rejudged % 10 == 0:
p.done = rejudged p.done = rejudged