]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : ensure create thread exits on stack delete
authorSteven Hardy <shardy@redhat.com>
Tue, 8 Jan 2013 14:37:23 +0000 (14:37 +0000)
committerSteven Hardy <shardy@redhat.com>
Tue, 8 Jan 2013 14:37:23 +0000 (14:37 +0000)
Detect GreenletExit exception when creating resources - this may
happen if the stack gets deleted while the stack is still in
CREATE_IN_PROGRESS state.  If we don't detect this then the stack
continues trying to create resources during/after the stack has been
deleted, with predictably nasty results..

fixes bug 1096150

Change-Id: Ieb6ed38d0000cd6fe3bc1af2eb5d2e5eecc74fb4
Signed-off-by: Steven Hardy <shardy@redhat.com>
heat/engine/resource.py

index 9280620765b5ac4570f3db04cad1a5a7c8746557..b97d5ce96d5da42352a181e0dfc26ab5ebffaae5 100644 (file)
@@ -15,6 +15,7 @@
 
 import base64
 from datetime import datetime
+from eventlet.support import greenlets as greenlet
 
 from heat.engine import event
 from heat.common import exception
@@ -228,9 +229,15 @@ class Resource(object):
             if callable(getattr(self, 'handle_create', None)):
                 self.handle_create()
         except Exception as ex:
-            logger.exception('create %s', str(self))
-            self.state_set(self.CREATE_FAILED, str(ex))
-            return str(ex)
+            # If we get a GreenletExit exception, the create thread has
+            # been killed so we should raise allowing this thread to exit
+            if type(ex) is greenlet.GreenletExit:
+                logger.warning('GreenletExit during create, exiting')
+                raise
+            else:
+                logger.exception('create %s', str(self))
+                self.state_set(self.CREATE_FAILED, str(ex))
+                return str(ex)
         else:
             self.state_set(self.CREATE_COMPLETE)