protected override async Task Execute(IObserver observer, CancellationToken cancellationToken)
        {
            using (IKamajiContext db = DI.Provider.GetService <IKamajiContext>())
            {
                IEnumerable <INodeModel> brokenNodes = await db.Nodes.GetAll();//eğer 5000 node bağlanırsa bunu değiştir.

                if (!brokenNodes.IsEmptyList())
                {
                    DateTime dbDate = await db.GetDbDateTime();

                    brokenNodes = brokenNodes.Where(p => p.LastConnectionTime.AddSeconds(nodeTimeout) < dbDate);//get all nodes that lives. Bu 10 saniyeyi config' e taşı.
                    if (brokenNodes.Any())
                    {
                        foreach (INodeModel node in brokenNodes)
                        {
                            IEnumerable <IScanModel> scans = await db.Scans.GetListByLastAssignedNodeId(true, node.NodeId, ScanState.Running);

                            if (!scans.IsEmptyList())
                            {
                                foreach (IScanModel scan in scans)
                                {
                                    scan.State = ScanState.NodeShutdown;
                                    await db.Scans.Edit(scan);

                                    string msg = $"Warning!!!.A scan({scan.Asset}) has been assigned to Shutdown due to it's assigned node has been broken.";
                                    observer?.Notify($"{nameof(BrokenNodeService)}Execute", msg, null);
                                    _ = Utility.CreateLogger(nameof(BrokenNodeService), nameof(Execute)).Code(648).Warning(msg).SaveAsync();
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        private static async Task <INodeModel> GetOptimumNode(IKamajiContext db)
        {
            IEnumerable <INodeModel> nodes = await db.Nodes.GetAll();//eğer 5000 node bağlanırsa bunu değiştir.

            if (null != nodes && nodes.Any())
            {
                double CalculateAvailabilityScore(INodeModel node)
                {
                    double availableMem = 1.0 - node.MemoryUsage;
                    double availebleCpu = 1.0 - node.CpuUsage;
                    double threatCount  = node.ThreadCount;

                    return(availebleCpu * threatCount * availableMem / Math.Max(node.TotalExecutingJobCount + node.TotalQueuedJobCount, 1.0));
                }

                DateTime dbDate = await db.GetDbDateTime();

                nodes = nodes.Where(p => p.LastConnectionTime.AddSeconds(nodeTimeout) > dbDate);//get all nodes that lives. Bu 10 saniyeyi config' e taşı.
                //direk node' lara söylememiz lazım kaç adet task ları olduğunu. hem böylece multi-task scan' leri de daha iyi yakalayabiliriz.
                if (nodes.Any())
                {
                    double     maxScore = double.MinValue;
                    INodeModel selected = null;
                    nodes.ForEach(node =>
                    {
                        double score = CalculateAvailabilityScore(node);
                        if (maxScore < score)
                        {
                            selected = node;
                            maxScore = score;
                        }
                    });
                    return(selected);
                }
            }

            return(null);
        }
Beispiel #3
0
        protected async override Task <IEnumerable <IScanModel> > GetScanList(IKamajiContext db)
        {
            DateTime dbDateTimeNow = await db.GetDbDateTime();

            return(await db.Scans.GetScheduledListBy(true, dbDateTimeNow, ScanState.NotStarted, ScanState.NodeShutdown, ScanState.AssignFailed));//Buraya parantid null olan da eklenebilir child lar otomatik başlıyorsa.
        }