/// <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); }
/// <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); }
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; } } }
public virtual Task Update(int cid, Judging judging) => Task.CompletedTask;
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, })); }