Skip to content

fix(mcp): close 成功才摘除连接登记,杜绝孤儿子进程 - #438

Closed
Ver-zhzh wants to merge 2 commits into
huiliyi37:mainfrom
Ver-zhzh:fix/issue-432-mcp-close-dereg
Closed

Ver-zhzh wants to merge 2 commits into
huiliyi37:mainfrom
Ver-zhzh:fix/issue-432-mcp-close-dereg

Conversation

@Ver-zhzh

Copy link
Copy Markdown
Collaborator

修复批次:MCP close 失败路径提前摘除登记导致孤儿子进程

关联 issue #432。影响面:transport.close() 抛错(子进程僵死/管道已断/Windows taskkill 失败)叠加 generation 过期、inventory 拦截或 tool discovery 失败时,连接被提前从 connections 唯一登记表摘除,退出路径的 killChildrenSync() 找不到它,留下 PPID=1 的孤儿子进程,只能手工 taskkill。

1. close 成功才摘除 connections 登记

现象:McpManager 在 5 处失败/过期路径上先(或无条件)connections.delete(serverId)、后 best-effort transport.close();close 抛错后连接已失登记,killChildrenSync() 无法回收。
根因:src/mcp/manager.ts —— ① _connectServer 后 generation 过期分支 close 前从不登记(最严重,子进程已 spawn);② inventory block 分支 delete 先于 close;③/④ tool discovery 失败分支与 _discoverTools 后 generation 过期分支 close 后无条件 delete;⑤ shutdownServer close 后无条件 delete。
修复:统一语义——transport.close() 成功才 connections.delete(serverId);close 抛错时保留登记并 suppressReconnect.add(serverId) 防重连,孤子进程在进程退出时由 killChildrenSync() 回收。仅改 src/mcp/manager.ts 一处(+43/-8)。

未修观察(如实报告,非本批引入)

验证

项 结果
npx tsc --noEmit(改前/改后对比) 零新增报错
现有 mcp 测试套件 src/mcp/tests 147/147 通过
最小复现脚本(mock 带 pid 的 transport 且 close 抛错,触发 generation 过期 / shutdownServer) close 抛错 → 连接保留在 connections 中 ✓;close 成功 → 摘除 ✓;ALL ASSERTIONS PASSED

Closes #432

5 处失败/过期路径统一语义:transport.close() 成功才 connections.delete;
close 抛错保留登记 + suppressReconnect 防重连,孤子进程由退出时的
killChildrenSync() 回收(此前提前摘除登记导致 PPID=1 孤儿残留)。

Closes huiliyi37#432
huiliyi37 added a commit that referenced this pull request Oct 10, 2026
内容已经 sync 流程合入(dev 收编记录:未检索到),本提交为作者署名落账(提交页归属)。

Co-authored-by: Ver-zhzh <225828202+Ver-zhzh@users.noreply.github.com>
@huiliyi37

Copy link
Copy Markdown
Owner

已通过 sync 流程合入 dev,感谢 @Ver-zhzh 的贡献 🎉

本 PR 的改动(fix(mcp): close 成功才摘除连接登记,杜绝孤儿子进程)已经 sync 流程合入主仓(本次 sync),并已收录进 CONTRIBUTORS.md。

按仓库的双仓流程,公开仓 PR 不经 merge 按钮合入(保持 dev 主仓唯一事实源),现以 sync-merged 标记关闭。欢迎继续贡献!

@huiliyi37 huiliyi37 added the sync-merged 内容已通过 sync 流程合入 dev 主仓(PR 形态留痕,作者计入 CONTRIBUTORS) label Oct 10, 2026
@huiliyi37 huiliyi37 closed this Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

sync-merged 内容已通过 sync 流程合入 dev 主仓(PR 形态留痕,作者计入 CONTRIBUTORS)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] MCP 连接 close 失败路径被提前摘除登记,子进程沦为孤儿

2 participants