From 8161e71aac317ccd8087c5ccd7b0671e51610f6e Mon Sep 17 00:00:00 2001 From: Dmitry Shulyak Date: Fri, 14 Aug 2015 17:06:48 +0300 Subject: [PATCH] Fix cycle when same node visited multiple times --- solar/solar/events/api.py | 7 +++++-- solar/solar/test/test_events.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/solar/solar/events/api.py b/solar/solar/events/api.py index 407b0bc9..624447fb 100644 --- a/solar/solar/events/api.py +++ b/solar/solar/events/api.py @@ -114,6 +114,7 @@ def build_edges(changed_resources, changes_graph, events): :param events: {res: [controls.Event objects]} """ stack = changed_resources[:] + visited = [] while stack: node = stack.pop() @@ -122,7 +123,9 @@ def build_edges(changed_resources, changes_graph, events): else: log.debug('No dependencies based on %s', node) - for ev in events.get(node, ()): - ev.insert(stack, changes_graph) + if node not in visited: + for ev in events.get(node, ()): + ev.insert(stack, changes_graph) + visited.append(node) return changes_graph diff --git a/solar/solar/test/test_events.py b/solar/solar/test/test_events.py index 5f5d8e8c..b15d8a8c 100644 --- a/solar/solar/test/test_events.py +++ b/solar/solar/test/test_events.py @@ -66,3 +66,20 @@ def test_rmq(rmq_deps): assert set(changes_graph.successors('rmq_cluster.1.create')) == { 'rmq_cluster.2.join', 'rmq_cluster.3.join'} + + +def test_riak(): + + events = { + 'riak_service1': [evapi.React('riak_service1', 'run', 'success', 'riak_service2', 'join'), + evapi.React('riak_service1', 'run', 'success', 'riak_service3', 'join')], + 'riak_service3': [evapi.React('riak_service3', 'join', 'success', 'riak_service1', 'commit')], + 'riak_service2': [evapi.React('riak_service2', 'join', 'success', 'riak_service1', 'commit')], + + } + changed = ['riak_service1'] + changes_graph = nx.DiGraph() + changes_graph.add_node('riak_service1.run') + evapi.build_edges(changed, changes_graph, events) + assert nx.topological_sort(changes_graph) == [ + 'riak_service1.run', 'riak_service2.join', 'riak_service3.join', 'riak_service1.commit']