在显式终端关闭期间保留已观察到的退出¶
显式关闭可能会收到目标守护进程的物理 EXIT,随后由于另一个已保留的守护进程不可用而导致其聚合验证失败。关闭方法过去会在运行时已经持有 exited 判定的情况下,仍然调用回退 kill。该冗余请求会发出一个合成的 -1,将 operator_close 替换为 unknown/stop_unverified,并发送第二次渲染器退出通知。
该修复会在等待 stop 之前捕获已标记的 PTY 实例。只有当同一实例仍然有效,并且运行时已经具有 exited 判定时,才会接受一个假的 stop 结果。它不会基于空清单或传输失败创建退出证书。
复现¶
在已安装依赖项的检出目录中:
ORCA_BACKGROUND_LAUNCH=1 node docs/audits/terminal-close-observed-exit/reproduce.mjs /tmp/terminal-close-observed-exit.json
ORCA_BACKGROUND_LAUNCH=1 node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/runtime/terminal-close-observed-exit.test.ts
该脚本会在变更前和变更后运行八个场景,对于变更前变体,仅反转新增的捕获和守卫。它使用实际的运行时关闭方法、运行时控制器、守护进程路由器和两个真实的守护进程套接字端点。子进程本身由现有测试框架控制。该脚本使用临时配置文件,检查预期结果,记录源哈希,并删除其临时目录。它不会安装依赖项、启动 UI 或修改检出目录。results.json 会保留记录的结果;重新运行时请使用单独的输出路径。
| 场景 | 变更前 | 变更后 |
|---|---|---|
| 收到目标物理 EXIT;无关守护进程不可用 | 关闭返回 false;一次冗余 kill;原因被覆盖;两次渲染器退出通知 | 关闭返回 true;无冗余 kill;保留 operator_close;一次渲染器退出通知 |
| 健康的聚合清单,延迟的物理 EXIT | 关闭成功 | 无变化 |
| 目标套接字暂停;无关守护进程不可用 | 尽管目标清单为空,关闭仍无法验证 | 无变化 |
| 同一已标记实例已经退出 | 冗余的回退 kill | 接受现有退出 |
| 同一原始 ID 以较新实例注册 | 旧证书被拒绝 | 无变化 |
| 合成负退出,无主机退出证书 | 关闭仍无法验证 | 无变化 |
| 未标记的遗留会话 | 证书未被重用 | 无变化 |
| 退出后 stop 抛出异常 | catch 记录为无法验证 | 无变化 |
在所有套接字场景中,物理提供程序事件和运行时退出监听器只完成一次。修复后的已观察退出场景不会保留无头模型或标题跟踪器。该证明衡量的是生命周期行为,而不是保留的堆字节数。
依赖与事故限制¶
此变更堆叠在 #21000 之上,分支为 np-oom-scan-daemon-late-exit,并复用其真实的守护进程套接字 fixture 和延迟物理退出协调。#21000 修复最终 DATA 在合成退出之后到达的问题。此变更防止在物理退出已被接受之后产生冗余的合成退出。变更前变体是当前检出目录中反转了该窄守卫的版本,而不是原始的历史构建。
无条件回退和退出原因赋值存在于报告的 v1.4.197 源代码中(orca-runtime-stop-explicitly-closed-tab-ptys.ts、orca-runtime-on-pty-exit.ts)。它们解释了一种具体方式:尽管本地退出已确认,仍会得到关闭失败和 stop_unverified。#19018 并未证明某个无关的已保留守护进程不可用;这是一种条件性解释,而不是对报告者确切顺序的证明。
通用清单仍保持失败关闭。跨守护进程世代的精确所有者验证是单独的工作。此变更不会解决抛出的 stop、SSH 失联、未标记身份或所有相同 ID 关闭竞态。缺失的诊断行仍然不足以证明进程已死亡。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca