DSH-BUG-REPORT-seq-gap-overlap #2627
Unanswered
zjs813-sudo
asked this question in
Q&A
Replies: 3 comments
|
同簇问题(同 #1497:seq 重叠/回退导致 committed 区拒读)。两条不丢历史的解法(官方未打补丁 0.1.1-rc.2 实测:931,455 事件零 seq gap,
已坏在磁盘上就用 2;想让未来崩溃也看不见就上 1。 |
0 replies
安装 / 环境(「DSH-BUG-REPORT-seq-gap-overlap」)这类问题优先排除:源/代理、运行时版本、半残缓存。
补充:系统、 |
0 replies
|
你手工删掉两条合成收尾事件、让真实续写接回去的做法,我做成了工具:https://github.com/po-et/dsh-session-rescue 。和楼上 MedicineKing 的工具路线基本一样(扫描、预览、 |
0 replies
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.
Uh oh!
There was an error while loading. Please reload this page.
[Bug Report] 会话中断恢复后合成收尾事件与续写事件 seq 重叠,导致日志损坏、历史无法加载
环境
@deepseek-ai/dsh0.1.0-rc.6(npm 全局安装,桌面应用内嵌dsh web子进程)session.jsonl.zstd(拼接 zstd 帧:头帧 + 每批事件一帧,packChunks打包分片行)现象
加载某个会话历史时失败,错误信息:
读端校验器(
dsh-session-persistence-jsonl的SessionLogScanner.consumeEventLine,lib/index.js:275-300)要求每个事件的seq从 0 严格连续递增;发现重叠即判定日志损坏并拒绝加载。该会话因此永久无法加载历史(无自动修复路径,只能手动改日志文件)。日志证据:两个"边界事件"是崩溃恢复合成的,不是正常写入
损坏点前后(原始 JSONL 行号):
reasoning-chunks(turn 6 step 1,最后一段分片)step/end(turn 6 step 1)turn/end(turn 6,reason:{kind:"interrupted"})reasoning-chunks(同一 turn 6 step 1,同一段推理文本续写)turn/end(turn 6,reason:{kind:"completed"})三点吻合
@deepseek-ai/dsh-session的interruptedTurnClosers()(lib/types/repair.js:21-125):step/end(若 step 未关闭),再补turn/end { reason: { kind: 'interrupted' } }"(repair.js:120-123);let seq = last.seq + 1(repair.js:79),即 165983。即:turn 6 的流被中断后,durable 日志尾部留下一个未关闭的 turn(最后真实事件 seq 165982);某次恢复/冷加载路径(
dsh-session-persistence的prepareCore→interruptedTurnClosers→commitRepair)检测到未关闭 turn,向文件追加了这两个合成收尾事件(seq 165983/165984)。随后同一 turn 在 37ms 后恢复续写(同一段推理文本无 user/message 隔断,最终 turn 6 completed),但续写事件的 seq 从 165983 重新开始——与文件中已有的两个事件重叠。根因:写端两条路径的 seq 状态不同步
commitPrepared(dsh-session-persistence/lib/index.js:1019-1028)在tornMarker/closers非空时调用backend.commitRepair(...)后直接 return,没有this.states.set/ cursor 推进;commitRepair(dsh-session-persistence-jsonl/lib/index.js:1031-1035)也只做 truncate + appendLines,纯文件操作。appendCore(dsh-session-persistence/lib/index.js:829-835)检查event.seq !== state.cursor + i,但state.cursor是内存值,落后于文件已提交长度(165985),所以续写事件 165983 通过了校验。SessionLogScanner要求 seq 全局连续,重叠即抛错;写端只与内存游标比对,检测不到与文件的重叠。adoptLivePrefix(lib/index.js:1285-1302)的seedCoversPrefix会拒绝"live 种子不覆盖已持久化前缀"的情况——但本次流程中恢复续写未走该防护(很可能是同一进程内 live Session 未释放、写路径直接续写),故未被拦截。影响
建议修复
committedLength + i),而不是只对内存游标做弱校验;或seedCoversPrefix的防护扩展到 seq 对齐),而不是静默写出重叠事件。附件 (Attachments)
见同目录
DSH-BUG-REPORT-attachments/(说明见其中README.md):corrupt-log-session-37374e34-e3c7-4a0e-a67b-5d1e2522d403.jsonl.zstdrepair-seq-gap.jsrepaired-log-session-37374e34.jsonl.zstdreadPrefix验证)备注
session-37374e34-e3c7-4a0e-a67b-5d1e2522d403~/.dsh/sessions/--C-Users-...--/session-37374e34-.../session.jsonl.zstd.corrupt-bakUploading DSH-BUG-REPORT-attachments.zip…
All reactions