Repository navigation
fix(runtime): ready cache supervisor before cleanup module loading - #7736
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
运行长程任务与发布验证的维护者,需要已完成业务的后台进程安全退出。清理模块只在 worker 中加载缓慢时,旧实现会在开始监督缓存前耗尽启动额度,退回主线程终止并重入原生缓存写盘;当前实现先确认监督就绪,再在取得退休权后加载清理模块。相同受控延迟下,原有真实服务的两项排空用例从真实缓存文件断言失败变为通过,业务日志、定位文件 fence 和原截止时间均保留。本 PR 不增加时间额度,不改变已接纳业务的排空、权限或持久化协议,也不完成整个版本发布。原全套偶发失败的全部调度原因仍未被直接记录;最终并发全套、跨平台与同源发布资格继续由现有发布工作完成。
问题在“监督开始之前”:清理模块不是发送 ready 的前提,却占用了原一秒启动额度。业务操作已经完成也不能保证主线程退出时不再写缓存,因此只检查进程退出、提高超时或删除缓存断言都不足以解决这个反例。
改动思路 / Approach
复用同一 cache-disabled worker 和同一锁/身份清理 owner,只移除 ready 前不必要的模块加载,不增加进程、状态或时间额度。当前 PR 交付清理模块加载不再触发监督启动回退这一独立修复;完整发布资格仍在既有发布任务中。
原服务 close handler 仍先等待已接纳操作完成。主线程仍先预加载清理模块;缓存关闭时直接清理,正常 flush 完成时先持久化缓存。失败或阻塞时,原子状态只允许 worker 取得退休权,再由它加载原清理函数、获取同一锁、核对 token/pid/fingerprint 后清理并终止自己的进程。worker 确实无法启动时仍走原尽力回退;没有增加退出时限保证。
| 输入 | 基线 | 当前 head |
|---|---|---|
| 原有正常、关闭缓存、故障、不可启动、迟归及替换 fence 案例 | 同一测试 fixture 的17个原用例通过 | 同17个通过 |
| worker 清理模块延迟1100ms,flush阻塞或抛错 | 新增两例在真实缓存文件断言失败 | 两例通过,仍用原1000ms额度 |
| 原始真实服务 journal 排空两例,同样加载延迟 | 原断言失败,之前的日志/定位文件/退出检查已通过 | 两例全部通过,原断言和截止时间未改 |
具体改动 / Changes
精确 head 11ebc5ae71c8669994237b65a595bc271d7c4ea8,基线 fc4df266252410d0c327d0eb4deb79e42e00a8ce;完整差异为三文件46新增/8删除,只有一个生产回调改变。
关键代码讲解
superviseCache:59:把清理加载移入延迟执行的回调;message handler 仍先于 ready 安装,CAS 仍先于清理,故不会以发送 ready 代替实际退休权。retireRuntime:75:原正常/关闭缓存/启动失败路径保留,主线程仍在 flush 前加载 helpers,防止正常退出时晚编译重建缓存。locatorRetirement:26:原 mutation lock 与精确身份校验不变;失败 worker 和正常主线程复用它,不能删除替换服务器的 locator。
测试沿用既有 fixture,仅在临时三模块副本为 worker 注入1100ms加载等待,保留真实 Node 缓存/退出/定位文件断言。中英文说明同步披露加载顺序,同时保留排空、额度、fallback及等待范围。
规范依据 docs/development/testing-and-quality.md,spec_revision fc4df266252410d0c327d0eb4deb79e42e00a8ce。Isolate the managed Effect process as well as the data:implemented,排空、正常缓存、关闭缓存监督和精确 fence 均有原用例;Refactor Real-Path Gate / 重构真实路径门:implemented,同一不可变 fixture 对照基线生产三模块与精确 head,再用原始真实服务入口补充受控反例。基线是明确的生产模块快照,不能表述成完整基线仓库全套通过。
语义与 CI 对齐
复用原有局部原子状态、接口和 fence,只有 worker 内加载顺序这一有意差异;没有新增共享 vocabulary、权限或持久化协议。语义 advisory 未发现支持的新增 carrier,该静态结果不代替上述执行对照。遵守当前契约,未获取、轮询或等待 GitHub CI。
对主干的风险 / Risks
最需防止的是缩短 ready 路径后破坏正常缓存、提前放弃业务或删掉替换 locator。相同19案例对照保留全部17项原行为;两项新增反例在基线失败、当前通过。原始 socket/journal 排空两例也使用相同观察器和1100ms worker延迟,只有缓存生产模块按基线/head替换,之前的业务断言未变。任何worker启动都能成功不是本PR的保证;锁/存储等待也没有被纳入一秒额度。
PASS:Node24.21.0与最低22.22.3各19项;精确干净源的真实launcher/runtime/restart三模块137项;TypeScript typecheck、三文件公开扫描0errors/0warnings、语义advisory及diff检查;标准premerge4direct+11selected通过且0holds,cqr_6eb5390f1e93d5cb6e59有效。三模块中另有一个未改的Linux thread-group leader用例在macOS按原guard跳过,不能计入跨平台通过。
历史全套的缓存失败记录只显示主线程kill与未进入故障flush,没有直接记录具体启动失败原因;本次受控反例证明并修复一个具体加载依赖,不倒写原记录为已归因通过。完整最终并发全套、PostgreSQL发布资格和正式安装/渠道仍待。回滚仅需恢复原模块、测试和说明,无数据迁移。
我的整体评价 / Verdict
APPROVE,justified_increment。long_horizon=preserved:已接纳操作先完成、同一身份与锁退休;user_experience=preserved:没有新增用户准备或确认。修改仅涉及后台退休、测试和开发说明,没有渲染入口或整页布局变化,首屏截图不适用。本 PR 未证明原生 Linux/Windows、完整安装升级、外部模型或正式发布渠道。 复用同一 cache-disabled worker 和同一锁/身份清理 owner,只移除 ready 前不必要的模块加载,不增加进程、状态或时间额度。当前 PR 交付清理模块加载不再触发监督启动回退这一独立修复;完整发布资格仍在既有发布任务中。
English verdict: APPROVE this exact bounded runtime fix; delayed cleanup loading no longer forces premature main-thread fallback, and final release qualification remains separate.
Goal And Delivered Outcome
main,实现基线fc4df266252410d0c327d0eb4deb79e42e00a8ce。Author Declaration
Written by: model_agent, gpt-6.1-sol, OpenAI.
Implemented against
Specification:
docs/development/testing-and-quality.md,修订fc4df266252410d0c327d0eb4deb79e42e00a8ce的Isolate the managed Effect process as well as the data:先排空已接纳操作;正常退出保留真实缓存;缓存失败由关闭缓存的 worker 复用定位文件锁与精确身份清理;worker 无法启动时回退仍尽力执行。retireRuntime/superviseCache;19 个 Node 案例、真实 launcher/runtime/restart 三模块Self-check: 阅读既有状态竞争、正常缓存与 unavailable-worker 路径;保持原子退休权、锁、身份和缓存关闭路径。只调整 worker 清理回调的加载时机,不新建状态、provider 或进程。
Scope And Continuation
完整交付本项启动关键路径修复;主线程仍在 flush 前预加载清理模块,避免正常退出时出现晚编译写入。测试复用既有 fixture,仅在临时副本为 worker 注入加载延迟。中英文开发说明同步更新。未改公共 API、持久化格式、默认缓存启用条件或权限。
原全套失败记录显示主线程 kill、未进入故障注入 flush,但没有直接记录启动失败原因。本 PR 用独立受控反例证明并移除一个可触发同类回退的加载依赖,不声称还原原失败的全部调度原因。worker 自身无法及时启动的尽力回退保留。完整并发全套、最终同源发布资格和渠道读回继续由既有发布流程完成。
Validation
11ebc5ae71c8669994237b65a595bc271d7c4ea8;运行状态 finished;输入 synthetic。cqr_6eb5390f1e93d5cb6e59valid覆盖说明:生产差异只有 worker 内的延迟加载回调及解释注释;真实集成覆盖已接纳写入先完成、退出后无迟到缓存、身份 fence 和重启。没有用本 PR 宣称最终全套或跨平台已通过。
Frontend / Visual Evidence
UI impact: none。没有渲染入口、导航或首屏变化;截图、前后视口与 craft review 不适用。CLI 和既有工作台入口不增加输入或确认。
Type of Change
LoopX Area
Technical Direction
现有运行时退休与可选缓存边界;不声称推进 authority provider 迁移或预算性能资格。
Shared-authority RFC fixture impact
N/A:不改存储事务、路由或兼容投影;这里验证真实 File/SQLite 调用后的通用进程退休,完整发布的真实 PostgreSQL 资格保持独立要求。
Boundary Checklist