summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-08-02 22:20:02 +0000
committerGerrit Code Review <review@openstack.org>2014-08-02 22:20:02 +0000
commit70c4c297661327301a0c3b247a31aa62653d2bbd (patch)
treedb758d3910b91076f0d0d36ee07de02531b95f86
parentb4e9d987952ee8c4d45d0416f756a11ee35a5863 (diff)
parent48ed4831ecb3ed6203cfa6907a72846baf6ff86d (diff)
downloadheat-70c4c297661327301a0c3b247a31aa62653d2bbd.tar.gz
Merge "Stop periodic watcher tasks before deleting stack" into stable/icehouse2014.1.2
-rw-r--r--heat/engine/service.py5
-rw-r--r--heat/tests/test_engine_service.py21
2 files changed, 26 insertions, 0 deletions
diff --git a/heat/engine/service.py b/heat/engine/service.py
index e29aab7c0..e4acbe67d 100644
--- a/heat/engine/service.py
+++ b/heat/engine/service.py
@@ -151,6 +151,10 @@ class ThreadGroupManager(object):
self.groups[stack_id].add_timer(cfg.CONF.periodic_interval,
func, *args, **kwargs)
+ def stop_timers(self, stack_id):
+ if stack_id in self.groups:
+ self.groups[stack_id].stop_timers()
+
def stop(self, stack_id):
'''Stop any active threads on a stack.'''
if stack_id in self.groups:
@@ -704,6 +708,7 @@ class EngineService(service.Service):
# Successfully acquired lock
if acquire_result is None:
+ self.thread_group_mgr.stop_timers(stack.id)
self.thread_group_mgr.start_with_acquired_lock(stack, lock,
stack.delete)
return
diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py
index 157f1cb46..b74e510c4 100644
--- a/heat/tests/test_engine_service.py
+++ b/heat/tests/test_engine_service.py
@@ -682,6 +682,27 @@ class StackServiceCreateUpdateDeleteTest(HeatTestCase):
self.man.thread_group_mgr.groups[sid].wait()
self.m.VerifyAll()
+ def test_stack_delete_acquired_lock_stop_timers(self):
+ stack_name = 'service_delete_test_stack'
+ stack = get_wordpress_stack(stack_name, self.ctx)
+ sid = stack.store()
+
+ st = db_api.stack_get(self.ctx, sid)
+ self.m.StubOutWithMock(parser.Stack, 'load')
+ parser.Stack.load(self.ctx, stack=st).MultipleTimes().AndReturn(stack)
+ self.man.tg = DummyThreadGroup()
+
+ self.m.StubOutWithMock(stack_lock.StackLock, 'try_acquire')
+ stack_lock.StackLock.try_acquire().AndReturn(self.man.engine_id)
+ self.m.ReplayAll()
+
+ self.man.thread_group_mgr.add_timer(stack.id, 'test')
+ self.assertEqual(1, len(self.man.thread_group_mgr.groups[sid].timers))
+ self.assertIsNone(self.man.delete_stack(self.ctx, stack.identifier()))
+ self.assertEqual(0, len(self.man.thread_group_mgr.groups[sid].timers))
+ self.man.thread_group_mgr.groups[sid].wait()
+ self.m.VerifyAll()
+
def test_stack_delete_current_engine_active_lock(self):
stack_name = 'service_delete_test_stack'
stack = get_wordpress_stack(stack_name, self.ctx)