Пример #1
0
        /// <summary>
        /// Finish the judging pipe, persist into database,
        /// create the events and notify scoreboard.
        /// </summary>
        private async Task FinishJudging(Judging j, int?cid, int pid, int uid, DateTimeOffset subtime)
        {
            if (cid == 0)
            {
                cid = null;
            }
            await Judgings.UpdateAsync(j);

            await HttpContext.AuditAsync(
                AuditlogType.Judging, cid, j.Server,
                "judged", $"{j.JudgingId}", $"{j.Status}");

            if (cid.HasValue && j.Active)
            {
                await HttpContext.RequestServices
                .GetRequiredService <MediatR.IMediator>()
                .JudgingFinished(cid.Value, subtime, pid, uid, j);
            }

            if (j.Active)
            {
                await HttpContext.RequestServices
                .GetRequiredService <ISubmissionStore>()
                .UpdateStatisticsAsync(cid ?? 0, uid, pid, j.Status == Verdict.Accepted);
            }

            Telemetry.TrackDependency(
                dependencyTypeName: "JudgeHost",
                dependencyName: j.Server,
                data: $"j{j.JudgingId} judged " + j.Status,
                startTime: j.StartTime ?? DateTimeOffset.Now,
                duration: (j.StopTime - j.StartTime) ?? TimeSpan.Zero,
                success: j.Status != Verdict.UndefinedError);
        }
Пример #2
0
        /// <summary>
        /// The judging meet an internal error, require a rejudging.
        /// </summary>
        private async Task ReturnToQueue(Judging j, int?cid, int pid, int uid, DateTimeOffset subtime)
        {
            await Judgings.CreateAsync(new Judging
            {
                Active            = j.Active,
                Status            = Verdict.Pending,
                FullTest          = j.FullTest,
                RejudgeId         = j.RejudgeId,
                PreviousJudgingId = j.PreviousJudgingId,
                SubmissionId      = j.SubmissionId,
            });

            j.Active            = false;
            j.Status            = Verdict.UndefinedError;
            j.RejudgeId         = null;
            j.PreviousJudgingId = null;
            if (!j.StopTime.HasValue)
            {
                j.StopTime = DateTimeOffset.Now;
            }

            if (cid == 0)
            {
                cid = null;
            }
            await FinishJudging(j, cid, pid, uid, subtime);
        }
Пример #3
0
        public Judgement(Judging j, DateTimeOffset contestTime)
        {
            id                 = $"{j.JudgingId}";
            submission_id      = $"{j.SubmissionId}";
            judgehost          = j.Server;
            judgement_type_id  = JudgementType.For(j.Status);
            valid              = j.Active;
            start_contest_time = j.StartTime.Value - contestTime;
            start_time         = j.StartTime.Value;

            if (judgement_type_id != null)
            {
                end_contest_time = j.StopTime.Value - contestTime;
                end_time         = j.StopTime.Value;
                if (judgement_type_id != "CE" && judgement_type_id != "JE")
                {
                    max_run_time = j.ExecuteTime / 1000.0;
                }
            }
        }
Пример #4
0
 public virtual Task Update(int cid, Judging judging) => Task.CompletedTask;
Пример #5
0
 public static Task JudgingFinished(this IMediator mediator,
                                    int contestid, DateTimeOffset time, int probid, int teamid, Judging judging)
 {
     return(mediator.Send(new JudgingFinishedRequest
     {
         ContestId = contestid,
         SubmitTime = time,
         ProblemId = probid,
         TeamId = teamid,
         Judging = judging,
     }));
 }