Skip to content

Diagnose Transmite exit 139 after etcd worker lease loss #108

Description

@ULookup

Target Version

3.0-dev;本轮证据基于 PR #107 的 fb2bb88,独占本地合成 Compose 栈。

Evidence

2026-09-13 UTC,在九服务编译、BVT、Functional、Scenario 与完整 Reliability 全部通过后,额外暂停 etcd 35 秒再恢复。八个服务注册项取得新租约,初次快照中九个应用进程身份未变,全栈就绪检查通过;该快照没有覆盖后续 watchdog 周期。
12:06:01.648,Transmite 日志报告 worker_id 租约丢失,将 abort 以防雪花 ID 重号;Docker daemon 随后记录 exitCode=139、manualRestart=false、restartCount=1,退出时间 12:06:01.872,12:06:02.129 重新启动,OOMKilled=false。后续 BVT 18 项通过。
完整证据保留于本任务 issue99 审计目录的 registry-stall.log、transmite-stall-app-full.log、transmite-stall-container.log、transmite-restart-daemon.log、final-process-state.log、bvt-after-stall.log。未采集包含运行时敏感数据的 core。现有 watchdog 的预期代码路径为注销后 std::abort();退出码 139 的精确来源尚未确定,不能直接认定是新 Registry 或历史 #96/#104 的根因。

本轮定向 RL-WORKER-01 已在原始 fb2bb88 镜像重复复现:撤销独占栈唯一 worker 租约后,进程退出 139,OOMKilled=false。调试器记录 watchdog → abort → 两次 SIGABRT → libc abort+386 的 hlt 指令触发 SIGSEGV;并非此次注销中的非法访问。进程是容器 PID 1。完整调用栈不含参数、局部变量或 core。
修复方向为明确非零退出(EXIT_FAILURE=1),保持全进程 fencing,并避免在停服前等待服务注销网络操作;旧注册由 30 秒 TTL 或重启后的注册替换收敛。先将同一 Go 用例收敛到明确退出码 1 并再次观察原镜像 RED,再修改生产代码。该调整细化“可判断的受控退出”的既有验收,不扩大主问题。

Problem or Goal

查明 etcd worker 租约丢失后的实际退出路径与退出码,确保服务立即停止不再安全的发号,并提供可判断的受控退出及恢复证据。

Scope

调查 Transmite worker_id watchdog、EtcdWorkIdAllocator、LeaderElection 与注册注销交互;建立延迟观察进程状态的纯 Go 故障用例,补齐退出原因诊断。仅按取得的 RED 修复明确缺陷。

Non-goals

关闭或弱化 worker_id 丢失保护、允许不具备发号权的实例继续发送、完整 HA、推断 #96 或 #104 同根因、生产故障演练。

Acceptance Criteria

  • 用纯 Go 故障用例记录 worker 租约状态、服务进程及退出原因,观察窗口覆盖初次注册恢复后的 watchdog 周期。
  • 明确区分预期保护退出与退出码 139 的实际来源,保留修复前 RED。
  • 不允许丢失 worker_id 所有权后继续分配可能重复的消息 ID;安全语义保持不变。
  • 正常恢复、注销及退出路径有明确证据,精确定向、相关 Reliability、BVT、Functional、Scenario 与受影响编译通过。

Test-first Plan

在独占合成栈复制等价 etcd 故障,使用 Go 测试获取进程/退出事件和经过筛选的日志;在恢复首次成功后继续观察至少一个相关租约/监控周期。必要时只在本地受控调试器中采集调用栈,避免公开含凭据的内存。确定真实根因和失败断言后再修改生产代码。

Risk and Security

仅独占合成环境,故障前登记恢复动作。服务发号 fencing 属于数据正确性边界,禁止为使测试绿而取消安全退出。日志仅保留进程、错误分类和合成实例信息;不公开令牌、密码或原始内存。

Architecture Impact

No,当前仅调查既有服务边界与线程生命周期;具体变更以根因证据为准。

Core-flow Impact

Yes,worker_id 所有权、消息 ID 安全与服务退出。

Required Skill Updates

.agents/skills/chatnow-testing/references/framework.md;若修改行为,同步 .agents/skills/chatnow-orienting/references/core-flows.md 及相关技术引用。

Implementation Evidence

修复实现于 Draft PR #109(2bdd7c6)。明确退出 RED 为 expected 1 / actual 139,GREEN 连续三次 exit=1、非 OOM 且恢复稳定。BVT 18、Functional 191、Scenario 12、Reliability 7 全部通过;当前提交 CI 34759231921 的五项必需作业全部成功。保留首次磁盘 flood-stage 导致的搜索失败及清理缓存后完整回归证据。检测策略未扩大覆盖,不声称证明检测前的严格线性化发号安全。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions