From dfccc9e07db137a8a07c4170415b8b252c4d7bfd Mon Sep 17 00:00:00 2001 From: chris meyers Date: Wed, 31 Oct 2018 16:13:19 -0400 Subject: [PATCH] rework wf cycle detection for convergence --- ...e.py => 0051_v340_workflow_convergence.py} | 2 +- awx/main/scheduler/dag_simple.py | 24 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) rename awx/main/migrations/{0050_v340_workflow_convergence.py => 0051_v340_workflow_convergence.py} (85%) diff --git a/awx/main/migrations/0050_v340_workflow_convergence.py b/awx/main/migrations/0051_v340_workflow_convergence.py similarity index 85% rename from awx/main/migrations/0050_v340_workflow_convergence.py rename to awx/main/migrations/0051_v340_workflow_convergence.py index 2e6edd42d7..c874acb2e2 100644 --- a/awx/main/migrations/0050_v340_workflow_convergence.py +++ b/awx/main/migrations/0051_v340_workflow_convergence.py @@ -8,7 +8,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('main', '0049_v330_validate_instance_capacity_adjustment'), + ('main', '0050_v340_drop_celery_tables'), ] operations = [ diff --git a/awx/main/scheduler/dag_simple.py b/awx/main/scheduler/dag_simple.py index b82a7b808b..a8d96b4be6 100644 --- a/awx/main/scheduler/dag_simple.py +++ b/awx/main/scheduler/dag_simple.py @@ -123,26 +123,24 @@ class SimpleDAG(object): def has_cycle(self): node_objs = [node['node_object'] for node in self.get_root_nodes()] - nodes_visited = set([]) + node_objs_visited = set([]) path = set([]) stack = node_objs - path_direction = 'DOWN' while stack: node_obj = stack.pop() - children = self.get_dependencies(node_obj) - for child in children: - if child['node_object'] not in nodes_visited: - stack.append(child['node_object']) - if node_obj in path: - return True + children = [node['node_object'] for node in self.get_dependencies(node_obj)] + children_to_add = filter(lambda node_obj: node_obj not in node_objs_visited, children) - if not children: - path_direction = 'UP' - - if path_direction == 'DOWN': + if children_to_add: + if node_obj in path: + return True path.add(node_obj) - elif path_direction == 'UP': + stack.append(node_obj) + stack.extend(children_to_add) + else: + node_objs_visited.add(node_obj) path.discard(node_obj) + return False