From aad063e3cdb529d40d47464cdf885accc7b70600 Mon Sep 17 00:00:00 2001 From: Min RK Date: Mon, 26 Sep 2016 13:20:42 +0200 Subject: [PATCH] remove stopped users from proxy on startup We already added running users, but we didn't handle removing users from the proxy if the user's server was stopped (e.g. while the Hub was restarting). --- jupyterhub/app.py | 3 ++- jupyterhub/orm.py | 22 ++++++++++------------ jupyterhub/user.py | 4 ++-- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/jupyterhub/app.py b/jupyterhub/app.py index d3d8347cdf..ccbd9e1e09 100644 --- a/jupyterhub/app.py +++ b/jupyterhub/app.py @@ -1112,7 +1112,7 @@ def start_proxy(self): if self.proxy.public_server.is_up() or self.proxy.api_server.is_up(): # check for *authenticated* access to the proxy (auth token can change) try: - yield self.proxy.get_routes() + routes = yield self.proxy.get_routes() except (HTTPError, OSError, socket.error) as e: if isinstance(e, HTTPError) and e.code == 403: msg = "Did CONFIGPROXY_AUTH_TOKEN change?" @@ -1124,6 +1124,7 @@ def start_proxy(self): return else: self.log.info("Proxy already running at: %s", self.proxy.public_server.bind_url) + yield self.proxy.check_routes(self.users, self._service_map, routes) self.proxy_process = None return diff --git a/jupyterhub/orm.py b/jupyterhub/orm.py index 5e581e19d2..f9827aadf7 100644 --- a/jupyterhub/orm.py +++ b/jupyterhub/orm.py @@ -257,19 +257,17 @@ def check_routes(self, user_dict, service_dict, routes=None): user_routes = { r['user'] for r in routes.values() if 'user' in r } futures = [] db = inspect(self).session - for orm_user in db.query(User).filter(User.server != None): + for orm_user in db.query(User): user = user_dict[orm_user] - if not user.running: - # Don't add users to the proxy that haven't finished starting - continue - if user.server is None: - # This should never be True, but seems to be on rare occasion. - # catch filter bug, either in sqlalchemy or my understanding of its behavior - self.log.error("User %s has no server, but wasn't filtered out.", user) - continue - if user.name not in user_routes: - self.log.warning("Adding missing route for %s (%s)", user.name, user.server) - futures.append(self.add_user(user)) + if user.running: + if user.name not in user_routes: + self.log.warning("Adding missing route for %s (%s)", user.name, user.server) + futures.append(self.add_user(user)) + else: + # User not running, make sure it's not in the table + if user.name in user_routes: + self.log.warning("Removing route for not running %s", user.name) + futures.append(self.delete_user(user)) # check service routes service_routes = { r['service'] for r in routes.values() if 'service' in r } diff --git a/jupyterhub/user.py b/jupyterhub/user.py index 20f3aa8d5b..4486974591 100644 --- a/jupyterhub/user.py +++ b/jupyterhub/user.py @@ -161,9 +161,9 @@ def escaped_name(self): @property def proxy_path(self): if self.settings.get('subdomain_host'): - return url_path_join('/' + self.domain, self.server.base_url) + return url_path_join('/' + self.domain, self.base_url) else: - return self.server.base_url + return self.base_url @property def domain(self):