From fd8586c4c123ba0cca709eb913a7ccf43ad6b02e Mon Sep 17 00:00:00 2001 From: Min RK Date: Wed, 27 Mar 2019 16:11:31 +0100 Subject: [PATCH] Backport PR #4513: Fix regressions in 5.7.x --- docs/source/changelog.rst | 11 +++++++++++ notebook/base/zmqhandlers.py | 18 +++++++++++++++--- notebook/services/kernels/kernelmanager.py | 3 ++- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index e327b6997e..685abc5945 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -21,6 +21,17 @@ We strongly recommend that you upgrade pip to version 9+ of pip before upgrading Use ``pip install pip --upgrade`` to upgrade pip. Check pip version with ``pip --version``. +.. _release-5.7.7: + +5.7.7 +----- + +- Fix regression in restarting kernels in 5.7.5. + The restart handler would return before restart was completed. +- Further improve compatibility with tornado 6 with improved + checks for when websockets are closed. +- Fix regression in 5.7.6 on Windows where .js files could have the wrong mime-type. + .. _release-5.7.6: 5.7.6 diff --git a/notebook/base/zmqhandlers.py b/notebook/base/zmqhandlers.py index 943dbaed46..9a64323c2c 100644 --- a/notebook/base/zmqhandlers.py +++ b/notebook/base/zmqhandlers.py @@ -17,7 +17,8 @@ import tornado from tornado import gen, ioloop, web -from tornado.websocket import WebSocketHandler +from tornado.iostream import StreamClosedError +from tornado.websocket import WebSocketHandler, WebSocketClosedError from jupyter_client.session import Session from jupyter_client.jsonutil import date_default, extract_dates @@ -185,8 +186,13 @@ def send_ping(self): self.log.warning("WebSocket ping timeout after %i ms.", since_last_pong) self.close() return + try: + self.ping(b'') + except (StreamClosedError, WebSocketClosedError): + # websocket has been closed, stop pinging + self.ping_callback.stop() + return - self.ping(b'') self.last_ping = now def on_pong(self, data): @@ -246,8 +252,14 @@ def _on_zmq_reply(self, stream, msg_list): msg = self._reserialize_reply(msg_list, channel=channel) except Exception: self.log.critical("Malformed message: %r" % msg_list, exc_info=True) - else: + return + + try: self.write_message(msg, binary=isinstance(msg, bytes)) + except (StreamClosedError, WebSocketClosedError): + self.log.warning("zmq message arrived on closed channel") + self.close() + return class AuthenticatedZMQStreamHandler(ZMQStreamHandler, IPythonHandler): diff --git a/notebook/services/kernels/kernelmanager.py b/notebook/services/kernels/kernelmanager.py index b32b27d948..487d46bce4 100644 --- a/notebook/services/kernels/kernelmanager.py +++ b/notebook/services/kernels/kernelmanager.py @@ -320,7 +320,8 @@ def on_restart_failed(): channel.on_recv(on_reply) loop = IOLoop.current() timeout = loop.add_timeout(loop.time() + self.kernel_info_timeout, on_timeout) - raise gen.Return(future) + # wait for restart to complete + yield future def notify_connect(self, kernel_id): """Notice a new connection to a kernel"""