会话写入锁与恢复
定位 writer fence,安全处理残留状态并协调升级回滚。
This page has not been translated into English yet. The original Chinese version is shown below.
更新后的 daemon 可同时使用共享 Conversations 中不同会话,但一个已加载会话仍只有一个写入者。Live 激活还要求精确匹配稳定 Live locator 的发布者;失去 Live 发布身份不等于独立 Conversations 全部不可用。
先识别错误
session_writer_conflict 表示写入防护挡住访问,可能有另一个进程,也可能是无法安全回收的残留锁,不证明写入者现在仍活着。session_writer_unavailable 表示无法验证归属,重试不授权绕过。
归档和删除可能 HTTP 200,但某一会话项含 writer 错误,要逐项检查。先在所属 Qwen 进程正常关闭该会话,再在原会话 Try again;其他会话仍可使用,不要新建替代会话掩盖连续性问题。
自动恢复的边界
正常关闭释放租约;sealed handoff 只有转录证明仍有效时才接受。死进程只能在身份检查确认属于同一存活检测域时回收;活跃或停滞 writer 继续被保护。
Linux 重启、容器换 PID namespace、缺 boot 身份、记录损坏或转录身份不确定都不能靠经过一段时间判死。杀掉 daemon 后其 ACP 子进程可能还活着,需要同时核对;主机重启造成身份变化则是另一种情况,不意味着子进程跨重启存活。
取得精确诊断
启动受影响 daemon 时设 QWEN_DEBUG_LOG_FILE=1,读取 daemon 与 ACP 子进程诊断中的 session ID、错误类别和实际 lockPath。不要按默认 home 或主工作区猜锁位置。
公开 HTTP/ACP 错误刻意不带路径与身份记录;日志、转录与锁备份留在私有位置,不在 issue 中发布 owner token 或完整锁内容。
人工处理残留
- 确认会话和实际存储,备份转录、锁及故障日志,列出可能访问它的主机和二进制。
- 停止或隔离全部可能写入者,包括分离的 ACP、其他 daemon、容器、namespace、共享盘主机与自动重启监督器,并在各自域验证。
- 与维护者检查精确记录及 claim/retired 关联产物,确认最后转录与 handoff 证明,不能改身份字段伪造匹配。
- 确认隔离和备份后,仅把逐项验证的残留产物移到私有恢复位置;不递归删锁目录或批量清锁。
- 先启一个更新后的 daemon,恢复原会话,核对最后一轮后再追加;确认连续性后恢复其他 daemon。
当前没有 force-unlock API,也不按跨 boot 或 TTL 自动接管。无法证明写入者都被隔离时保留防护。
升级与回滚
后端切换与 Web Shell 错误/重试 UI 必须同版本部署,不支持新旧 daemon 滚动混用。升级前排空会话和调度、停止旧 daemon 及 ACP,再保留数据启动新版本。
遇到活跃旧 owner 返回 503 conversation_runtime_in_use;owner 退出后可直接重试。旧 runtime-owner.json 仅有 PID/nonce,没有 hostname、boot ID 或 namespace,因此本机 PID 检查不能证明其他主机上的旧 writer 已退出。
回滚也要先隔离新 writer,盘点 active、sealed、claim、retired 和扩展 schema。旧二进制不理解保留状态时不能删保护记录强行启动,更不能用旧转录覆盖后来已确认的轮次。