Exemplo n.º 1
0
 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");
 }
Exemplo n.º 2
0
        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());
            }
        }