From: Steven Hardy Date: Tue, 8 Jan 2013 14:37:23 +0000 (+0000) Subject: heat engine : ensure create thread exits on stack delete X-Git-Tag: 2014.1~1021^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=fc57ec50dbbdad5b3916e5bd385c59601d2a5793;p=openstack-build%2Fheat-build.git heat engine : ensure create thread exits on stack delete 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 --- diff --git a/heat/engine/resource.py b/heat/engine/resource.py index 92806207..b97d5ce9 100644 --- a/heat/engine/resource.py +++ b/heat/engine/resource.py @@ -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)