跳转至

已取消的 cwd 验证等待器生命周期

已取消的工作目录检查在共享原生文件系统检查仍挂起时保留了它们的 AbortSignal。该变更立即释放这些调用方引用,同时保留底层原生操作、原始 Promise 身份和回调顺序。

每个已取消等待直到原生结算仍保留一个小型 Promise 反应和一个空持有者。 JavaScript Promise 反应无法移除。此修正释放了信号、监听器和调用方 resolver;它并未为等待元数据建立总上限,也无法解释事故内存量级。

所有权与调用方

src/main/providers/working-directory-validation.ts 每个精确 cwd 保留一个挂起验证。原始 fs.stat 无法中止,因此映射条目和任何 UNC 信号量槽位必须在调用方取消后存活到真实结算。提前退役它们会允许在同一停滞路径上产生重复原生工作。

此前,每个调用方注册了一个捕获其信号的 finally 回调。修复将每个调用方的原始 Promise 反应保持在原始位置,但该反应现在引用一个小型持有者。中止或结算会移除中止监听器并清空持有者。独立的等待器工厂防止第一个信号共享映射的清理闭包。冗余的每次调用拒绝观察者被移除;现有的映射级 then(forget, forget) 仍会在所有调用方离开后处理原生失败。

唯一的生产导入方是 pty-subprocess/spawn-preflight.ts:127–136,通过 local-pty-utils.ts。daemon-terminal-admission.ts 提供准备信号,pty-subprocess.ts 将其转发到预检。普通守护进程请求使用 30 秒客户端超时和 5 秒取消保护。因此,调用方可能在原生文件系统操作仍跨后续请求挂起时结束。这些请求计时器不会限制原始 stat 的持续时间。

无信号调用方仍会收到完全相同的原始 Promise。原生映射删除、UNC 通道所有权、WSL 检查、创建预留、关闭和进程权限均保持不变。该变更保留在执行主机上,并适用于文件夹工作区和 git worktree,无需协议变更。

为什么每个原始反应都保留

已检查现有等待工具。共享结算观察者会改变此 API 的回调顺序:在信号等待器之前注册的原始 Promise 观察者可以在其原始结果到达之前中止它。将每个等待器移到更早的共享观察者之后,反而会兑现该等待器。每次调用的持有者保留了该顺序和同步取消。六个永久回归测试覆盖外部中止观察者在信号等待器之前、之间和之后的情况,并覆盖原生成功和失败。

修复前后证据

独立证明打包了实际验证模块、UNC 路径解析器和信号量。其原生异步 stat 是一个延迟 fixture;如果意外到达,WSL 子进程操作会抛出异常。它不执行实际 cwd 探测、远程文件系统访问、原生子进程启动或应用启动。该 fixture 每个结果包含 32 个小型已取消调用方;未附加大型负载。

原始原生结算前 原始 Node 26.6.0 原始 Electron 43.7.0 / Node 24.21.0 修复后,两者
可到达的信号 32 32 0
可到达的取消错误 0 32 0
可到达的调用方选项对象 0 0 0
原生 stat 调用 1 1 1

两个版本中,所有受测调用方对象都在原生结算后回收。原生成功和失败具有相同生命周期结果。其他对照项在两种运行时上均通过:

  • 后续存活等待器会收到原始操作的成功或可操作错误,并且它们的监听器会被移除。
  • 已中止的第一个调用方仍保留原始操作的所有权;无信号调用方共享同一个原始 Promise。
  • 同一 UNC 主机上的三个已取消调用方会留下两个原生槽位被占用。第三个原生操作只会在一次真实完成后启动。
  • 四十八个实际模块结算/中止调度和六个原始观察者顺序用例与原始一致。
  • 所有调用方取消后的原生拒绝不会产生未处理的拒绝。
  • 合成 CRLF 源码和补丁读取产生相同的反转/修复源码和哈希,且不写入产品。

sources.cjs 在内存中反转 fix.patch,并检查精确的基线和修复后 SHA-256 值。源码哈希使用规范 LF;报告包含有效依赖项和 bundle 哈希。重新运行证明不需要 git 历史、被忽略的笔记或复制的生产实现。每次运行有 20 秒截止时间;以下命令设置 192 MiB 堆限制。

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc --max-old-space-size=192 docs/audits/working-directory-wait-retention/reproduce.cjs

对于 Electron,使用相同标志和脚本路径运行其已安装的可执行文件,并设置 ELECTRON_RUN_AS_NODE=1 和 ORCA_BACKGROUND_LAUNCH=1。它以 Node 模式运行,不创建窗口。

源码兼容性与验证

受审基线模块与 main 提交 291b4ddd6f1c1af480169885e0fda7f9c78ff053 和 release v1.4.198(e0826956fcfc532f5a1e55b5e081f2e57e553c43)逐字节相同。所有九个记录的调用方/依赖项源码也与该 main 提交匹配。这个单产品文件变更不依赖共享等待器辅助函数或其 auth-wait 变更。source-versions.json 记录了精确比较;历史源码相等不是历史打包运行时复现。

修复后的三文件回归运行通过了 31 个测试。仅反转此修复会产生一个预期的第一个调用方保留失败和 30 个通过的对照项,包括六个原始观察者用例:

ORCA_BACKGROUND_LAUNCH=1 pnpm exec vitest run --config docs/audits/working-directory-wait-retention/before.config.mjs src/main/providers/working-directory-validation-retention.test.ts src/main/providers/working-directory-validation.test.ts src/main/daemon/pty-subprocess-cwd-cancel-identity.test.ts

validation.json 记录验证结果。实测保留要求存在一个仍处于待处理状态的原生操作;未声称捕获受影响主机、字节斜率或归因于 #19831。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca