BUG: 同一 DSH_HOME 下多进程并发写同一会话日志,导致 seq 重复、整段历史无法加载 #1452
Replies: 1 comment
|
你的报告和 #1333(今天早些时候的另一位用户 Firefly1007 的「seq 序号重复导致对话加载失败」)是同一个 bug 的两次独立命中——你的证据链比我当时给出的分析更完整,等于把那个假设实锤了。我把两边的分析对一下: 与 #1333 的关联#1333 报的现象是 你的复现(Web 后端 + 桌面壳同开同一会话)和证据(seq 38422–38425 逐字节重复两次)正是"游标滞后的进程在另一进程已提交后又把同批事件追加一遍"的形态——与我推测的机制完全一致。两个独立报告指向同一根因,这个 bug 值得维护者优先处理。 补充几个点
需要的话,我可以把 #1333 + #1452 两帖的源码证据整理成一份完整的 feature request 草稿(含复现步骤、根因、修复方案 A/B),方便维护者直接跟进。 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
环境 Environment
@deepseek-ai/dsh0.1.0-rc.6(dsh-session-persistence-jsonl同一版本)DSH_HOME:C:\Users\.dshsession.jsonl.zstd(zstd 多帧追加式 JSONL)现象 Symptom
加载某个历史会话时整段历史不可用,报错:
复现步骤 Repro
DSH_HOME)并打开/续用同一会话;session.jsonl.zstd追加事件帧;期望 vs 实际 Expected vs Actual
根因分析 Root Cause
dsh-session-persistence-jsonl的追加路径(appendLines)只做了单进程内的防重防护(部分写入后按before大小截断回滚,注释明确:"leaving partial bytes would create duplicate sequence numbers"),没有跨进程文件锁;PersistenceCoordinator的"串行化"是进程内 per-id promise 链与内存 LRU 独占(源码注释:"All per-id operations are serialized"),不覆盖多进程;SessionLogScanner按设计 fail-loud:发现 seq 不连续且后续出现turn/end时直接抛错,整个会话拒绝加载(宁可不可用也不给残缺历史)。证据 Evidence
C:\Users\.dsh\sessions\--C-Users-~5218~7545-source-repos-myCode-agent--\session-9f666163-e5eb-44a5-b8c3-e9aca6904c3a\session.jsonl.zstd.corrupt-20260814-230547seq 38422–38425首次出现于 JSONL 第 2368–2371 行,重复出现于第 2372–2375 行(逐字节一致),之后 seq 从 38426 继续,共 129,772 个事件。turn/end收尾)。建议修复 Suggested Fix
(internal)错误让用户束手无策;DSH_HOME同一时刻只允许一个写者进程。All reactions