From 9d2bc9a2694a3cd93c1b8426ab2dd4d8ef32be2e Mon Sep 17 00:00:00 2001 From: Sergey Kukhtichev Date: Mon, 29 Jan 2018 07:58:29 +0100 Subject: [PATCH 1/4] Add kernel reconnect when kernel is restarted with new ports --- notebook/services/kernels/handlers.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/notebook/services/kernels/handlers.py b/notebook/services/kernels/handlers.py index fc38f04aad..a8649cb0a4 100644 --- a/notebook/services/kernels/handlers.py +++ b/notebook/services/kernels/handlers.py @@ -461,15 +461,34 @@ def _send_status_message(self, status): msg['channel'] = 'iopub' self.write_message(json.dumps(msg, default=date_default)) - def on_kernel_restarted(self): + def on_kernel_restarted(self, **kwargs): + if 'newports' in kwargs: + newports = kwargs['newports'] + else: + self.log.warning('newports parameter is not defined, setting default to False') + newports = False + logging.info("Restarting kernel with new ports: {}".format(newports)) + if newports: + km = self.kernel_manager + km.remove_restart_callback( + self.kernel_id, self.on_kernel_restarted, + ) + km.remove_restart_callback( + self.kernel_id, self.on_restart_failed, 'dead', + ) + km.stop_buffering(self.kernel_id) + km.notify_disconnect(self.kernel_id) + self.open(self.kernel_id) logging.warn("kernel %s restarted", self.kernel_id) self._send_status_message('restarting') + def on_restart_failed(self): logging.error("kernel %s restarted failed!", self.kernel_id) self._send_status_message('dead') + #----------------------------------------------------------------------------- # URL to handler mappings #----------------------------------------------------------------------------- From f85e0b75023e9b485a7133834e14023f313659a6 Mon Sep 17 00:00:00 2001 From: Sergey Kukhtichev Date: Mon, 29 Jan 2018 15:05:34 +0100 Subject: [PATCH 2/4] change log level to debug --- notebook/services/kernels/handlers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/notebook/services/kernels/handlers.py b/notebook/services/kernels/handlers.py index a8649cb0a4..1c9a28c5d6 100644 --- a/notebook/services/kernels/handlers.py +++ b/notebook/services/kernels/handlers.py @@ -463,9 +463,10 @@ def _send_status_message(self, status): def on_kernel_restarted(self, **kwargs): if 'newports' in kwargs: + self.log.debug("Kernel restarted with new ports") newports = kwargs['newports'] else: - self.log.warning('newports parameter is not defined, setting default to False') + self.log.debug('newports parameter is not defined, setting default to False') newports = False logging.info("Restarting kernel with new ports: {}".format(newports)) if newports: From 495fc8f0fb300758026f713eff617dbfa83ea0f3 Mon Sep 17 00:00:00 2001 From: Sergey Kukhtichev Date: Tue, 30 Jan 2018 15:12:45 +0100 Subject: [PATCH 3/4] Stream is closed when the kernel is restarted with new ports, Use create_stream and listen for the opened stream instead of calling open fnction --- notebook/services/kernels/handlers.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/notebook/services/kernels/handlers.py b/notebook/services/kernels/handlers.py index 1c9a28c5d6..3a43d7f37c 100644 --- a/notebook/services/kernels/handlers.py +++ b/notebook/services/kernels/handlers.py @@ -470,16 +470,23 @@ def on_kernel_restarted(self, **kwargs): newports = False logging.info("Restarting kernel with new ports: {}".format(newports)) if newports: - km = self.kernel_manager - km.remove_restart_callback( - self.kernel_id, self.on_kernel_restarted, - ) - km.remove_restart_callback( - self.kernel_id, self.on_restart_failed, 'dead', - ) - km.stop_buffering(self.kernel_id) - km.notify_disconnect(self.kernel_id) - self.open(self.kernel_id) + # Stream should be closed before reconnecting to the new ports + for channel, stream in self.channels.items(): + if stream is not None and not stream.closed(): + stream.on_recv(None) + stream.close() + # Connect to the stream with new ports + try: + self.create_stream() + except web.HTTPError as e: + self.log.error("Error opening stream after kernel restarted: %s", e) + for channel, stream in self.channels.items(): + if not stream.closed(): + stream.close() + self.close() + return + for channel, stream in self.channels.items(): + stream.on_recv_stream(self._on_zmq_reply) logging.warn("kernel %s restarted", self.kernel_id) self._send_status_message('restarting') From 27ade55e02127ebfa55753ea05f01aa85f4ee97e Mon Sep 17 00:00:00 2001 From: Sergey Kukhtichev Date: Wed, 31 Jan 2018 15:29:06 +0100 Subject: [PATCH 4/4] Removed empty lines --- notebook/services/kernels/handlers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/notebook/services/kernels/handlers.py b/notebook/services/kernels/handlers.py index 3a43d7f37c..39c1e076e5 100644 --- a/notebook/services/kernels/handlers.py +++ b/notebook/services/kernels/handlers.py @@ -490,13 +490,11 @@ def on_kernel_restarted(self, **kwargs): logging.warn("kernel %s restarted", self.kernel_id) self._send_status_message('restarting') - def on_restart_failed(self): logging.error("kernel %s restarted failed!", self.kernel_id) self._send_status_message('dead') - #----------------------------------------------------------------------------- # URL to handler mappings #-----------------------------------------------------------------------------