public async Task Start() { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } var enumerableStartedAlgorithms = await StartedIsolationAlgorithms.GetEnumerableDictionaryAsync(); if (enumerableStartedAlgorithms.Count == 0) { Logger.LogVerbose($"{baseLogString} Start => No started algorithms."); return; } var enumerableTopology = await OutageTopologyModel.GetEnumerableDictionaryAsync(); if (!enumerableTopology.ContainsKey(ReliableDictionaryNames.OutageTopologyModel)) { Logger.LogError($"{baseLogString} Start => Topology not found in Rel Dictionary: {ReliableDictionaryNames.OutageTopologyModel}."); return; } var topology = enumerableTopology[ReliableDictionaryNames.OutageTopologyModel]; var tasks = new List <Task <ConditionalValue <long> > >(); foreach (var algorithm in enumerableStartedAlgorithms.Values) { tasks.Add(StartIndividualAlgorithmCycle(algorithm, topology)); } var tasksArray = tasks.ToArray(); Task.WaitAll(tasksArray); foreach (var task in tasksArray) { //SVESNO SE POGRESNO KORISTI HasValue if (!task.Result.HasValue) { var headBreakerGid = task.Result.Value; await OnEndAlgorithmCleanUp(headBreakerGid); } } }
private async Task <bool> CheckPreconditions(long elementGid, CommandOriginType commandOriginType, List <long> affectedConsumersGids, IHistoryDBManagerContract historyDBManagerClient) { if (this.ignorableCommandOriginTypes.Contains(commandOriginType)) { Logger.LogDebug($"{baseLogString} CheckPreconditions => ignorable command origin type: {commandOriginType}"); return(false); } var enumerableStartedAlgorithms = await StartedIsolationAlgorithms.GetEnumerableDictionaryAsync(); var enumerableOptimumIsolationPoints = await OptimumIsolationPoints.GetEnumerableDictionaryAsync(); if (enumerableStartedAlgorithms.Values.Any(algorithm => algorithm.ElementsCommandedInCurrentCycle.Contains(elementGid)) || enumerableOptimumIsolationPoints.ContainsKey(elementGid)) { Logger.LogWarning($"{baseLogString} CheckPreconditions => ElementGid 0x{elementGid:X16} found in elements commanded in current isolating algorithm cycle or in optimumIsolationPoints."); return(false); } if (affectedConsumersGids.Count == 0) { await OnZeroAffectedConsumersCase(elementGid, historyDBManagerClient); Logger.LogWarning($"{baseLogString} ReportPotentialOutage => There is no affected consumers => outage report is not valid. ElementGid: 0x{elementGid:X16}, CommandOriginType: {commandOriginType}"); return(false); } var outageModelAccessClient = OutageModelAccessClient.CreateClient(); var activeOutages = await outageModelAccessClient.GetAllActiveOutages(); if (activeOutages.Any(active => (active.OutageState == OutageState.CREATED && active.OutageElementGid == elementGid) || (active.OutageState != OutageState.CREATED && active.DefaultIsolationPoints.Any(point => point.EquipmentId == elementGid)))) { Logger.LogWarning($"{baseLogString} ReportPotentialOutage => duplicate... ElementGID: 0x{elementGid:X16}"); return(false); } return(true); }