diff --git a/solar/orchestration/graph.py b/solar/orchestration/graph.py index f78e38ad..a929477c 100644 --- a/solar/orchestration/graph.py +++ b/solar/orchestration/graph.py @@ -19,7 +19,6 @@ from collections import Counter import networkx as nx -from solar.dblayer.model import clear_cache from solar.dblayer.model import ModelMeta from solar.dblayer.solar_models import Task from solar import errors @@ -212,8 +211,6 @@ def wait_finish(uid, timeout): start_time = time.time() while start_time + timeout >= time.time(): - # need to clear cache before fetching updated status - clear_cache() dg = get_graph(uid) summary = Counter() summary.update({s.name: 0 for s in states}) @@ -221,6 +218,12 @@ def wait_finish(uid, timeout): yield summary if summary[states.PENDING.name] + summary[states.INPROGRESS.name] == 0: return + else: + # on db backends with snapshot isolation level and higher + # updates wont be visible after start of transaction, + # in order to report state correctly we will "refresh" transaction + ModelMeta.session_end() + ModelMeta.session_start() else: raise errors.ExecutionTimeout( diff --git a/solar/test/test_graph_api.py b/solar/test/test_graph_api.py index c2af4931..3b527836 100644 --- a/solar/test/test_graph_api.py +++ b/solar/test/test_graph_api.py @@ -16,6 +16,7 @@ from mock import Mock import networkx as nx from pytest import fixture +from solar.dblayer.model import clear_cache from solar.orchestration import graph from solar.orchestration.traversal import states @@ -86,7 +87,7 @@ def test_several_updates(simple_plan): if t.name == 'echo_stuff') echo_task.status = states.ERROR.name echo_task.save() - + clear_cache() assert next(graph.wait_finish(simple_plan.graph['uid'], 10)) == { 'SKIPPED': 0, 'SUCCESS': 0,