I have a Jupyterhub configured to use Native Auth, with DockerSpawner.
After running for a while (months or weeks, a time which I suspect depends on how many users are active), the server experiences a runtime error RecursionError: maximum recursion depth exceeded while calling a Python object
I would expect that it would just run.
Looking in the error message output, it seems that this might be related to the Native Auth authenticator:
HTTPServerRequest(protocol='https', host='jupyterhub-steelelab.tnw.tudelft.nl', method='GET', uri='/hub/login?next=%2Fhub%2Fuser%2Flieuwelocht%2Fmetrics', version='HTTP/1.1', remote_ip='::ffff:1
45.94.145.117')
Traceback (most recent call last):
File "/root/miniconda3/lib/python3.7/site-packages/tornado/web.py", line 1703, in _execute
result = await result
File "/root/miniconda3/lib/python3.7/site-packages/jupyterhub/handlers/login.py", line 135, in get
self.finish(self._render(username=username))
File "/root/native_auth/nativeauthenticator/nativeauthenticator/handlers.py", line 151, in _render
{'next': self.get_argument('next', '')},
File "/root/miniconda3/lib/python3.7/site-packages/jupyterhub/handlers/base.py", line 1044, in render_template
return template.render(**template_ns)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/environment.py", line 1090, in render
self.environment.handle_exception()
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/environment.py", line 832, in handle_exception
reraise(*rewrite_traceback_stack(source=source))
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/_compat.py", line 28, in reraise
raise value.with_traceback(tb)
File "/root/native_auth/nativeauthenticator/nativeauthenticator/templates/native-login.html", line 1, in top-level template code
{% extends "page.html" %}
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/environment.py", line 592, in _generate
optimized=self.optimized,
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 87, in generate
generator.visit(node)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 32, in visit
return f(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 774, in visit_Template
self.blockvisit(node.body, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 381, in blockvisit
self.visit(node, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 32, in visit
return f(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 1233, in visit_Macro
macro_frame, macro_ref = self.macro_body(node, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 580, in macro_body
self.blockvisit(node.body, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 381, in blockvisit
self.visit(node, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 32, in visit
return f(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 1458, in visit_Assign
self.visit(node.node, frame)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 32, in visit
return f(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/compiler.py", line 70, in new_func
new_node = self.optimizer.visit(node, frame.eval_ctx)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 33, in visit
return self.generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/optimizer.py", line 27, in generic_visit
node = super(Optimizer, self).generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 67, in generic_visit
new_node = self.visit(old_value, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 33, in visit
return self.generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/optimizer.py", line 27, in generic_visit
node = super(Optimizer, self).generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 67, in generic_visit
new_node = self.visit(old_value, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 33, in visit
return self.generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/optimizer.py", line 27, in generic_visit
node = super(Optimizer, self).generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 67, in generic_visit
new_node = self.visit(old_value, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 33, in visit
return self.generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/optimizer.py", line 27, in generic_visit
node = super(Optimizer, self).generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 67, in generic_visit
new_node = self.visit(old_value, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 33, in visit
return self.generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/optimizer.py", line 27, in generic_visit
node = super(Optimizer, self).generic_visit(node, *args, **kwargs)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/visitor.py", line 66, in generic_visit
elif isinstance(old_value, Node):
RecursionError: maximum recursion depth exceeded while calling a Python object
File "/root/native_auth/nativeauthenticator/nativeauthenticator/templates/native-login.html", line 1, in top-level template code
{% extends "page.html" %}
After this initial error message, the logfiles are filled with tracebacks like this one:
Traceback (most recent call last):
File "/root/miniconda3/lib/python3.7/site-packages/tornado/web.py", line 1703, in _execute
result = await result
File "/root/miniconda3/lib/python3.7/site-packages/jupyterhub/handlers/login.py", line 135, in get
self.finish(self._render(username=username))
File "/root/native_auth/nativeauthenticator/nativeauthenticator/handlers.py", line 151, in _render
{'next': self.get_argument('next', '')},
File "/root/miniconda3/lib/python3.7/site-packages/jupyterhub/handlers/base.py", line 1043, in render_template
template = self.get_template(name)
File "/root/miniconda3/lib/python3.7/site-packages/jupyterhub/handlers/base.py", line 1037, in get_template
return self.settings['jinja2_env'].get_template(name)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/environment.py", line 883, in get_template
return self._load_template(name, self.make_globals(globals))
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/environment.py", line 857, in _load_template
template = self.loader.load(self, name, globals)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/loaders.py", line 426, in load
return loader.load(environment, name, globals)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/loaders.py", line 426, in load
return loader.load(environment, name, globals)
File "/root/miniconda3/lib/python3.7/site-packages/jinja2/loaders.py", line 426, in load
return loader.load(environment, name, globals)
[Previous line repeated 982 more times]
RecursionError: maximum recursion depth exceeded