/// <summary> /// /// </summary> /// <param name="job"></param> private static void ClearWaitingOn(JobProto job) { if (job.Status.Equals(JobState.Blockmainia) || job.Status.Equals(JobState.Running)) { job.WaitingOn.Clear(); } }
/// <summary> /// /// </summary> /// <param name="job"></param> /// <returns></returns> private async Task MarkAs(JobProto job, JobState state) { if (job == null) { throw new ArgumentNullException(nameof(job)); } try { if (job == null) { return; } var jobProto = await unitOfWork.Job.GetFirstOrDefault(x => x.Hash.Equals(job.Hash)); if (jobProto != null) { jobProto.Status = state; await unitOfWork.Job.StoreOrUpdate(jobProto, jobProto.Id); } } catch (Exception ex) { logger.LogError($"<<< MissingBlocksProvider.MarkAs >>>: {ex.ToString()}"); } }
/// <summary> /// /// </summary> /// <param name="next"></param> /// <returns></returns> private async Task <JobProto> ExistingJob(BlockGraphProto next) { if (next == null) { throw new ArgumentNullException(nameof(next)); } JobProto job = null; try { var jobProto = await unitOfWork.Job.GetFirstOrDefault(x => x.Hash.Equals(next.Block.Hash)); if (jobProto != null) { jobProto.Nodes = new List <ulong>(); jobProto.Nodes.AddRange(next.Deps?.Select(n => n.Block.Node)); jobProto.WaitingOn = new List <ulong>(); jobProto.WaitingOn.AddRange(httpService.Members.Select(k => k.Key).ToArray()); if (!jobProto.BlockGraph.Equals(next)) { jobProto.Status = Incoming(jobProto, next); ClearWaitingOn(jobProto); } jobProto.BlockGraph = next; await unitOfWork.Job.Include(jobProto); job = await unitOfWork.Job.StoreOrUpdate(jobProto, jobProto.Id); } } catch (Exception ex) { logger.Error($"<<< ReplyProvider.ExistingJob >>>: {ex.ToString()}"); } return(job); }
/// <summary> /// /// </summary> /// <param name="next"></param> /// <returns></returns> private async Task <JobProto> AddJob(BlockGraphProto next) { if (next == null) { throw new ArgumentNullException(nameof(next)); } JobProto job = null; try { job = new JobProto { Epoch = DateTimeOffset.UtcNow.ToUnixTimeSeconds(), Hash = next.Block.Hash, BlockGraph = next, ExpectedTotalNodes = 4, Node = httpService.NodeIdentity, TotalNodes = httpService.Members.Count(), Status = JobState.Started }; job.Nodes = new List <ulong>(); job.Nodes.AddRange(next.Deps?.Select(n => n.Block.Node)); job.WaitingOn = new List <ulong>(); job.WaitingOn.AddRange(httpService.Members.Select(k => k.Key).ToArray()); job.Status = Incoming(job, next); ClearWaitingOn(job); await unitOfWork.Job.StoreOrUpdate(job); } catch (Exception ex) { logger.Error($"<<< ReplyProvider.AddJob >>>: {ex.ToString()}"); } return(job); }
/// <summary> /// /// </summary> /// <param name="next"></param> /// <param name="job"></param> public static JobState Incoming(JobProto job, BlockGraphProto next) { if (job.Nodes.Any()) { var nodes = job.Nodes?.Except(next.Deps.Select(x => x.Block.Node)); if (nodes.Any() != true) { return(JobState.Blockmainia); } } if (job.WaitingOn.Any()) { var waitingOn = job.WaitingOn?.Except(next.Deps.Select(x => x.Block.Node)); if (waitingOn.Any() != true) { return(JobState.Blockmainia); } } return(job.Status); }