Merge "Simplify logic in retrigger_check_resource()"

This commit is contained in:
Zuul 2020-05-05 16:06:30 +00:00 committed by Gerrit Code Review
commit 403ac3def7
3 changed files with 21 additions and 31 deletions

View File

@ -106,8 +106,7 @@ class CheckResource(object):
latest_stack = parser.Stack.load(cnxt, stack_id=stack_id,
force_reload=True)
if current_traversal != latest_stack.current_traversal:
self.retrigger_check_resource(cnxt, is_update, rsrc_id,
latest_stack)
self.retrigger_check_resource(cnxt, rsrc_id, latest_stack)
def _handle_stack_timeout(self, cnxt, stack):
failure_reason = u'Timed out'
@ -189,31 +188,25 @@ class CheckResource(object):
return False
def retrigger_check_resource(self, cnxt, is_update, resource_id, stack):
def retrigger_check_resource(self, cnxt, resource_id, stack):
current_traversal = stack.current_traversal
graph = stack.convergence_dependencies.graph()
key = (resource_id, is_update)
if is_update:
# When re-trigger received for update in latest traversal, first
# check if update key is available in graph.
# if No, then latest traversal is waiting for delete.
if (resource_id, is_update) not in graph:
key = (resource_id, not is_update)
else:
# When re-trigger received for delete in latest traversal, first
# check if update key is available in graph,
# if yes, then latest traversal is waiting for update.
if (resource_id, True) in graph:
# not is_update evaluates to True below, which means update
key = (resource_id, not is_update)
LOG.info('Re-trigger resource: (%(key1)s, %(key2)s)',
{'key1': key[0], 'key2': key[1]})
# When re-trigger received for latest traversal, first check if update
# key is available in graph. If yes, the latest traversal is waiting
# for update, otherwise it is waiting for delete. This is the case
# regardless of which action (update or cleanup) from the previous
# traversal was blocking it.
update_key = parser.ConvergenceNode(resource_id, True)
key = parser.ConvergenceNode(resource_id, update_key in graph)
LOG.info('Re-trigger resource: %s', key)
predecessors = set(graph[key])
try:
propagate_check_resource(cnxt, self._rpc_client, resource_id,
current_traversal, predecessors, key,
None, key[1], None)
None, key.is_update, None)
except exception.EntityNotFound as e:
if e.entity != "Sync Point":
raise
@ -285,8 +278,7 @@ class CheckResource(object):
current_traversal)
return
self.retrigger_check_resource(cnxt, is_update,
resource_id, stack)
self.retrigger_check_resource(cnxt, resource_id, stack)
else:
raise
@ -352,7 +344,7 @@ def check_stack_complete(cnxt, stack, current_traversal, sender_id, deps,
def mark_complete(stack_id, data):
stack.mark_complete()
sender_key = (sender_id, is_update)
sender_key = parser.ConvergenceNode(sender_id, is_update)
sync_point.sync(cnxt, stack.id, current_traversal, True,
mark_complete, roots, {sender_key: None})

View File

@ -157,9 +157,8 @@ class WorkerService(object):
db_api.resource_update_and_save(stack.context, rsrc.id, values)
# The old resource might be in the graph (a rollback case);
# just re-trigger it.
key = parser.ConvergenceNode(rsrc.replaces, is_update)
check_resource.retrigger_check_resource(stack.context, is_update,
key.rsrc_id, stack)
check_resource.retrigger_check_resource(stack.context,
rsrc.replaces, stack)
@context.request_context
@log_exceptions

View File

@ -352,7 +352,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
self.stack.current_traversal,
self.is_update, self.resource,
self.stack)
mock_rcr.assert_called_once_with(self.ctx, self.is_update,
mock_rcr.assert_called_once_with(self.ctx,
self.resource.id, updated_stack)
def test_check_stack_complete_is_invoked_for_replaced_resource(
@ -385,8 +385,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
# A, B are predecessors to C when is_update is True
expected_predecessors = {(self.stack['A'].id, True),
(self.stack['B'].id, True)}
self.cr.retrigger_check_resource(self.ctx, self.is_update,
resC.id, self.stack)
self.cr.retrigger_check_resource(self.ctx, resC.id, self.stack)
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, resC.id,
self.stack.current_traversal,
mock.ANY, (resC.id, True), None,
@ -403,7 +402,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
[(1, False), (1, True)], [(2, False), None]])
# simulate rsrc 2 completing its update for old traversal
# and calling rcr
self.cr.retrigger_check_resource(self.ctx, True, 2, self.stack)
self.cr.retrigger_check_resource(self.ctx, 2, self.stack)
# Ensure that pcr was called with proper delete traversal
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, 2,
self.stack.current_traversal,
@ -418,7 +417,7 @@ class CheckWorkflowUpdateTest(common.HeatTestCase):
[(1, False), (1, True)], [(2, False), (2, True)]])
# simulate rsrc 2 completing its delete for old traversal
# and calling rcr
self.cr.retrigger_check_resource(self.ctx, False, 2, self.stack)
self.cr.retrigger_check_resource(self.ctx, 2, self.stack)
# Ensure that pcr was called with proper delete traversal
mock_pcr.assert_called_once_with(self.ctx, mock.ANY, 2,
self.stack.current_traversal,