Pull Request已成功合入, 合并人@曹玉哲
(感谢 王明琦 的贡献)变更摘要
本 PR(feat(rm),M8)将 deploy 锁输家的处理从「自旋重试、可能自建第 2 个空 Pod」改为「follower 等待室」:锁竞争失败的一方不再自行部署,而是通过原子闸门进入等待室,轮询 leader 的 Pod 注册后直接复用,实现跨副本冷竞争零多余 Pod。核心由新增 Lua 脚本 LUA_DEPLOY_FOLLOWER_GATE 提供原子准入(ZSET + deadline,先清过期成员再 ZADD 先行 + ZCARD 超限自退),ResourceOrchestrator 新增 _follow_leader 等待逻辑(有界等待、leader 失败则 follower 直接失败、overflow 严格快失败),ResourceState 新增 scope_deploy_followers ZSET 键及配套方法,SessionManager 的 pool_config() 向下游透传 pod_concurrency 用于推导等待室上限(pc-1),并配套更新/新增集成与单元测试。
主要改动
-
新增
LUA_DEPLOY_FOLLOWER_GATE原子闸门脚本(lua_scripts.py):以deadline秒级时间戳为 ZSET score,先ZREMRANGEBYSCORE清过期成员(崩溃兜底),再ZADD先行 +ZCARD超限自退,保证并发同时到达也不超收,杜绝「先查后加」的竞态。 -
deploy 输家改为 follower 等待室(
orchestrator.py):抢锁失败后不再asyncio.sleep重试,改为调用_follow_leader——准入上限为pod_concurrency - 1,超限抛MaxPodsReached快失败;轮询到 leader 新 Pod 注册(pod_sse_url可见)即复用返回,等待上界为ready_timeout + FOLLOWER_WAIT_MARGIN;若 leader 锁已释放且无进展则 follower 抛DeployFailed不接管,finally中通过remove_deploy_follower清成员防虚占名额。 -
状态层新增 follower 等待室支持(
state.py):新增scope_deploy_followersZSET 键(request_id → deadline),以及try_add_deploy_follower、remove_deploy_follower(幂等)、deploy_follower_count、pod_ids(follower 检测 leader 注册进展)、lock_held(判断 leader 是否已放弃锁)等方法。 -
下发
pod_concurrency池参数(session_manager/models.py):Template.pool_config()返回值新增pod_concurrency,供 RM 的 follower 等待室推导上限(pc-1),且明确不参与max_pods判定(容量闸门仍在 SM 侧)。 -
测试更新与新增(
test_multi_replica.py、test_rm_state.py):test_deploy_lock_serializes_cross_replica_deploys改为断言恰好 1 次部署且双方落同一 Pod;新增等待室满时 overflow 快失败、leader 部署失败时 follower 直接失败、闸门并发不超收、过期成员清理、成员退出与lock_held/pod_ids等用例。


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


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