Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kernelspec Caching #1271

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/source/api/jupyter_server.services.kernelspecs.monitors.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
jupyter\_server.services.kernelspecs.monitors package
=====================================================

Submodules
----------


.. automodule:: jupyter_server.services.kernelspecs.monitors.polling_monitor
:members:
:undoc-members:
:show-inheritance:


.. automodule:: jupyter_server.services.kernelspecs.monitors.watchdog_monitor
:members:
:undoc-members:
:show-inheritance:

Module contents
---------------

.. automodule:: jupyter_server.services.kernelspecs.monitors
:members:
:undoc-members:
:show-inheritance:
14 changes: 14 additions & 0 deletions docs/source/api/jupyter_server.services.kernelspecs.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
jupyter\_server.services.kernelspecs package
============================================

Subpackages
-----------

.. toctree::
:maxdepth: 4

jupyter_server.services.kernelspecs.monitors

Submodules
----------

Expand All @@ -10,6 +18,12 @@ Submodules
:undoc-members:
:show-inheritance:


.. automodule:: jupyter_server.services.kernelspecs.kernelspec_cache
:members:
:undoc-members:
:show-inheritance:

Module contents
---------------

Expand Down
4 changes: 4 additions & 0 deletions jupyter_server/base/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,10 @@ def terminal_manager(self):
def kernel_spec_manager(self):
return self.settings["kernel_spec_manager"]

@property
def kernel_spec_cache(self):
return self.settings["kernel_spec_cache"]

@property
def config_manager(self):
return self.settings["config_manager"]
Expand Down
4 changes: 2 additions & 2 deletions jupyter_server/kernelspecs/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def initialize(self):
@authorized
async def get(self, kernel_name, path, include_body=True):
"""Get a kernelspec resource."""
ksm = self.kernel_spec_manager
ksc = self.kernel_spec_cache
if path.lower().endswith(".png"):
self.set_header("Cache-Control", f"max-age={60*60*24*30}")
ksm = self.kernel_spec_manager
Expand All @@ -50,7 +50,7 @@ async def get(self, kernel_name, path, include_body=True):
)
)
try:
kspec = await ensure_async(ksm.get_kernel_spec(kernel_name))
kspec = await ensure_async(ksc.get_kernel_spec(kernel_name))
self.root = kspec.resource_dir
except KeyError as e:
raise web.HTTPError(404, "Kernel spec %s not found" % kernel_name) from e
Expand Down
21 changes: 21 additions & 0 deletions jupyter_server/serverapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
AsyncMappingKernelManager,
MappingKernelManager,
)
from jupyter_server.services.kernelspecs.kernelspec_cache import KernelSpecCache
from jupyter_server.services.sessions.sessionmanager import SessionManager
from jupyter_server.utils import (
check_pid,
Expand Down Expand Up @@ -235,6 +236,7 @@ def __init__(
authorizer=None,
identity_provider=None,
kernel_websocket_connection_class=None,
kernel_spec_cache=None,
):
"""Initialize a server web application."""
if identity_provider is None:
Expand Down Expand Up @@ -272,6 +274,7 @@ def __init__(
authorizer=authorizer,
identity_provider=identity_provider,
kernel_websocket_connection_class=kernel_websocket_connection_class,
kernel_spec_cache=kernel_spec_cache,
)
handlers = self.init_handlers(default_services, settings)

Expand All @@ -296,6 +299,7 @@ def init_settings(
authorizer=None,
identity_provider=None,
kernel_websocket_connection_class=None,
kernel_spec_cache=None,
):
"""Initialize settings for the web application."""
_template_path = settings_overrides.get(
Expand Down Expand Up @@ -373,6 +377,7 @@ def init_settings(
"contents_manager": contents_manager,
"session_manager": session_manager,
"kernel_spec_manager": kernel_spec_manager,
"kernel_spec_cache": kernel_spec_cache,
"config_manager": config_manager,
"authorizer": authorizer,
"identity_provider": identity_provider,
Expand Down Expand Up @@ -1494,6 +1499,16 @@ def _default_session_manager_class(self):
return "jupyter_server.gateway.managers.GatewaySessionManager"
return SessionManager

kernel_spec_cache_class = Type(
default_value=KernelSpecCache,
klass=KernelSpecCache,
config=True,
help="""
The kernel spec cache class to use. Must be a subclass
of `jupyter_server.services.kernelspecs.kernelspec_cache.KernelSpecCache`.
""",
)

kernel_websocket_connection_class = Type(
klass=BaseKernelWebsocketConnection,
config=True,
Expand Down Expand Up @@ -1892,6 +1907,11 @@ def init_configurables(self):
kernel_manager=self.kernel_manager,
contents_manager=self.contents_manager,
)
self.kernel_spec_cache = self.kernel_spec_cache_class(
parent=self,
log=self.log,
kernel_spec_manager=self.kernel_spec_manager,
)
self.config_manager = self.config_manager_class(
parent=self,
log=self.log,
Expand Down Expand Up @@ -2053,6 +2073,7 @@ def init_webapp(self):
authorizer=self.authorizer,
identity_provider=self.identity_provider,
kernel_websocket_connection_class=self.kernel_websocket_connection_class,
kernel_spec_cache=self.kernel_spec_cache,
)
if self.certfile:
self.ssl_options["certfile"] = self.certfile
Expand Down
8 changes: 4 additions & 4 deletions jupyter_server/services/kernelspecs/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,12 @@ class MainKernelSpecHandler(KernelSpecsAPIHandler):
@authorized
async def get(self):
"""Get the list of kernel specs."""
ksm = self.kernel_spec_manager
ksc = self.kernel_spec_cache
km = self.kernel_manager
model = {}
model["default"] = km.default_kernel_name
model["kernelspecs"] = specs = {}
kspecs = await ensure_async(ksm.get_all_specs())
kspecs = await ensure_async(ksc.get_all_specs())
for kernel_name, kernel_info in kspecs.items():
try:
if is_kernelspec_model(kernel_info):
Expand All @@ -94,10 +94,10 @@ class KernelSpecHandler(KernelSpecsAPIHandler):
@authorized
async def get(self, kernel_name):
"""Get a kernel spec model."""
ksm = self.kernel_spec_manager
ksc = self.kernel_spec_cache
kernel_name = url_unescape(kernel_name)
try:
spec = await ensure_async(ksm.get_kernel_spec(kernel_name))
spec = await ensure_async(ksc.get_kernel_spec(kernel_name))
except KeyError as e:
raise web.HTTPError(404, "Kernel spec %s not found" % kernel_name) from e
if is_kernelspec_model(spec):
Expand Down
Loading