diff options
author | Jenkins <jenkins@review.openstack.org> | 2014-08-02 22:20:02 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2014-08-02 22:20:02 +0000 |
commit | 70c4c297661327301a0c3b247a31aa62653d2bbd (patch) | |
tree | db758d3910b91076f0d0d36ee07de02531b95f86 | |
parent | b4e9d987952ee8c4d45d0416f756a11ee35a5863 (diff) | |
parent | 48ed4831ecb3ed6203cfa6907a72846baf6ff86d (diff) | |
download | heat-70c4c297661327301a0c3b247a31aa62653d2bbd.tar.gz |
Merge "Stop periodic watcher tasks before deleting stack" into stable/icehouse2014.1.2
-rw-r--r-- | heat/engine/service.py | 5 | ||||
-rw-r--r-- | heat/tests/test_engine_service.py | 21 |
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) |