diff --git a/jupyterhub/app.py b/jupyterhub/app.py index 2c306258..29e23ef0 100644 --- a/jupyterhub/app.py +++ b/jupyterhub/app.py @@ -1494,7 +1494,7 @@ class JupyterHub(Application): if managed_services: self.log.info("Cleaning up %i services...", len(managed_services)) for service in managed_services: - service.stop() + await service.stop() if self.cleanup_servers: self.log.info("Cleaning up single-user servers...") diff --git a/jupyterhub/services/service.py b/jupyterhub/services/service.py index 75455271..6ec52b5d 100644 --- a/jupyterhub/services/service.py +++ b/jupyterhub/services/service.py @@ -56,6 +56,7 @@ from ..traitlets import Command from ..spawner import LocalProcessSpawner, set_user_setuid from ..utils import url_path_join + class _MockUser(HasTraits): name = Unicode() server = Instance(orm.Server, allow_none=True) @@ -71,7 +72,7 @@ class _MockUser(HasTraits): return self.host + self.server.base_url else: return self.server.base_url - + @property def base_url(self): if not self.server: @@ -123,6 +124,7 @@ class _ServiceSpawner(LocalProcessSpawner): self.pid = self.proc.pid + class Service(LoggingConfigurable): """An object wrapping a service specification for Hub API consumers. @@ -320,7 +322,7 @@ class Service(LoggingConfigurable): self.log.error("Service %s exited with status %i", self.name, self.proc.returncode) self.start() - def stop(self): + async def stop(self): """Stop a managed service""" self.log.debug("Stopping service %s", self.name) if not self.managed: @@ -330,4 +332,4 @@ class Service(LoggingConfigurable): self.db.delete(self.orm.server) self.db.commit() self.spawner.stop_polling() - return self.spawner.stop() + return (await self.spawner.stop())