Skip to content
FunCoding

Search

Search docs, Skills and MCP

会话写入锁与恢复

定位 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 或完整锁内容。

人工处理残留

  1. 确认会话和实际存储,备份转录、锁及故障日志,列出可能访问它的主机和二进制。
  2. 停止或隔离全部可能写入者,包括分离的 ACP、其他 daemon、容器、namespace、共享盘主机与自动重启监督器,并在各自域验证。
  3. 与维护者检查精确记录及 claim/retired 关联产物,确认最后转录与 handoff 证明,不能改身份字段伪造匹配。
  4. 确认隔离和备份后,仅把逐项验证的残留产物移到私有恢复位置;不递归删锁目录或批量清锁。
  5. 先启一个更新后的 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。旧二进制不理解保留状态时不能删保护记录强行启动,更不能用旧转录覆盖后来已确认的轮次。