Skip to content

dsh-remote v0.8.35 — rw_search 可取消/有预算(修 issue #44);并入 rw_edit 别名(PR #45)

Choose a tag to compare

@flymysql flymysql released this 02 Oct 09:50
· 201 commits to main since this release

修 issue #44:rw_search 大目录搜索会把会话永久卡死

@moesnow 的这份报告根因分析逐条成立,而且比"跑得慢"更严重:不是慢,而是
逐条目等满超时定时器,等效永久卡死。

先把机制测出来再动手:SFTP 通道死掉后,连续三次 stat 实测
1013ms / 1003ms / 1004ms(预算 1000ms)—— 每次都等满超时。按默认 20s 算,
一条 stat+readFile 就是 40s,数万条目 ≈ 1.2 天;而 session/cancel、
steer、timeout-policy 全部无效,因为 DSH 的工具取消是协作式的:工具不响应
exec.signal,谁也叫不停它。

四处修复,对应报告建议的四点:

问题 修复
遍历不可取消 searchTree/searchViaShell 接收 exec.signal,每个目录/条目检查;取消时返回已扫到的部分结果并标 CANCELLED(抛错会丢进度)
通道死了不快速失败 pool.js 在 end/close/error 上标记通道已死,后续操作立即以 sftp channel closed 拒绝;另给 c.sftp(cb) 打开子通道加超时(此前远端无响应会永久挂起)
没有预算上限 新增 searchTimeoutMs(60s)/searchMaxEntries(50k),也可用 maxDurationMs/maxEntries 按次覆盖;超限返回部分结果并标 TRUNCATED
未声明 timeoutMs rw_search 现在声明 timeoutMs,timeout-policy 才能生效(该策略只能"请求"工具停止)

另外默认跳过机器级缓存树(~/.npm、~/.cache、~/.cargo 等)—— 报告里
点名的 ~/.npm/_cacache 正是元凶。镜像同步的忽略集刻意不变:静默把缓存目录
移出同步会丢数据;显式传 path 仍可搜索任何位置。

并入 PR #45(@moesnow):rw_edit 参数别名

rw_edit 现在同时接受 old/new 与 old_string/new_string。PR 的论证
经核实成立:宿主原生 edit 工具(dsh-tool-fs)声明的正是
file_path/old_string/new_string,模型照抄这个习惯时被 schema 校验拒掉。

并入时发现并补了两个缺口:

  • 补上 file_path 别名。PR 只做了 old_string/new_string,但 path 仍在
    schema 里 required —— 模型若一并照抄原生拼写(file_path),依然被拒。
  • 修一个因放宽 schema 引入的回归:resolveRemoteArg 对空路径会回退到工作区根,
    所以仅去掉 required 会让"没给路径"的 rw_edit 静默改写工作区根。
    现在先校验原始参数是否存在,再解析。

同时修了我上一轮引入的缺陷:test/docs-images.test.js 依赖 Python + Pillow,
在没有 PIL 的环境(正是 PR 作者的环境)会误报失败。现在探测不到 PIL 就
skip 并说明原因。

防回归

  • test/search-cancel.test.js(10 例)
  • test/rw-edit-args.test.js(5 例,含 PR 作者的 4 例)

每条修复都做了负对照:去掉取消检查 → 3 例变红且耗时升到 5-8s(失控遍历的特征);
去掉死通道标记 → 该例变红;去掉打开超时 → 整个测试挂死(这本身就是 bug 的证明)。

303/303 测试通过,check.mjs 干净。并在真实 DSH 实例上验证:
0.8.35 能安装、启动、/dsh-remote/* 路由可达、插件面板正常渲染。

升级

dsh plugin --profile web add dsh-remote@latest

需要重启 DSH 才会加载新版本(宿主半代码变更)。


安装:npm install dsh-remote@0.8.35 · npm · 完整变更