Fix reset_stack_status

Fix reset_stack_status on legacy, by using a different session for each
stack reset, and handling lock duplicate errors.

Closes-Bug: #1735755
Change-Id: I6bcd7448052e86ec3e4eb4c49ef3139c20d4f919
This commit is contained in:
Thomas Herve 2017-12-01 11:48:11 +01:00
parent 34fe34d8fb
commit e1a26279ce
3 changed files with 11 additions and 4 deletions

View File

@ -802,8 +802,13 @@ def stack_delete(context, stack_id):
delete_softly(context, s) delete_softly(context, s)
def _is_duplicate_error(exc):
return isinstance(exc, db_exception.DBDuplicateEntry)
@oslo_db_api.wrap_db_retry(max_retries=3, retry_on_deadlock=True, @oslo_db_api.wrap_db_retry(max_retries=3, retry_on_deadlock=True,
retry_interval=0.5, inc_retry_interval=True) retry_interval=0.5, inc_retry_interval=True,
exception_checker=_is_duplicate_error)
def stack_lock_create(context, stack_id, engine_id): def stack_lock_create(context, stack_id, engine_id):
with db_context.writer.independent.using(context) as session: with db_context.writer.independent.using(context) as session:
lock = session.query(models.StackLock).get(stack_id) lock = session.query(models.StackLock).get(stack_id)

View File

@ -2449,15 +2449,17 @@ class EngineService(service.ServiceBase):
service_objects.Service.delete(cnxt, service_ref['id']) service_objects.Service.delete(cnxt, service_ref['id'])
def reset_stack_status(self): def reset_stack_status(self):
cnxt = context.get_admin_context()
filters = { filters = {
'status': parser.Stack.IN_PROGRESS, 'status': parser.Stack.IN_PROGRESS,
'convergence': False 'convergence': False
} }
stacks = stack_object.Stack.get_all(cnxt, stacks = stack_object.Stack.get_all(context.get_admin_context(),
filters=filters, filters=filters,
show_nested=True) show_nested=True)
for s in stacks: for s in stacks:
# Build one context per stack, so that it can safely be passed to
# to thread.
cnxt = context.get_admin_context()
stack_id = s.id stack_id = s.id
lock = stack_lock.StackLock(cnxt, stack_id, self.engine_id) lock = stack_lock.StackLock(cnxt, stack_id, self.engine_id)
engine_id = lock.get_engine_id() engine_id = lock.get_engine_id()

View File

@ -1328,7 +1328,7 @@ class StackServiceTest(common.HeatTestCase):
self.eng.reset_stack_status() self.eng.reset_stack_status()
mock_admin_context.assert_called_once_with() mock_admin_context.assert_called()
filters = { filters = {
'status': parser.Stack.IN_PROGRESS, 'status': parser.Stack.IN_PROGRESS,
'convergence': False 'convergence': False