Prhub

#48545 [Test][kv_offload] Fix flaky drain() helper in test_fs_tier.py

原始 PR 作者 chaojun-zhang 合并时间 2026-07-15 19:53 文件变更 1 提交数 1 评论 1 代码增减 +4 / -18

执行摘要

修复 test_fs_tier.py 中 drain() 竞态条件

drain() 使用轮询循环,最多等待 200ms(20 轮 × 10ms)。在高负载系统上,存储任务可能在该窗口后才完成,导致测试断言 assert 0 == 1 失败。PR 描述指出这正是 test_load_job_emits_no_eventtest_partially_failed_store_emits_no_event 的 flaky root cause。

值得合并,修复了明确竞态条件。但建议确认 tier.drain_jobs() 是否有内部超时机制,若没有可考虑添加测试级超时以防范 hang。

讨论亮点

评论者 yma11 提出疑虑:“新代码会导致可能的 hang 而不是预期失败?” 这暗示如果 drain_jobs() 永远不完,测试会挂起。但未见到深入讨论,PR 被 orozery 批准。实际风险较低,因为测试本身有全局超时机制。

实现拆解

  1. 定位问题:原 drain() 函数(在 tests/v1/kv_offload/tiering/test_fs_tier.py 第 94-111 行)每隔 10ms 调用 tier.get_finished_jobs(),连续 20 次无新结果则提前退出,存在竞态条件。
  2. 重构方案:删除约 18 行轮询逻辑,改为直接调用 tier.drain_jobs()(该函数内部调用 wait_idle() 阻塞直到所有异步任务完成),然后一次性调用 tier.get_finished_jobs() 收集结果。
  3. 配套清理:移除不再需要的 time.sleep 导入(如果之前是显式导入)和 max_rounds 参数,函数签名简化为 def drain(tier: FileSystemTierManager) -> list
  4. 无其他文件改动:变更仅此一个测试文件,不涉及生产代码。
文件 模块 状态 重要度
tests/v1/kv_offload/tiering/test_fs_tier.py 测试 modified 5.54

关键符号

drain

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

新代码可能导致 hang 而非预期失败 正确性

yma11 指出:新逻辑依赖 drain_jobs() 阻塞等待,若任务永远不完成则测试挂起,而非像原来那样超时后断言失败。

结论:未被正式讨论,但 PR 仍被批准合并。由于测试全局超时机制存在,hang 风险可控。 · 未完全解决

风险与影响

主要风险是如果 tier.drain_jobs() 在某些异常情况下未超时返回,测试会挂起。但原轮询逻辑本身超时会提前退出,两种方式各有优劣。当前变更依赖 drain_jobs() 的实现正确性。不过由于是测试辅助函数,影响局限在测试范围内,且测试套件通常有全局超时保护,风险可控。

影响范围小,仅涉及两个测试用例(test_load_job_emits_no_eventtest_partially_failed_store_emits_no_event)的 flaky 问题。修复后应大幅降低 CI 中因竞态条件导致的随机失败。

缺少超时保护

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论