Esempio n. 1
0
 /// <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()}");
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }