跳转至

释放已中止的共享认证文件系统等待

当文件系统操作仍处于待定状态时,后续的 Codex/Kimi 配额轮询会复用它,并以新的截止时间等待。旧的等待器对每次轮询都使用 Promise.race。在已安装的 Electron 运行时中,尽管已移除其中止监听器,每个被放弃的 race 仍会保留其拒绝原因,直到原始操作结算。修复使用现有的 PromiseSettlementWaiters 注册表,该注册表附加一个原始结果反应,并移除已过期的等待器。

原始所有权符号、最后一个等待器的取消 finalizer、单一原始操作行为、存活调用方以及对迟到结果的后续读取均被保留。认证选择延迟中止结算,因此已排队的原始结果保留其 Promise.race 优先级;24 个成功/失败/中止调度在前后比较相等。现有注册表消费者保持立即中止行为。中止工厂类型接受 unknown,因此 false、零、字符串和对象保留现有的认证拒绝语义。准入或超时限制没有变化。

复现

ORCA_BACKGROUND_LAUNCH=1 node --expose-gc --max-old-space-size=128 docs/audits/auth-filesystem-wait-retention/reproduce.cjs

对于 Electron,请使用 ELECTRON_RUN_AS_NODE=1 运行已安装的 Electron 可执行文件,并使用相同的参数/环境。这不会启动窗口。该证明通过反转 fix.patch 重建原始源码;source-versions.json 中的预期基线哈希会使源码漂移失败。两个版本都运行实际的生产调度器/等待器代码,仅将原始文件系统操作替换为一个手动结算的 promise。15 秒截止时间会使停滞的证明执行失败。

运行时 / 来源 原始结果待定期间存活的普通已中止 Error 存活的放大载荷对象 原始结果结算后 所有者释放后
Node 26.6.0 / 原始 128 个中的 1 个 128 个中的 1 个 1 0
Node 26.6.0 / 修复后 128 个中的 1 个 128 个中的 1 个 1 0
Electron 43.7.0, Node 24.21.0 / 原始 128 个中的 128 个 128 个中的 128 个 1 0
Electron 43.7.0, Node 24.21.0 / 修复后 128 个中的 1 个 128 个中的 1 个 1 0

唯一剩余的原因属于现有取消控制器的首次中止。丢弃共享操作会将其释放。两个版本都会释放 AbortController 对象和中止监听器。放大分支为每个 Error 附加一个合成的 64 KiB Uint8Array,每个用例最多 8 MiB。普通超时错误要小得多;独立的 plain-Error 分支验证了复现保留并不依赖人为字节。运行时差异已被测量,但未将其归因于某个特定的 V8 变更。

对照检查包括:已中止的首个调用方从未启动原始工作、原始拒绝身份、已中止调用方身份、后续调用方接收迟到且已结算的结果、存活同级在取消后继续存活、任意中止原因,以及已移除的监听器。单元测试回归还检查重复的过期等待不会添加原始结果反应,并且当存活调用方仍需要该操作时,其普通 Error 对象可被回收。

验证:50 个 auth/registry 测试通过,其中包括 18 个新用例;反向补丁配置产生两个预期失败和 48 个通过。六个现有 watcher-consumer 套件另外通过 39 个测试。Node、Web 和 CLI 类型检查、聚焦的普通/类型感知 lint、格式化以及变更代码质量门通过。validation.json 记录测试路径和范围。要对当前测试运行先前实现,请使用 --config docs/audits/auth-filesystem-wait-retention/before.config.mjs 以及那六个 auth/registry 测试路径。

范围与限制

三个生产消费者是 codex-auth-presence.ts、codex-backend-auth.ts 和 kimi-fetcher.ts。每个消费者都有意保留共享操作,直到实际文件系统结算,以避免在 UNC/WSL 读取停滞时堆叠原生请求。本次审计未复现真实文件系统停滞、历史 Electron 二进制行为或受影响主机上的工作负载。

认证源码与 v1.4.198 和被审计的 main 修订版一致;现有注册表也与 main 一致。更早的广泛累加器 PR #10179(由 #10255 回滚)为该模块添加了路径/等待器/准入限制。此变更改为移除被放弃的等待反应,且不引入此类限制。此处未将 #19831 或 #19768 归因于该机制,也未声称存在事故规模的内存增长斜率。

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