[BUG] 两个 dsh web 实例并发打开同一会话,导致会话日志 seq 冲突、历史记录损坏 #4178
Replies: 7 comments 4 replies
|
两个 dsh-session-surgeon 可以 dry-run 看会丢掉多少,再 apply(先 dsh plugin --profile web add "github:xiaoshenming/dsh-session-surgeon#main"修好之后尽量不要再双开写同一 session。 |
|
后续进展总结(均已实测验证) 把这个问题的完整闭环分享给大家: 1. 根因 2. 预防(两道保险,都实测过 ✅)
3. 恢复(两种思路都验证可用)
4. 经验教训
5. 相关官方讨论
|
|
我也遇到过很多次,多个web app和tui开启同一个session,只要进入就会报错,做了一个跨session的host后修复 |
|
I updated an independent recovery runbook with the prevention boundary from this report: https://github.com/sandbaseai/deepseek-harness-handbook/blob/main/docs/en/troubleshooting/duplicate-committed-session-seq.md The key operational distinction is that changing only the port does not isolate persistence. Use a separate DSH_HOME for experiments; treat guard/surgeon plugins as discovery-only until their exact artifacts and effects are audited. |
|
同簇问题(同 #1497:seq 重叠/回退导致 committed 区拒读)。两条不丢历史的解法(官方未打补丁 0.1.1-rc.2 实测:931,455 事件零 seq gap,
已坏在磁盘上就用 2;想让未来崩溃也看不见就上 1。 |
追加:升级到 dsh 0.1.5-rc.1 后,此前修复过的会话再次无法加载(chunk 溯源校验)现象 把 dsh 从 注意最后一句:迁移失败时保留原始 v0 文件不变,所以不会造成进一步损坏——这一点体验很好。 根因 0.1.5 引入了会话格式 v0 → v2 迁移,迁移时会校验 而此前为修复"seq 重复/回退"所做的手工修复(把冲突片段重编号续接)只改了事件的 本例中恰好 4 条消息的溯源数组仍是旧编号(长度都对,只是整体偏移):
前三处来自一次"+1 整体重编号"的修复,第四处来自一次"把冲突片段接到日志尾部(+867)"的修复。 修复方法 对每条
本次只改动了这 4 个数组,其余 12818 行原样保留。 修复后验证:
可复现性 可复现:任何"重编号过 seq 但未同步内部引用"的会话,在 0.1.5+ 上都会触发同一错误。错误信息带具体 seq 与事件类型,便于定位。 对修复工具的启示
附:新版诊断接口变化(供工具作者参考)
|
|
补一句后续:这里"手工重编号后 |
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] 两个 dsh web 实例并发打开同一会话,导致会话日志 seq 冲突、历史记录损坏
描述
当两个
dsh web服务器实例(不同端口,如 3080 / 3081)共用同一个 DSH_HOME(~/.dsh),并在同一时间段内打开同一个会话并各自发送消息时,两个实例会各自基于日志尾部计算下一个 seq(log.at(-1).seq + 1),向同一个session.jsonl.zstd文件追加事件,导致两条事件获得相同/重叠的 seq。随后该会话的历史记录无法加载。复现步骤
npx @deepseek-ai/dsh web(端口 3080)npx @deepseek-ai/dsh web --port 3081(共用同一 ~/.dsh)session.history/ 会话列表加载失败实际报错(两种形态)
session/end-seed与agent/inbox/spliced两个事件同时写入同一个 seq(如 138879),加载器报
event.seq不连续。期望行为
环境
补充
损坏日志可通过重建帧结构(header 单独一帧 + 事件帧)并把冲突片段重编号为后续 seq 来修复,用户侧可恢复,但过程繁琐且需要手动校验,希望能在产品层面避免。
给后来者的提醒(血泪教训 😅)
不要同时在两个端口(两个 dsh web 实例)打开并操作同一个会话——两个实例会各自为下一轮分配 seq 并写入同一份日志,直接造成 seq 重叠/回退,日志损坏。
测试插件或做实验时,请新开一个会话——不要反复"继续"同一个主会话(尤其是上一轮刚结束时紧接着再发消息),避免在轮次边界触发第二个会话实例。更稳妥的做法是用独立的 DSH_HOME 测试,例如
DSH_HOME=C:\Users\你的用户名\.dsh-test npx @deepseek-ai/dsh web。修复方法参考(如果已经坏了)
dry-run看会丢失多少内容,再apply(会自动生成.bak.<utc>备份),裁切到缺口前最后一个完整回合。安装命令:dsh plugin --profile web add "github:xiaoshenming/dsh-session-surgeon#main"。All reactions