39 lines
1.0 KiB
C#
39 lines
1.0 KiB
C#
using System.Text.Json;
|
|
|
|
namespace Zcbot.WindowsNode;
|
|
|
|
internal enum JobRecoveryAction
|
|
{
|
|
ResumeExecution,
|
|
ResumeOutputUpload,
|
|
ReplayTerminal,
|
|
None,
|
|
}
|
|
|
|
internal sealed record JobRecoveryDecision(
|
|
RecoverableJob Job,
|
|
JobRecoveryAction Action);
|
|
|
|
internal sealed class JobRecoveryService(JobRepository repository)
|
|
{
|
|
internal IReadOnlyList<JobRecoveryDecision> Scan() =>
|
|
repository.ReadRecoverableJobs()
|
|
.Select(job => new JobRecoveryDecision(job, Decide(job)))
|
|
.ToArray();
|
|
|
|
internal static JobRecoveryAction Decide(RecoverableJob job)
|
|
{
|
|
if (job.Terminal is not JsonElement terminal)
|
|
{
|
|
return JobRecoveryAction.ResumeExecution;
|
|
}
|
|
if (terminal.GetProperty("status").GetString() != JobStateMachine.Succeeded)
|
|
{
|
|
return JobRecoveryAction.ReplayTerminal;
|
|
}
|
|
return job.UploadComplete || job.CloudTerminal
|
|
? JobRecoveryAction.None
|
|
: JobRecoveryAction.ResumeOutputUpload;
|
|
}
|
|
}
|