public Judgehost(JudgeHost a) { hostname = a.ServerName; active = a.Active; polltime = a.PollTime.ToUnixTimeSeconds(); polltime_formatted = a.PollTime.ToString("yyyy-MM-dd HH:mm:ss zzz"); }
public async Task <ActionResult <List <UnfinishedJudging> > > OnPost( [FromForm, Required] string hostname, [FromServices] SubmissionManager submissionManager) { var item = await DbContext.JudgeHosts .Where(h => h.ServerName == hostname) .FirstOrDefaultAsync(); if (item is null) { item = new JudgeHost { ServerName = hostname, PollTime = DateTimeOffset.Now, Active = true }; DbContext.JudgeHosts.Add(item); DbContext.AuditLogs.Add(new AuditLog { ContestId = 0, Comment = $"judgehost {hostname} on {HttpContext.Connection.RemoteIpAddress} registered", Resolved = true, Time = DateTimeOffset.Now, Type = AuditLog.TargetType.Contest, EntityId = 0, UserName = "******", }); Telemetry.TrackDependency( dependencyTypeName: "JudgeHost", dependencyName: item.ServerName, data: "registed", startTime: item.PollTime, duration: TimeSpan.Zero, success: true); await DbContext.SaveChangesAsync(); return(new List <UnfinishedJudging>()); } else { item.PollTime = DateTimeOffset.Now; DbContext.JudgeHosts.Update(item); var oldJudgings = await submissionManager.Judgings .Where(j => j.ServerId == item.ServerId) .Where(j => j.Status == Verdict.Running) .Join( inner: submissionManager.Submissions, outerKeySelector: j => j.SubmissionId, innerKeySelector: s => s.SubmissionId, resultSelector: (j, s) => new { j, cid = s.ContestId }) .ToListAsync(); foreach (var sg in oldJudgings) { await submissionManager.RejudgeForErrorAsync(sg.j); Telemetry.TrackDependency( dependencyTypeName: "JudgeHost", dependencyName: item.ServerName, data: $"j{sg.j.JudgingId} of s{sg.j.SubmissionId} returned to queue", startTime: sg.j.StartTime ?? DateTimeOffset.Now, duration: (sg.j.StopTime - sg.j.StartTime) ?? TimeSpan.Zero, success: false); } return(oldJudgings .Select(s => new UnfinishedJudging { judgingid = s.j.JudgingId, submitid = s.j.SubmissionId, cid = s.cid }) .ToList()); } }