Release stack lock when successfully acquire

Should not to release the stack lock if acquire failed,
such as stack action in progress.

Change-Id: I2a519c47306065b0a3412a8c6faa64006dea691f
Closes-Bug: #1418360
This commit is contained in:
huangtianhua 2015-02-05 15:29:54 +08:00
parent 5d47a413a8
commit 00c5993195
2 changed files with 15 additions and 1 deletions

View File

@ -132,6 +132,8 @@ class StackLock(object):
try:
self.acquire()
yield
except exception.ActionInProgress:
raise
except: # noqa
with excutils.save_and_reraise_exception():
self.release(stack_id)

View File

@ -145,7 +145,7 @@ class StackLockTest(common.HeatTestCase):
self.assertRaises(exception.ActionInProgress, slock.acquire)
self.m.VerifyAll()
def test_thread_lock_context_mgr_exception(self):
def test_thread_lock_context_mgr_exception_acquire_success(self):
db_api.stack_lock_create = mock.Mock(return_value=None)
db_api.stack_lock_release = mock.Mock(return_value=None)
slock = stack_lock.StackLock(self.context, self.stack, self.engine_id)
@ -157,6 +157,18 @@ class StackLockTest(common.HeatTestCase):
self.assertRaises(self.TestThreadLockException, check_thread_lock)
self.assertEqual(1, db_api.stack_lock_release.call_count)
def test_thread_lock_context_mgr_exception_acquire_fail(self):
db_api.stack_lock_create = mock.Mock(return_value=self.engine_id)
db_api.stack_lock_release = mock.Mock()
slock = stack_lock.StackLock(self.context, self.stack, self.engine_id)
def check_thread_lock():
with slock.thread_lock(self.stack.id):
self.assertEqual(1, db_api.stack_lock_create.call_count)
raise exception.ActionInProgress
self.assertRaises(exception.ActionInProgress, check_thread_lock)
assert not db_api.stack_lock_release.called
def test_thread_lock_context_mgr_no_exception(self):
db_api.stack_lock_create = mock.Mock(return_value=None)
db_api.stack_lock_release = mock.Mock(return_value=None)