Repository navigation
DSH Bug 反馈:会话日志迁移在 exFAT 等"无硬链接"文件系统上失败(ENOTSUP);且迁移会就地改写数据文件导致无法回滚 #6358
Replies: 1 comment
|
感谢这份报告 —— 三条现象描述我都能在源码里逐行对上。但对照源码后,你贴的四条建议里有两条与仓库自身的既有契约/同文件另一处实现相冲突,另有一条机制归因需要修正。逐条给证据。 ① 你的
|
|
感谢这份报告 —— 三条现象描述我都能在源码里逐行对上。但对照源码后,你贴的四条建议里有两条与仓库自身的既有契约/同文件另一处实现相冲突,另有一条机制归因需要修正。逐条给证据。 ① 你的
|
Uh oh!
There was an error while loading. Please reload this page.
Summary
把
DSH_HOME放在 exFAT 移动硬盘上(便携盘 / 多设备共用数据的常见做法)后,升级到 0.1.5-rc.1:ENOTSUP: operation not supported on socket;.credentials.yaml),由于写文件是"临时文件 + 改名",会把
DSH_HOME里的符号链接替换成真实文件;于是回滚到 0.1.0-rc.6 后 dsh 直接无法启动。同机、同数据、同一份会话日志下,
0.1.0-rc.6一切正常 —— 说明是 0.1.5 新增的迁移逻辑引入的回归。影响:数据目录放在此类文件系统上的用户,既升不上去、也退不回来。
Reproduction
DSH_HOME放在 exFAT 卷上(例如移动 SSD;FAT32、多数网络盘与 FUSE 挂载同样无硬链接);Current behavior
① 会话迁移失败:
补充观察:临时文件
.migration.*.tmp已成功写出,失败发生在发布(publish)这一步;失败后盘上没有残留脏文件,原有会话文件完好(逐帧 zstd 校验通过)。
② 回滚后无法启动(迁移不可逆):
原因:
0.1.0-rc.6的parseCredentialsDocument()要求该文件是扁平的「名字 → 非空字符串」映射,遇到迁移写出的
version(非字符串)/嵌套结构会直接抛TypeError并中止整个插件树加载。而 0.1.5 的迁移已经把这个文件改写成新格式,回滚 runtime 并不会还原数据文件 —— 用户被卡死。
Expected behavior
rename 在 exFAT 上可用且原子);若确实无法支持,至少给出明确提示
("当前文件系统不支持硬链接,会话日志迁移不可用"),而不是包装成
resume failed。(便携盘方案正是"DSH_HOME = 指向数据目录的链接集合",这一行为会直接破坏该结构)。
Environment
dsh:
0.1.5-rc.1(失败)/0.1.0-rc.6(同机同数据,正常)OS:macOS(Apple Silicon,M 系列)
文件系统:exFAT(移动 SSD;同问题也适用于 FAT32、多数网络盘/NFS/SMB、FUSE 挂载)
代码定位:
@deepseek-ai/dsh-session-persistence-jsonl/lib/index.js→publishCurrentExclusive()版本对照:
dsh-session-persistence-jsonl@0.1.0-rc.6中不存在.migration./publishCurrentExclusive/fs.link(;0.1.5-rc.1三者俱全。凭据侧的解析要求见dsh-credentials-local/lib/index.js的parseCredentialsDocument()。建议修法:
ENOTSUP/EPERM/EACCES/EXDEV时回退为同目录 rename 发布(必要时先做目标存在性检查)。
<file>.bak-v<旧版本>;或保持旧格式可读,避免"升了就不能退"。All reactions