[Bug] 工具被中断后会话日志写入重复 seq,导致会话损坏无法恢复(resume 报 seq gap) #333
chenzhexii
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[Bug] 工具被中断后会话日志写入重复 seq,导致会话损坏无法恢复(resume 报 seq gap)
现象(观察事实)
dsh恢复(resume)会话时失败,报错原文:(说明:错误信息中的行号 8895 是扫描器的事件行计数,不含 header 行;对应日志文件的物理第 8896 行。)
检查日志文件确认:文件中存在两套 seq 完全相同的事件(见下文"补充信息"),seq 从 147797 回退到 147793,扫描器据此判定日志损坏。
复现步骤
pwsh命令)实际结果
tool/result(消息 id 带interrupted-tool-result-前缀)、step/end、turn/end(reason: interrupted)、session/end-seedtool/result(同一 callId 的真实结果)、step/end、step/start、assistant/chunk预期结果
中断后续写的事件 seq 应与已提交日志前缀严格连续;会话在任何时候都应可被加载,而不是因 seq 重叠整体拒绝恢复。
环境与相关代码
@deepseek-ai/dsh0.1.0-rc.6(npm 全局安装,Windows 10 专业版 22H2 Build 19045,NTFS)dsh-session-persistence-jsonl(zstd 多帧,每帧含整数条完整 JSONL 记录)dsh-session-persistence-jsonl/lib/index.js→SessionLogScanner.consumeEventLine:seq 连续性校验;遇到缺口时记录 issue,若当前行或后续行解码出turn/end事件则抛错dsh-session/lib/index.js→interruptedTurnClosers:为不平衡的 turn 生成合成关闭事件(含interrupted-tool-result-*占位),seq 从last.seq + 1开始递增dsh-session-persistence/lib/index.js→prepareCore/commitPrepared/commitRepair:恢复准备阶段生成占位事件并追加写入持久层验收条件
补充信息
损坏日志中的事件序列(seq 脱敏为相对值 a,与真实日志逐条对应)
已实测的恢复验证(供修复参考)
用 DSH 自身的解码逻辑(
decodeStorageRecord+ seq 校验)及JsonlSessionPersistence.readPrefix实测:删除中断占位块(tool/result(interrupted) →step/end→turn/end(interrupted) →session/end-seed)并保留真实事件块后,seq 自动恢复连续,共 149458 个事件全部通过校验,会话可正常加载,无需重新编号。分析(推断,非实测)
两套事件的 seq 完全一致、且对应同一工具调用的同一位置,推测中断占位事件与真实事件互为"替代"关系,但被同时物理追加进了 append-only 日志。此推断仅基于上述日志证据,供维护者定位参考。
All reactions