Repository navigation
[Bug] 会话目录残留一个明文世代文件 → workspaceController 不可用(工作区为空 / 卡在"正在加载工作区" / workspace/create service-unavailable) #11288
thoringtonbritzrhqt7631-netizen
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.
Summary
会话目录里多出一个明文的同版本日志(
session.v4.jsonl,与正常的session.v4.jsonl.zstd内容一致)时,DSH 在启动的会话枚举阶段直接抛错,导致
workspaceRegistry初始化失败、workspaceController不可用:gateway/service-unavailable: typert gateway: workspace/create: active Service "workspaceController" is unavailable;~/.dsh/sessions整体改名后重启 → 立刻恢复正常。失败在进程内被永久缓存,必须完全重启才可能恢复。
Reproduction
在任意会话目录(后端为
zstd)里放入同版本的明文世代,内容合法即可:完全退出 DSH 并重新启动。
观察:工作区列表为空;打开工作区选择器一直 loading;
workspace/create返回service-unavailable。对照:删掉
session.v4.jsonl后重启 → 一切正常。Current behavior
packages/session/session-persistence-jsonl的listArtifacts()第一行就调用ensureRootEncoding(),而它在逐条容错(
SessionPersistenceCorruptionError→ 跳过)之前就抛出全局错误:该异常冒泡到
packages/workspace/workspace的WorkspaceRegistry[Service.init](
static inject = ['storageDomain', 'sessionPersistence'],初始化时await this.listStoredHeaders()),使
workspaceRegistry不激活;workspaceController注入它,于是整个工作区 API 消失。两个放大因素:
ensureRootEncoding()是this.rootEncodingCheck ??= this.checkRootEncoding()—— rejected promise 被缓存,删掉坏文件也不重试,只能重启;
service-unavailable,上面那段带完整路径的原始错误没有任何渠道透出,也没有用户可见的 host 日志目录(
%APPDATA%/~/.dsh下都没有logs/)。Expected behavior
单个 artifact 的编码异常应当跳过并告警(与截断/损坏/未知版本日志的现有处理一致),
其余会话和工作区照常列出;该会话只在被显式打开时才报编码冲突。
Environment
0.2.1-rc.3dsh/dsh-session-persistence-jsonl/dsh-workspace/dsh-api-workspace-controller同为0.2.1-rc.3zstd附:根因代码与建议修复
checkRootEncoding()改为「忽略 +logger.warn」,只在requireStoredLog/rejectOppositeArtifact这类显式打开路径上才报编码冲突;写路径保持严格。
rootEncodingCheck,允许下次重试)。WorkspaceRegistry[Service.init]对会话枚举失败做降级(记日志 + 空索引继续),不要连带整个工作区服务;UI 在「正在加载工作区」处展示可展开的错误详情。
message+ 首个cause带到service-unavailable的 RPC 错误里,并提供用户可见的 host 日志。回归测试:
session.v4.jsonl+session.v4.jsonl.zstd→sessionPersistence.list()不抛错,仅告警;workspace/list正常、workspace/create成功;list()能自愈。All reactions