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(); } } } } } } }
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); }
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. }