diff --git a/vitrage/evaluator/scenario_evaluator.py b/vitrage/evaluator/scenario_evaluator.py index ac60bd25f..88b298611 100644 --- a/vitrage/evaluator/scenario_evaluator.py +++ b/vitrage/evaluator/scenario_evaluator.py @@ -15,6 +15,7 @@ from collections import namedtuple from oslo_log import log +from vitrage.datasources.listener_service import defaultdict from vitrage.common.constants import EdgeProperties as EProps from vitrage.common.constants import VertexProperties as VProps @@ -58,6 +59,7 @@ class ScenarioEvaluator(object): self._entity_graph.subscribe(self.process_event) self._action_tracker = ActionTracker(DatasourceInfoMapper(self.conf)) self.enabled = enabled + self.connected_component_cache = defaultdict(dict) @property def scenario_repo(self): @@ -267,9 +269,8 @@ class ScenarioEvaluator(object): matches = [] for subgraph in subgraphs: - connected_component = subgraph.algo.graph_query_vertices( - root_id=action_target, - edge_query_dict={'!=': {NEG_CONDITION: True}}) + connected_component = self.get_connected_component(subgraph, + action_target) is_switch_mode = \ connected_component.get_vertex(scenario_vertex.vertex_id) @@ -307,10 +308,8 @@ class ScenarioEvaluator(object): is_switch_mode = subgraph_edge.get(NEG_CONDITION, False) - connected_component = subgraph.algo.graph_query_vertices( - root_id=action_target, - edge_query_dict={'!=': {NEG_CONDITION: True}}) - + connected_component = self.get_connected_component(subgraph, + action_target) # change the is_deleted and negative_condition props to false when # is_switch_mode=true so that when we have an event on a # negative_condition=true edge it will find the correct subgraph @@ -332,6 +331,17 @@ class ScenarioEvaluator(object): matches.append((is_switch_mode, curr_matches)) return matches + def get_connected_component(self, subgraph, target): + connected_component = self.connected_component_cache.get( + id(subgraph), {}).get(id(target)) + if not connected_component: + connected_component = subgraph.algo.graph_query_vertices( + root_id=target, + edge_query_dict={'!=': {NEG_CONDITION: True}}) + self.connected_component_cache[id(subgraph)][id(target)] = \ + connected_component + return connected_component + @staticmethod def _switch_edge_negative_props(is_switch_mode, scenario_edge,