diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-09-27 19:46:25 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-09-27 19:46:25 +0000 |
commit | 29efd496b475dc7371454a1aaad1132c906d2c4c (patch) | |
tree | 2620e894206e3bea8b88a30fba9be83c0eed3154 | |
parent | cac9e8dd4f1927ca2e33c5cba902e3272fe57d91 (diff) | |
parent | 139816bd081d147d4f9dcde1ced7d98a8438b22c (diff) | |
download | taskflow-29efd496b475dc7371454a1aaad1132c906d2c4c.tar.gz |
Merge "Use 'iter_utils.count' to determine how many unfinished nodes left"
-rw-r--r-- | taskflow/engines/action_engine/builder.py | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/taskflow/engines/action_engine/builder.py b/taskflow/engines/action_engine/builder.py index 9ab26d4..dc1bdcc 100644 --- a/taskflow/engines/action_engine/builder.py +++ b/taskflow/engines/action_engine/builder.py @@ -21,6 +21,7 @@ from automaton import machines from taskflow import logging from taskflow import states as st from taskflow.types import failure +from taskflow.utils import iter_utils # Default waiting state timeout (in seconds). WAITING_TIMEOUT = 60 @@ -114,12 +115,15 @@ class MachineBuilder(object): # Checks if the storage says the flow is still runnable... return self._storage.get_flow_state() == st.RUNNING - def iter_next_nodes(target_node=None): + def iter_next_nodes(target_node=None, apply_deciders=True): # Yields and filters and tweaks the next nodes to execute... maybe_nodes = self._analyzer.get_next_nodes(node=target_node) for node, late_decider in maybe_nodes: - proceed = late_decider.check_and_affect(self._runtime) - if proceed: + if apply_deciders: + proceed = late_decider.check_and_affect(self._runtime) + if proceed: + yield node + else: yield node def resume(old_state, new_state, event): @@ -138,7 +142,17 @@ class MachineBuilder(object): # it is *always* called before the final state is entered. if memory.failures: return FAILED - if any(1 for node in iter_next_nodes()): + leftover_nodes = iter_utils.count( + # Avoid activating the deciders, since at this point + # the engine is finishing and there will be no more further + # work done anyway... + iter_next_nodes(apply_deciders=False)) + if leftover_nodes: + # Ok we didn't finish (either reverting or executing...) so + # that means we must of been stopped at some point... + LOG.blather("Suspension determined to have been reacted to" + " since (at least) %s nodes have been left in an" + " unfinished state", leftover_nodes) return SUSPENDED elif self._analyzer.is_success(): return SUCCESS |