Pull Request已成功合入, 合并人@wangyang
(感谢 ganglv 的贡献)变更摘要
该 PR 修复了 CPU/Disk 缓存命中查找未遵循延续边(continuation-edge)语义的问题。原先 CPU/Disk 采用扁平 tokens_hash → workers 映射,按单个块独立匹配,无法识别跨块的连续链。此次重构将 CPU/Disk 索引替换为受 Dynamo 启发的 LowerTierIndexer,以 (parent_hash, tokens_hash) → child_hash 边结构存储块,并在查询时从 HBM 匹配断点(或根节点)沿边连续遍历。同时修正了两阶段 offload/pool 确认协议中 parent_hash 丢失的问题:每个块现在携带自身的 parent_hash,逐块应用 Stored 事件,确保跨批次确认时延续链完整。
主要改动
-
新增
lower_tier模块与LowerTierIndexer: 新增motor/kv_conductor/src/lower_tier.rs,实现基于(parent_hash, local_hash)转移键的延续边索引,支持store_blocks、remove_blocks、clear_worker以及query_contiguous_hits连续命中计数,替代原有的扁平哈希映射方案。 -
重构
IndexerEntry结构: 将cpu_blocks/cpu_lookups、disk_blocks/disk_lookups扁平存储替换为cpu_tiers、disk_tiers(LowerTierIndexer实例),移除flat_store/flat_remove/flat_clear及并行扁平查找逻辑,新增lower_tier_lookup方法实现从 HBM 断点向低层索引的连续遍历。 -
引入
PrefixMatch以传递 HBM 断点信息: 在concurrent_tree.rs中新增PrefixMatch结构体(含depth与可选的last_seq_hash),find_matches_detailed方法在匹配时记录最后一个匹配的序列哈希,供低层索引从断点继续查询。 -
修正 offload/pool 两阶段确认的
parent_hash传递: 将OffloadPoolState::offload的值从简单u64替换为OffloadCacheEntry(含tokens_hash与parent_hash),ingest_offload_blocks和ingest_pool_blocks的返回值均携带parent_hash,调用方(vllm.rs、pool.rs)逐块应用Stored事件而非批量应用,避免parent_hash: None导致的链断裂。 -
vLLM 卸载事件中构建链内
parent_hash:apply_vllm_event在遍历卸载块时,第一个块使用事件的parent_block_hash,后续块依次使用前一个块的哈希,形成正确的链内父子关系后传入ingest_offload_blocks。


代码审查
经过全面深入的分析,我仔细审查了所有 7 个变更文件中的每一个差异块、调用链、并发合约以及边界条件。以下是我的结论:
未发现需要报告的 P0–P2 缺陷。
此 diff 将 CPU/Disk 索引从平坦的 FxHashMap 重构为受 Dynamo 启发的 continuation-edge 索引(LowerTierIndexer),并正确地将 parent_hash 贯穿到两阶段的 offload/pool 确认协议中。关键设计决策——例如将 Ingest_offload_blocks 的三元组 (block_hash, tokens_hash, parent_hash) 以及在确认期间进行逐块 Stored 应用——一致地保留了跨事件拆分传递的 continuation-edge 语义。
以下是我检查的具体内容:
-
concurrent_tree.rs:新的PrefixMatch结构体和find_matches_detailed在包括短路(单 worker)和 reconcile 路径在内的所有循环退出路径中,正确捕获了last_seq_hash(最后匹配节点的block_hash)。current.read()的锁范围正确处理。 -
events/pool.rs和events/vllm.rs:两阶段协议变更是一致的——engine offload 和 pool 确认路径都将parent_hash传递到每个单独的Stored事件,链构建顺序与 delivery 顺序无关。拆分交付的测试(test_pool_confirm_split_across_events_preserves_chain)覆盖了关键场景。 -
lower_tier.rs(新文件):store_blocks、remove_blocks、clear_worker和query_contiguous_hits中的并发模型正确遵循worker_blocks→edges的锁顺序(无死锁风险)。EdgeOwnersEntry中的Single/Multi枚举高效处理共享边。TransitionKey使用(Option<SequenceBlockHash>, LocalBlockHash)正确建模了 continuation-edge 语义。 -
indexer.rs:find_matches_by_hash→lower_tier_lookup流水线通过不重叠的起始位置,正确避免了 HBM 和 lower-tier 命中之间的重复计算。root_workers和edge_owners在lower_tier_lookup中的合并使用insert后跟or_insert_with是正确的(对于同一 worker 同时拥有 root 和 breakpoint continuation 的极罕见情况,root 获胜,但这在实践中不会导致重复计算,因为跨媒体的WorkerKey是不同的)。使用saturating_sub没有整数溢出问题。所有旧的平坦查找符号(FLAT_PAR_THRESHOLD、flat_lookup_parallel、cpu_blocks/cpu_lookups/disk_lookups)均已完全移除,无残留引用。 -
events/tests.rs:test_pool_backend_remove_evicts_cache中更新后的断言正确反映了新模式(移除根边后,孤立子节点从根不可达,得分为 0)。新测试test_pool_confirm_split_across_events_preserves_chain有效验证了拆分交付场景。 -
lib.rs:仅添加了pub mod lower_tier;— 无问题。
各文件审查结果:
motor/kv_conductor/src/concurrent_tree.rs— 无问题motor/kv_conductor/src/events/pool.rs— 无问题motor/kv_conductor/src/events/tests.rs— 无问题motor/kv_conductor/src/events/vllm.rs— 无问题motor/kv_conductor/src/indexer.rs— 无问题motor/kv_conductor/src/lib.rs— 无问题motor/kv_conductor/src/lower_tier.rs— 无问题
总数:P0: 0, P1: 0, P2: 0, P3: 0
整体风险判断:低。 此变更是一个架构良好的重构,用 continuation-edge 索引替换了平坦的 CPU/Disk 映射,与 PR 描述(parent_hash + token_hash 查找)完全一致。逻辑正确,并发安全,测试覆盖充分。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-Ascend/MindIE-Motor | ✅ 王君, 吕有辉 (2/2) | ✅ 王君 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
ganglv, thanks for your pull request. All authors of the commits have signed the CLA. 👍


/lgtm


1. 合入背景
完善 KV Conductor 多级缓存亲和性匹配,支持 HBM、CPU、Disk 间连续前缀查询,提升匹配准确性。
#386 #387
2. 修改内容
3. 资料变更
不涉及
4. 接口变更
5. 测试结果
dsv4_flash

qwen

disk

rename to npu

6. CheckList
[ ] 代码注释完备
[ ] 正确记录维测日志
[ ] 是否有UT用例
[ ] 若涉及多线程场景,考虑了并发场景,不存在死锁问题