Skip to content

Diagnose intermittent message RPC unavailability in functional CI #104

Description

@ULookup

Target Version

3.0-dev;来自 PR #103 提交 f44dce8 的完整 Functional 验证。

Evidence

CI 34745253626 attempt 1 在 2026-09-13 07:47:42–07:47:51 UTC 的消息用例出现十项失败:RecallMessage、Reaction、Pin、Delete、Clear;TestRecallMessage_NotFound 期望 4001,实际为 9002。之前消息读取用例通过;SearchMessages 的现有恒真断言无法证明服务成功。之后多数业务继续通过。本轮 PR 没有修改 Message 生产源码。云端只保留测试输出,没有失败时的服务进程状态、RPC 原始错误或容器日志,因此不能认定进程崩溃或服务发现故障。
同一生产源码的本地虚拟机五轮消息相关定向测试共 55 次,只复现一次 TestGetReactions_Success 的成功断言失败(30.967 秒)。Message/Transmite/Identity RestartCount 均为 0、OOMKilled=false;该本地失败不证明与云端 9002 同根因。现有 sendMsg 辅助在发送返回后没有等待持久化,需要区分夹具时序与实际服务不可用。
完整原始输出位于任务审计 issue102/ci-full.log、linux-func.log、message-diagnostic-103.log。同一提交已发起一次失败作业诊断重跑,重跑不视为修复。

新增当前证据:PR #107 / fb2bb88 的 CI 34755517263 于 2026-09-13 12:04:16–12:06:49 UTC 记录九个 Functional/Scenario 失败:同幂等键并发、首次同步、历史读取、撤回、表情读取、大群分发、搜索、非成员鉴权、内容读取。TestFN_SEC_AuthBypass_OtherUser 期望 3002,实际 9002;其他部分断言缺少完整 ResponseHeader。相同提交的本地完整 Functional 191 通过(2 个外部 SMTP 条件跳过)、Scenario 12 通过。完整云端输出保存于 issue99/ci-34755517263.log,不能据错误码或相似用例推定与原始故障同根因。额外本地 etcd 演练的 worker_id 保护退出记录为 #108,亦未与本问题合并。

本轮补充(PR #109 / 2bdd7c6):当前提交云端 CI 34759231921 的 Functional 成功;本地 Functional 191 项通过,另有两个外部 SMTP 条件跳过,Scenario 12 项通过。首次本地回归中的 ESIndexSync、SearchConversations、MessageSearchES 三项失败已取得独立环境证据:Elasticsearch 于 13:25 UTC 记录可用空间 374.3 MB,低于 512 MB flood-stage;清理可重建缓存后,13:26:30 自动解除索引只读,定向三项连续两轮及完整 Functional/Scenario 通过。原始日志保留在本任务 issue108/vm/es-disk-protection.log、functional.log、scenario.log、search-recovery.log、functional-recovered.log、scenario-recovered.log。这个有明确磁盘保护证据的搜索故障不能解释历史消息 RPC 9002,也未补齐本 Issue 的诊断覆盖、夹具等待或根因 RED;本 Issue 保持打开。

本轮补充(2026-09-14,基于 #109 / 2bdd7c6):原有消息定向组在本地虚拟机重复 20 次,278 通过、2 失败,失败为 TestListPinnedMessages_Success 的 Pin 前置调用和 TestRemoveReaction_Success 的 AddReaction 前置调用。Message 文件日志分别记录 4001,且本轮重复期间未取得对应 Gateway RPC 失败日志;这支持夹具提前返回,但不能解释历史云端 9002。RL-MESSAGE-02 在 Message 停止且 Redis guard 已为 accepted 时,实际失败为消息未落库(0 行)及 fixture returned before persistence;仅修改共享文本夹具等待 MySQL 行后同一用例通过。消息与 timelines、conversation watermark 在现有 Message 消费事务中共同提交。HTTP 客户端诊断边界另有先失败后通过的 Go 测试,验证保留业务码/传输分类、每次只发一个请求并排除敏感原文。当前修复分支 fix/104-message-readiness-diagnostics 继承 #89 → #98 → #100 → #103 → #106 → #107 → #109,仍目标 3.0-dev;不包含同级默认构建 PR #110。本轮首次 20 轮修复后定向 280 次通过;最终完整回归及当前提交 CI 尚在验证。详细原始输出在 /home/icepop/issue104-audit,现有验收条件不改变,历史 9002 仍未确定根因。
验证补充(PR #111 / e3acfd6):最终消息重复组 280/280 通过;本地 BVT 18、Functional 191(另 2 个外部 SMTP 条件跳过)、Scenario 12 全部通过。完整 Reliability 7 通过、1 失败:RL-MESSAGE-01 persisted_true 恢复阶段 Transmite 仍返回 9002,随后通过 Gateway 查询原消息成功。后续单独三轮有一轮出现十秒未持久化与下一子用例故障前重复发送失败;再附带只读 Message /health 时间线执行三轮六子用例均通过。后一次通过不视为修复前次失败,尚无该恢复波动或历史云端 9002 的真实根因 RED。所有故障后服务与普通限流配置均已恢复,完整日志保留在 issue104 审计目录。

CI 34772003960 attempt 1 的 BVT 在 Docker Hub 拉取 Redis 镜像时连接被重置,未启动测试;本次新增的 failure.json 采集与 test-diagnostics-bvt 上传真实执行,内容显示业务容器尚未创建、注册不可读取,与失败阶段相符。原始云端日志与产物已下载保存。同提交已对该基础设施失败重跑;attempt 2 的 BVT 和 Functional 均通过。build、service-artifacts、Reliability 与 Agent Policy 也通过;当前适用 CI 全部成功,原失败仍保留。验收条件继续保留,PR #111 保持 Draft / not ready。

Problem or Goal

定位并消除消息接口在 Functional 中的间歇不可用,并使故障证据足以区分服务退出、RPC 连接失败和持久化准备不足。

Scope

首先保留失败时的服务进程/注册状态及经过筛选的 RPC 错误诊断;在纯 Go 测试中记录完整 ResponseHeader 的错误分类,建立可重复的消息调用序列。根据证据修复对应生产缺陷或夹具准备条件,并验证不通过固定延迟掩盖真实不可用。

Non-goals

幂等成功响应缺少 seq_id 的独立缺陷、Redis #102、Identity 历史崩溃 #96 的无证据合并、跳过失败用例、放宽业务成功断言、生产操作。

Acceptance Criteria

  • 失败日志可以判断应用是否重启、etcd 是否仍注册、Gateway 的 RPC 错误分类及业务错误码。
  • 在修复前取得针对真实根因的 Go RED;不把一次不同错误码的本地失败当成云端根因证明。
  • 消息撤回、表情、置顶、删除及清空的成功与非法请求边界重复通过。
  • 发送后需要持久化的夹具等待实际持久化条件,仍保留有界失败;服务不可用不能被重试掩盖。
  • 完整 Functional、Scenario、BVT 和相关 Reliability 通过,保留历史失败及重跑记录。

Test-first Plan

先运行现有消息定向组并采集服务状态,对首个真实错误分类。确定根因后添加最小 Go 行为用例,观察预期 RED 后再改生产;先定向及重复,再同层和跨服务回归。尚无云端进程崩溃的有效 RED。

Risk and Security

仅合成测试栈。诊断排除环境变量、配置文件、令牌与密码;原始 core 如需采集应限制访问,不直接公开。保留消息鉴权与持久化语义。

Architecture Impact

No,当前调查现有服务边界;诊断需要测试框架支持。

Core-flow Impact

Yes,消息 RPC 和持久化准备;具体生产改动由根因证据决定。

Required Skill Updates

.agents/skills/chatnow-testing/references/framework.md;若改变核心流程,同步 .agents/skills/chatnow-orienting/references/core-flows.md。

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