Beispiel #1
0
        public async Task <ActionResult <int> > InternalError(
            [FromForm] InternalErrorModel model,
            [FromServices] SubmissionManager submissionManager)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            var toDisable = JObject.Parse(model.disabled);
            var kind      = toDisable["kind"].Value <string>();

            if (kind == "language")
            {
                var langid = toDisable["langid"].Value <string>();
                var lang   = await DbContext.Languages
                             .Where(l => l.ExternalId == langid)
                             .SingleAsync();

                lang.AllowJudge = false;
                DbContext.Languages.Update(lang);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = lang.LangId,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Contest,
                    UserName  = "******",
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "Language",
                    dependencyName: langid,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "judgehost")
            {
                var hostname = toDisable["hostname"].Value <string>();
                var host     = await DbContext.JudgeHosts
                               .Where(h => h.ServerName == hostname)
                               .SingleAsync();

                host.Active = false;
                DbContext.JudgeHosts.Update(host);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = host.ServerId,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Contest,
                    UserName  = host.ServerName,
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "JudgeHost",
                    dependencyName: host.ServerName,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else if (kind == "problem")
            {
                var probid = toDisable["probid"].Value <int>();
                var prob   = await DbContext.Problems
                             .Where(p => p.ProblemId == probid)
                             .SingleAsync();

                prob.AllowJudge = false;
                DbContext.Problems.Update(prob);

                DbContext.AuditLogs.Add(new AuditLog
                {
                    ContestId = model.cid ?? 0,
                    EntityId  = probid,
                    Comment   = "internal error created",
                    Resolved  = true,
                    Time      = DateTimeOffset.Now,
                    Type      = AuditLog.TargetType.Problem,
                    UserName  = "******",
                });

                Telemetry.TrackDependency(
                    dependencyTypeName: "Problem",
                    dependencyName: $"p{probid} - {prob.Title}",
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }
            else
            {
                Telemetry.TrackDependency(
                    dependencyTypeName: "Unresolved",
                    dependencyName: kind,
                    data: model.description,
                    startTime: DateTimeOffset.Now,
                    duration: TimeSpan.Zero,
                    success: false);
            }

            var ie = new InternalError
            {
                JudgehostLog = model.judgehostlog,
                JudgingId    = model.judgingid,
                ContestId    = model.cid,
                Description  = model.description,
                Disabled     = model.disabled,
                Status       = InternalErrorStatus.Open,
                Time         = DateTimeOffset.Now,
            };

            if (model.judgingid.HasValue)
            {
                await submissionManager.RejudgeForErrorAsync(model.judgingid.Value);
            }

            DbContext.InternalErrors.Add(ie);
            await DbContext.SaveChangesAsync();

            return(ie.ErrorId);
        }
Beispiel #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());
            }
        }