mirror of
https://github.com/Narcooo/inkos.git
synced 2026-08-30 17:22:02 +08:00
0091c3c665
根因:DELETE /sessions/:id 和 POST /sessions/:id/abort 都靠 loadReconciledTaskSnapshot 从磁盘快照拿 execution.id 再查 controller Map。 但任务的 AbortController 注册(同步)与首次快照持久化(在 executeConfirmedProductionAction 内部)之间有多个 await 间隙,窗口内的 删除/中止从磁盘读不到快照,刚启动的任务被漏掉、停不下来。 修法:reservedProductionSessions 从 Set<string> 升级为 Map<string, string> (sessionId → taskId;预留时 confirmedTaskId 已生成,两处都在手)。新增 findRunningTaskController:优先查内存预留表拿 taskId → controller,磁盘 快照只作回退(覆盖进程重启后的对账场景)。DELETE 与 /abort scope=all 统一改走该入口;finally 的释放逻辑不变(Map.delete 同 key)。 测试:让任务开始时预写指令的首次 appendManualSessionMessages 挂起,制造 "controller 已注册、磁盘无快照"的窗口,断言窗口内 /abort 返回 aborted: true、DELETE 能让任务的中止信号生效且请求以错误结束。