From c6dd032bf8cb14b9134d6267c5cbcf157fc31aef Mon Sep 17 00:00:00 2001 From: M Pacer Date: Wed, 6 Jun 2018 12:34:43 -0700 Subject: [PATCH] add kernel_info_timeout traitlet to wait for slow kernel startups This affects both the MappingKernelManager and the ZMQChannelsHandler(by extension). This allows one setting to apply to both startup andrestarting. --- notebook/services/kernels/handlers.py | 3 ++- notebook/services/kernels/kernelmanager.py | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/notebook/services/kernels/handlers.py b/notebook/services/kernels/handlers.py index fc38f04aa..359d6fafc 100644 --- a/notebook/services/kernels/handlers.py +++ b/notebook/services/kernels/handlers.py @@ -104,7 +104,8 @@ class ZMQChannelsHandler(AuthenticatedZMQStreamHandler): @property def kernel_info_timeout(self): - return self.settings.get('kernel_info_timeout', 10) + km_default = self.kernel_manager.kernel_info_timeout + return self.settings.get('kernel_info_timeout', km_default) @property def iopub_msg_rate_limit(self): diff --git a/notebook/services/kernels/kernelmanager.py b/notebook/services/kernels/kernelmanager.py index 92e7bf2a9..859c9c2d7 100644 --- a/notebook/services/kernels/kernelmanager.py +++ b/notebook/services/kernels/kernelmanager.py @@ -19,7 +19,7 @@ from tornado.ioloop import IOLoop, PeriodicCallback from jupyter_client.session import Session from jupyter_client.multikernelmanager import MultiKernelManager from traitlets import (Any, Bool, Dict, List, Unicode, TraitError, Integer, - Instance, default, validate + Float, Instance, default, validate ) from notebook.utils import to_os_path, exists @@ -93,6 +93,18 @@ class MappingKernelManager(MultiKernelManager): no frontends are connected. """ ) + + kernel_info_timeout = Float(60, config=True, + help="""Timeout for giving up on a kernel (in seconds). + + On starting and restarting kernels, we check whether the + kernel is running and responsive by sending kernel_info_requests. + This sets the timeout in seconds for how long the kernel can take + before being presumed dead. + This affects the MappingKernelManager (which handles kernel restarts) + and the ZMQChannelsHandler (which handles the startup). + """ + ) _kernel_buffers = Any() @default('_kernel_buffers') @@ -305,7 +317,7 @@ class MappingKernelManager(MultiKernelManager): kernel.session.send(channel, "kernel_info_request") channel.on_recv(on_reply) loop = IOLoop.current() - timeout = loop.add_timeout(loop.time() + 30, on_timeout) + timeout = loop.add_timeout(loop.time() + self.kernel_info_timeout, on_timeout) return future def notify_connect(self, kernel_id): @@ -434,4 +446,3 @@ class MappingKernelManager(MultiKernelManager): self.log.warning("Culling '%s' kernel '%s' (%s) with %d connections due to %s seconds of inactivity.", kernel.execution_state, kernel.kernel_name, kernel_id, connections, idle_duration) self.shutdown_kernel(kernel_id) -