@@ -222,3 +222,40 @@ async def test_no_fd_leak_on_disconnect_with_orphaned_kernel_info_channel(
222222 f"FD leak detected: { final_fds - baseline_fds } FDs leaked after 100 "
223223 f"disconnects with orphaned kernel_info_channel"
224224 )
225+
226+
227+ @pytest .mark .skipif (sys .platform == "win32" , reason = "Times out on Windows" )
228+ async def test_disconnect_resolves_orphaned_kernel_info_future (jp_serverapp : ServerApp ) -> None :
229+ """Disconnecting with an orphaned kernel_info channel should not leave
230+ kernel_manager._kernel_info_future pending, which would block reconnects
231+ waiting for a never-arriving kernel_info reply."""
232+ app = jp_serverapp
233+ km = app .kernel_manager
234+ kernel_id = await km .start_kernel ()
235+ kernel = km .get_kernel (kernel_id )
236+
237+ conn1 = _make_connection (app , kernel , timeout = 5.0 )
238+ conn1 .create_stream ()
239+ conn1 .session .key = kernel .session .key
240+ conn1 .session_key = f"{ kernel_id } :{ conn1 .session .session } "
241+
242+ # Simulate an in-flight kernel_info request that never gets a reply.
243+ conn1 .kernel_info_channel = km .connect_shell (kernel_id )
244+ km ._kernel_info_future = conn1 ._kernel_info_future
245+
246+ # Force the buffering early-return path in disconnect().
247+ # disconnect() first decrements the connection count via
248+ # notify_disconnect(), so start at 1 to reach the == 0 branch.
249+ km ._kernel_connections [kernel_id ] = 1
250+ ZMQChannelsWebsocketConnection ._open_sockets .add (conn1 )
251+ conn1 .disconnect ()
252+
253+ # Regression check: pending shared future must be resolved by disconnect.
254+ assert conn1 ._kernel_info_future .done ()
255+
256+ # A new connection should not block waiting on the stale pending future.
257+ conn2 = _make_connection (app , kernel , timeout = 0.2 )
258+ conn2 .create_stream ()
259+ conn2 .session .key = kernel .session .key
260+ conn2 .kernel_info_timeout = 0.2
261+ await asyncio .wait_for (asyncio .wrap_future (conn2 .request_kernel_info ()), timeout = 1.0 )
0 commit comments