跳转至

本地日志尾部监视器比其渲染器存活更久

主进程可以接收日志尾部订阅,等待路径授权,并在请求方渲染器离开后完成原生监视器的安装。此前,销毁监听器仅在授权之后注册。已安装的监视器还会在渲染器崩溃或同一 WebContents 中加载新文档后继续存在。映射保留了每个监视器及其发送方回调;回调会抑制向已销毁发送方发送的通知,但不释放资源。该处理程序存在于 v1.4.198。

修复通过现有 abortWhenRendererGone 策略为每个发送方提供一个所有者:销毁、渲染器进程丢失或已提交的文档导航会关闭其活动监视并使待处理授权失效。同文档导航和已取消的导航保留所有者。对于复用的订阅 ID,最新的待处理请求生效。每个待处理订阅都有一个身份令牌;旧的完成和旧的监视器错误不能替换或关闭较新的订阅。授权失败会保留已安装的现有监视。最后一个待处理/活动释放会移除所有所有者监听器。

这是一个可复现的原生句柄和少量元数据泄漏。监视器不会保留文件内容块。它并未确定 #19768 或 #19831 中的输入频率或内存规模。

复现

在具有现有依赖项的仓库根目录中:

ORCA_BACKGROUND_LAUNCH=1 node docs/audits/local-log-tail-lifetime/reproduce.mjs

该脚本针对临时文件、真实的 fs.watch 句柄、受控的授权 Promise 和 EventEmitter 发送方运行实际的 IPC 处理程序。现有 IPC 测试使用监视器替身来传递来自已退役监视器的错误。不使用 Electron 窗口、真实用户日志、进程清单或网络请求。测试清理会释放所有监视器。

基线仅在临时 Vite 转换中反向应用 fix.patch。工作源代码保持不变;源代码哈希和确切失败用例记录在 results.json 中。子测试运行器使用共享的跨平台进程运行器。

版本 通过 失败
生命周期修复前 9 10
生命周期修复后 19 0

二十所有者用例在修复前保留了二十个原生监视器所有者,修复后为零。更广泛的用例覆盖授权期间的销毁、活动加待处理替换、进程丢失/导航、替换失败、显式停止、空闲监听器处置、被取代的成功/错误以及原生安装失败。普通标签页取消已经会在停止前等待启动;该行为仍由渲染器钩子测试覆盖。

额外验证:Node 类型检查、直接 lint 以及现有的渲染器生命周期和本地日志尾部钩子测试套件。此端点仅监视经渲染器授权的本地日志。SSH/配对运行时执行所有权和传输模式保持不变;本地编辑器资格检查已排除运行时环境文件。文件夹工作区遵循现有的路径授权策略。

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