Title: fix: avoid stdio cleanup BrokenResourceError race by lavish0000 · Pull Request #2219 · modelcontextprotocol/python-sdk · GitHub
Open Graph Title: fix: avoid stdio cleanup BrokenResourceError race by lavish0000 · Pull Request #2219 · modelcontextprotocol/python-sdk
X Title: fix: avoid stdio cleanup BrokenResourceError race by lavish0000 · Pull Request #2219 · modelcontextprotocol/python-sdk
Description: Summary cancel the stdio client task group before closing its memory streams during shutdown move memory stream teardown until after the task group has exited add a regression test that exits while stdout_reader is blocked on a zero-buffer send Problem stdio_client() starts background tasks that read process stdout and forward messages into a zero-buffer memory stream. If the caller exits the context without consuming read_stream, stdout_reader can block on read_stream_writer.send(...). Before this change, the cleanup path closed read_stream_writer while stdout_reader was still running inside the task group. That raises anyio.BrokenResourceError and surfaces as an ExceptionGroup during context exit. Fix The cleanup sequence now cancels the task group before any of the memory streams it owns are closed. The stream handles are closed only after the task group has exited, so stdout_reader and stdin_writer are no longer racing against stream teardown. Validation reproduced the failure locally on current main with a minimal stdio server that writes one JSON-RPC message and then idles uv run pytest tests/client/test_stdio.py uv run ruff check src/mcp/client/stdio.py tests/client/test_stdio.py uv run ruff format --check src/mcp/client/stdio.py tests/client/test_stdio.py uv run pyright src/mcp/client/stdio.py tests/client/test_stdio.py
Open Graph Description: Summary cancel the stdio client task group before closing its memory streams during shutdown move memory stream teardown until after the task group has exited add a regression test that exits whil...
X Description: Summary cancel the stdio client task group before closing its memory streams during shutdown move memory stream teardown until after the task group has exited add a regression test that exits whil...
Opengraph URL: https://github.com/modelcontextprotocol/python-sdk/pull/2219
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:332424f6-aa93-729c-adb6-68b48aa99112 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | CC9E:1A32E5:108DF4F:163B75C:6A5B71D1 |
| html-safe-nonce | cbd1f1cba853f473aa43c83ce79429a9da8fc221e8de3a0cc1935f91068a3153 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDQzlFOjFBMzJFNToxMDhERjRGOjE2M0I3NUM6NkE1QjcxRDEiLCJ2aXNpdG9yX2lkIjoiMzYyODYwMzU3NzA3NjUxMTE4NSIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | bc47a6b07d5022e83ae3e5abc8290ad8d35acb720cd2e3befc684f6be0fea885 |
| hovercard-subject-tag | pull_request:3361170675 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/modelcontextprotocol/python-sdk/pull/2219/files |
| twitter:image | https://avatars.githubusercontent.com/u/46993225?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/46993225?s=400&v=4 |
| og:image:alt | Summary cancel the stdio client task group before closing its memory streams during shutdown move memory stream teardown until after the task group has exited add a regression test that exits whil... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5290d7e14309ad1e76106a9c4237bd1041517e83ea182c8ab756752cb0c6940b |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/modelcontextprotocol/python-sdk git https://github.com/modelcontextprotocol/python-sdk.git |
| octolytics-dimension-user_id | 182288589 |
| octolytics-dimension-user_login | modelcontextprotocol |
| octolytics-dimension-repository_id | 862584018 |
| octolytics-dimension-repository_nwo | modelcontextprotocol/python-sdk |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 862584018 |
| octolytics-dimension-repository_network_root_nwo | modelcontextprotocol/python-sdk |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 9c975978430e9ad293956f2bbdaf153b1bd84a99 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width