Pull Request已成功合入, 合并人@曹玉哲
(感谢 王明琦 的贡献)变更摘要
本 PR 为 config_refresh 引入「前置日落闸门」:在强制刷新正式执行(代次 bump)之前,先检查上一轮刷新日落的老代 Pod 是否已回收,若仍存在代次落后的注册 Pod,本次刷新直接以 409(CONFIG_SYNC_BUSY)拒绝并零副作用返回,从而将连续刷新按代次串行化,避免多代日落堆积蹲占 max_pods 焊死滚动窗口(对应 2026-09-11 环境 9 分钟 4 连刷把 2/2 槽位堵满 2.5 分钟的病理)。闸门判据采用**代次(generation)**而非 deploy_ver——refresh 不改配置值,config_sync 的版本判定守卫对 refresh 日落的老代 Pod 失明;回收由 reclaim 代次感知保证收敛,闸门不会永久 409。
主要改动
-
新增日落中间态判定接口:
ResourceOrchestrator.sunset_pending_pods(scope_id)返回代次落后于当前配置代次的注册 Pod(busy 排空中与 idle 待回收一并计入,信息缺失的幽灵不计),按pod_id排序,并经ResourceManagerFacade.sunset_pending_pods暴露给上层。 -
ConfigStore前置闸门与串行化拒绝: 新增SunsetPendingPods回调类型并在构造器注入;_config_refresh_locked在任何 bump 之前逐 scope 检查日落中间态,存在未回收 Pod 时抛ConfigSyncBusy(409),保证 DB/Redis 零副作用(代次不推进),否则才进入原有的 bump → push → 软摘除流程;main.py完成接线。 -
新增 R5 集成测试:
test_force_refresh.pyR5 验证老代 Pod 回收前再刷 409(代次冻结、无 bump)、自然回收后放行推进到 gen 2;test_config_store.py补充零副作用断言(代次未再 bump、候选集保持空、lock_config_sync未遗留)。 -
压测脚本适配 409 背压语义:
load_test.py的refresh_controller将 409/CONFIG_SYNC_BUSY识别为串行化背压(记 warn、代次冻结断言),并同步更新场景说明与--refresh-interval参数帮助,注明流量钉住会话时整个 run 可能仅首轮成功。


欢迎来到 openJiuwen 社区
Hey @wangmingqi , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


| 任务名称 | 结果 | 日志操作 |
|---|---|---|
| 静态检查 | ❌FAILED | 点此跳转 |
| 禁用词扫描 | ✅SUCCESS | 点此跳转 |
| 防投毒检查 | ✅SUCCESS | 点此跳转 |
| 开源合规检查 | ✅SUCCESS | 点此跳转 |
| UT测试 | N/A | N/A |
| ST测试 | N/A | N/A |
| build 编译包 | N/A | N/A |
| ruff codecheck | {{ruff_codecheck_result}} | {{ruff_codecheck_link_text}} |
| issue关联检查 | {{issue_linked_result}} | {{issue_linked_link_text}} |
| pr size检查 | {{pr_size_result}} | {{pr_size_link_text}} |


| 任务名称 | 结果 | 日志操作 |
|---|---|---|
| 静态检查 | ❌FAILED | 点此跳转 |
| 禁用词扫描 | ✅SUCCESS | 点此跳转 |
| 防投毒检查 | ✅SUCCESS | 点此跳转 |
| 开源合规检查 | ✅SUCCESS | 点此跳转 |
| UT测试 | N/A | N/A |
| ST测试 | N/A | N/A |
| build 编译包 | N/A | N/A |
| ruff codecheck | {{ruff_codecheck_result}} | {{ruff_codecheck_link_text}} |
| issue关联检查 | {{issue_linked_result}} | {{issue_linked_link_text}} |
| pr size检查 | {{pr_size_result}} | {{pr_size_link_text}} |


| 任务名称 | 结果 | 日志操作 |
|---|---|---|
| 静态检查 | ❌FAILED | 点此跳转 |
| 禁用词扫描 | ✅SUCCESS | 点此跳转 |
| 防投毒检查 | ✅SUCCESS | 点此跳转 |
| 开源合规检查 | ✅SUCCESS | 点此跳转 |
| UT测试 | N/A | N/A |
| ST测试 | N/A | N/A |
| build 编译包 | N/A | N/A |
| ruff codecheck | {{ruff_codecheck_result}} | {{ruff_codecheck_link_text}} |
| issue关联检查 | {{issue_linked_result}} | {{issue_linked_link_text}} |
| pr size检查 | {{pr_size_result}} | {{pr_size_link_text}} |


ci-pipeline


| 任务名称 | 结果 | 日志操作 |
|---|---|---|
| 静态检查 | ✅SUCCESS | 点此跳转 |
| 禁用词扫描 | ✅SUCCESS | 点此跳转 |
| 防投毒检查 | ✅SUCCESS | 点此跳转 |
| 开源合规检查 | ✅SUCCESS | 点此跳转 |
| UT测试 | N/A | N/A |
| ST测试 | N/A | N/A |
| build 编译包 | N/A | N/A |
| ruff codecheck | {{ruff_codecheck_result}} | {{ruff_codecheck_link_text}} |
| issue关联检查 | {{issue_linked_result}} | {{issue_linked_link_text}} |
| pr size检查 | {{pr_size_result}} | {{pr_size_link_text}} |


Paired: GitHub #183 ↔ GitCode !525
What type of PR is this?
/kind
Self-checklist:(请自检,在[ ]内打上x,我们将检视你的完成情况,否则会导致pr无法合入)