public override async Task <(bool IsComplete, JobStatus?OverriddenJobStatus, DateTimeOffset?completionTime)> PerformAdditionalJobChecks(JobModel job, CancellationToken cancellationToken) { var outstandingJobs = await context.GetOutstandingOrTimedOutJobs(job, cancellationToken); var timeoutsPresent = outstandingJobs.Where(x => (x.JobStatus == JobStatus.TimedOut || x.JobStatus == JobStatus.DcTasksFailed) && x.EndTime > job.StartTime).ToList(); if (timeoutsPresent.Any()) //fail fast { Logger.LogWarning($"{timeoutsPresent.Count} File Processing jobs {string.Join(" ,", timeoutsPresent.Select(j => j.DcJobId))} with TimedOut or DcTasksFailed and job EndTime after Period-End-Start Job Present. " + $"now updating job status to CompletedWithErrors, Period End Start JobId {job.DcJobId}"); return(true, JobStatus.CompletedWithErrors, outstandingJobs.Max(x => x.EndTime)); } var processingJobsPresent = outstandingJobs.Where(x => x.JobStatus == JobStatus.InProgress || x.DcJobSucceeded == null).ToList(); if (processingJobsPresent.Any()) { SendTelemetry(job, processingJobsPresent); var completionTimesForInProgressJobs = await context.GetAverageJobCompletionTimesForInProgressJobs(processingJobsPresent.Select(p => p.Ukprn).ToList(), cancellationToken); await CheckAndUpdateProcessingJobsIfRunningLongerThenAverageTime(processingJobsPresent, completionTimesForInProgressJobs, job.DcJobId, cancellationToken); return(false, null, null); } var jobsWithoutSubmissionSummariesPresent = context.DoSubmissionSummariesExistForJobs(outstandingJobs); if (jobsWithoutSubmissionSummariesPresent.Any()) { Logger.LogDebug($"{jobsWithoutSubmissionSummariesPresent.Count} File Processing jobs without Submission Summaries Present during Period End Start job, Period End Start JobId {job.DcJobId}"); SendTelemetry(job, null, jobsWithoutSubmissionSummariesPresent); return(false, null, null); } Logger.LogDebug($"No Outstanding Jobs or jobs Without Submission Summaries during Period End Start job, Now updating Period End Start job status to Completed, Period End Start JobId {job.DcJobId}"); return(true, null, DateTimeOffset.UtcNow); }
protected override async Task <(bool IsComplete, JobStatus?OverriddenJobStatus, DateTimeOffset?completionTime)> PerformAdditionalJobChecks(JobModel job, CancellationToken cancellationToken) { var outstandingJobs = await context.GetOutstandingOrTimedOutJobs(job.DcJobId, job.StartTime, cancellationToken); var timeoutsPresent = outstandingJobs.Any(x => (x.JobStatus == JobStatus.TimedOut || x.JobStatus == JobStatus.DcTasksFailed) && x.EndTime > job.StartTime); if (timeoutsPresent) //fail fast { return(true, JobStatus.CompletedWithErrors, outstandingJobs.Max(x => x.EndTime)); } var processingJobsPresent = outstandingJobs.Any(x => x.JobStatus == JobStatus.InProgress || x.DcJobSucceeded == null); if (processingJobsPresent) { return(false, (JobStatus?)null, (DateTimeOffset?)null); } return(true, (JobStatus?)null, outstandingJobs.Max(x => x.EndTime)); }