dsh web 在插件树加载完成前就对外提供 HTTP,外部无法判断“真的起好了”
#3320
Fable-Forge
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh@0.1.0-rc.6、@deepseek-ai/dsh-app-boot@0.1.0-rc.6web现象
dsh web会先把 HTTP 服务起起来(返回 200,且返回的是完整页面、含<div id="root">),插件树还在后台继续加载。如果加载阶段出错,进程会在“页面已经能访问”之后才退出。
也就是说:「端口通了」「页面能打开」都不等于「启动成功」。
实测证据
证据 1:就绪与崩溃只隔 55 毫秒
外层守护进程的日志(探测方式:HTTP 200 且响应体包含
id="root"):退出原因是插件树里某个 entry 导入失败(参见 #2920,我在那边补了一份确定性复现)。
证据 2:socket 先 listening,随后进程消失
为什么这是个问题
任何外部编排都会误判:
HEALTHCHECK、k8s readiness probe:标记 Ready → 流量打进来 → 容器重启systemdType=notify/ 端口等待脚本:同上我们在自己的桌面壳里被迫加了这样的变通:
这类逻辑本应由被守护的服务提供语义,而不是每个调用方各自猜。
期望行为(任一即可)
GET /healthz返回{"status":"starting|ready|degraded","failedPlugins":[...]},并在文档里说明“外部守护应当轮询它,而不是轮询首页”;或
如果实现了方案 2,附带好处是外部可以区分「完全正常」和「起来了但某插件降级」。
相关讨论(不是重复,是不同层面)
Discussions 里已有几贴涉及“就绪”,但都不是这个层面,列在这里方便交叉参考:
提案里正是用“匹配 stdout 的
dsh web: http://...那行”来判断何时加载页面。本贴说明的就是这个信号会误判,对该提案有直接影响。
讲的是“插件失败后如何降级”,本贴讲的是“失败前已经对外宣称就绪”。
两者叠加才是完整故障:先宣称就绪 → 再崩 → 外部守护已经把窗口显示出来了。
barrier before session/new、First prompt after boot races async MCP tool
registration —— 这两贴是 SDK / MCP 层的就绪竞态,和本贴(HTTP 层对外服务时机)
是同一类问题的不同表现,也许可以用同一个“plugins-ready barrier”一起解决。
备注
--host/--port已经能满足外部拉起的需要,只差一个可靠的“何时算好了”信号。All reactions