无头快照的迟到所有权¶
已复现的缺陷¶
运行时可能会在渲染器/提供者快照或模拟器种子写入仍挂起时,退役某个 PTY 或替换其无头模型。旧的完成回调仍会更新仅以 PTY ID 为键的映射。退出清理之后,成功的渲染器回复会重新创建 CWD、recent-output 和标题状态;即使是空回复或被拒绝的回复,也会重新创建水合 done 条目。被替换的模型也可能因旧的完成回调而丢失其提供者偏好或待处理的水合状态。
提供者快照验证存在两个相关的竞态。其迟到的代际检查会调用一个会分配内存的 getter,重新创建退出刚刚删除的条目。其清理逻辑可能在旧 Set 变为空之后,删除较新捕获的实时模式扫描器 Set。提供者尾部解析在等待的解析/写入之后,也存在同样的会分配内存的迟到检查。
这些路径存在于 v1.4.198 中。它们解释了 PTY 频繁变动下一种具体的主进程/运行时保留机制,但 #19831/#19768 中的发生频率和保留大小仍未得到证实。渲染器请求已经有 750 ms 超时(src/main/ipc/pty/ipc/serialize-buffer.ts);此修复针对的是所有者退役后仍进行写入的回调,而不是渲染器无限期等待。
修复与所有权¶
三个模型种子路径在开始工作之前以及异步边界之后,都会将 headlessTerminals.get(ptyId) 与捕获的状态进行比较。完成记账仅针对该状态执行。提供者捕获/尾部完成会在不分配的情况下比较现有代际,并且捕获清理仅在其仍拥有同一个 Set 时移除映射条目。
准入代际分配和常规排队实时写入保持现有行为。销毁仍会排空退役前排队的实时写入。当前水合、查询重放抑制、CWD/kitty 元数据以及替换捕获模式跟踪仍保持覆盖。这些是针对本地终端和基于 SSH 的终端的本地运行时所有权检查;它们不会增加进程死亡推断、远程取消或线路变更。它们不依赖 git worktrees。
复现¶
在已安装依赖的仓库根目录中运行:
该脚本会两次运行实际的 OrcaRuntimeService 回归测试夹具。对于修复前情况,它仅在临时 Vite 转换中反向应用所包含的四个文件的 fix.patch。它既不重写源文件,也不需要未发布的提交。修复后情况使用已检出的源代码。源哈希和各个失败用例记录在 results.json 中。
- 修复前:16 个失败,6 个通过。
- 修复后:22 个通过。
这些测试通过控制挂起的 Promise,覆盖回调准入之前的退役、渲染器/提供者回复期间、种子写入期间以及 kitty 元数据应用期间。它们覆盖成功、null、拒绝、相同 ID 替换、当前状态成功、代际保留以及实时模式扫描器所有权。提供者尾部检查会验证常规解析和仅可见屏幕解析。
额外验证:
ORCA_BACKGROUND_LAUNCH=1 node node_modules/typescript/bin/tsc --noEmit -p config/tsconfig.node.json
ORCA_BACKGROUND_LAUNCH=1 node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/runtime/orca-runtime.test.ts src/main/runtime/terminal-query-responder.test.ts src/main/runtime/headless-hydration-ownership.test.ts src/main/runtime/headless-seed-ownership.test.ts --testNamePattern 'headless|hydrat|WSL|provider cwd|live WSL cwd|query|seed|retire|replacement|capture|renderer'
Node 类型检查通过。所选的现有运行时/查询检查加上新增用例通过了 306 个测试,另有 1087 个无关用例被名称过滤器跳过。所有运行均为无头模式,并使用了 ORCA_BACKGROUND_LAUNCH=1。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca