From a7c6767b52614270193583a3fed0e1a4741080f2 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 16 Dec 2022 15:35:45 -0600 Subject: [PATCH 1/2] find an available port before starting event loop --- jupyter_server/serverapp.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index 45528e0d87..9a2424a1ff 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -2337,6 +2337,8 @@ def init_httpserver(self): ) # binding sockets must be called from inside an event loop + if not self.sock: + self._find_http_port() self.io_loop.add_callback(self._bind_http_server) def _bind_http_server(self): @@ -2371,10 +2373,16 @@ def _bind_http_server_unix(self): return True def _bind_http_server_tcp(self): + self.http_server.listen(self.port, self.ip) + return True + + def _find_http_port(self): success = None for port in random_ports(self.port, self.port_retries + 1): + tmp_sock = socket.socket() try: - self.http_server.listen(port, self.ip) + tmp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, b"\0" * 8) + tmp_sock.bind((self.ip, port)) except OSError as e: if e.errno == errno.EADDRINUSE: if self.port_retries: @@ -2396,6 +2404,8 @@ def _bind_http_server_tcp(self): self.port = port success = True break + finally: + tmp_sock.close() if not success: if self.port_retries: self.log.critical( @@ -2413,7 +2423,6 @@ def _bind_http_server_tcp(self): % port ) self.exit(1) - return success @staticmethod def _init_asyncio_patch(): From a37874f09067deec8e4097da89d0f719ccf4d477 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Fri, 16 Dec 2022 18:22:25 -0600 Subject: [PATCH 2/2] now warnings on pypy --- .github/workflows/python-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 020c3655ac..eeb2a55419 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -42,7 +42,7 @@ jobs: run: hatch run cov:test --cov-fail-under 75 || hatch run test:test --lf - name: Run the tests on pypy if: ${{ startsWith(matrix.python-version, 'pypy') }} - run: hatch run test:test || hatch run test:test --lf + run: hatch run test:nowarn || hatch run test:nowarn --lf - name: Run the tests on windows if: ${{ startsWith(matrix.os, 'windows') }} run: hatch run cov:nowarn -s || hatch run cov:nowarn --lf