cleanup after any exception in spawn

not just timeouts
This commit is contained in:
Min RK
2015-02-06 14:28:45 -08:00
parent d1c42f960c
commit 1fd139418a

View File

@@ -285,7 +285,7 @@ class User(Base):
Returns None if not found.
"""
return db.query(cls).filter(cls.name==name).first()
@gen.coroutine
def spawn(self, spawner_class, base_url='/', hub=None, config=None):
"""Start the user's spawner"""
@@ -298,11 +298,10 @@ class User(Base):
)
db.add(self.server)
db.commit()
api_token = self.new_api_token()
db.commit()
spawner = self.spawner = spawner_class(
config=config,
user=self,
@@ -318,17 +317,22 @@ class User(Base):
# wait for spawner.start to return
try:
yield gen.with_timeout(timedelta(seconds=spawner.start_timeout), f)
except gen.TimeoutError as e:
self.log.warn("{user}'s server failed to start in {s} seconds, giving up".format(
user=self.name, s=spawner.start_timeout,
))
except Exception as e:
if isinstance(e, gen.TimeoutError):
self.log.warn("{user}'s server failed to start in {s} seconds, giving up".format(
user=self.name, s=spawner.start_timeout,
))
else:
self.log.error("Unhandled error starting {user}'s server: {error}".format(
user=self.name, error=e,
))
try:
yield self.stop()
except Exception:
self.log.error("Failed to cleanup {user}'s server that failed to start".format(
user=self.name,
), exc_info=True)
# raise original TimeoutError
# raise original exception
raise e
spawner.start_polling()
@@ -338,10 +342,15 @@ class User(Base):
db.commit()
try:
yield self.server.wait_up(http=True)
except TimeoutError as e:
self.log.warn("{user}'s server never showed up at {url}, giving up".format(
user=self.name, url=self.server.url,
))
except Exception as e:
if isinstance(e, TimeoutError):
self.log.warn("{user}'s server never showed up at {url}, giving up".format(
user=self.name, url=self.server.url,
))
else:
self.log.error("Unhandled error waiting for {user}'s server to show up at {url}: {error}".format(
user=self.name, url=self.server.url, error=e,
))
try:
yield self.stop()
except Exception: