Pull Request已成功合入, 合并人@zhangjinshi
(感谢 dajiang 的贡献)变更摘要
本次 PR 主要针对 memcache 模块进行多项缺陷修复:包括 rewarm 流程中状态机的完善(新增 ALLOCATED_OK 和 READ_START 状态转换及回滚逻辑)、GetByRank 中读写锁与时序优化(将 READ_START 加锁提取为 AttachReadLocks 方法,与异步 rewarm 任务并行执行)、PendingWait 超时从硬编码改为可配置项、UBSIO 生命周期管理修复(Stop 和 Start 中的回调解绑与资源销毁顺序),以及多处参数校验和错误处理增强。
主要改动
-
Rewarm 流程状态机增强:在
ClassifyAndGroupKeys中为 rewarm 分配的新 blob 增加MMC_ALLOCATED_OK状态更新,失败时回滚READ_FINISH并释放已分配资源;在ApplyRewarm中为已完成 copy 的目标 blob 增加READ_START状态更新,失败时释放目标 blob 并回滚源 blob 的READ_FINISH。 -
GetByRank读写锁与时序重构:将原本在 rewarm 任务完成后才串行执行的READ_START加锁逻辑抽取为独立的AttachReadLocks方法,通过新增的DeferredLockEntry结构体收集需要加锁的条目,使异步 rewarm/pendingWait 任务与主线程加锁操作并行执行,缩小锁持有时隙。 -
PendingWait超时可配置化:新增配置项OCK_MMC_PENDING_WAIT_TIMEOUT_MS(默认 300ms,范围 1-60000),通过MmcMetaExtConfig::pendingWaitTimeoutMs→mmc_meta_service_config_t::pendingWaitTimeoutMs链路传递,替换PendingWaitAndFill中原先硬编码的kPendingWaitTimeout。 -
UBSIO 生命周期管理修复:在
MmcLocalServiceDefault::Stop()中调整销毁顺序——先解绑回调、排空事件队列,再销毁 UBSIO;在Start()中RegisterBm失败时增加 UBSIO 清理;在InitUbsIo中InitUbsIo失败时解绑回调;在DlUbsioApi::CleanupLibrary()中新增UbsioKvCacheExit()调用以正确退出 KV 缓存。 -
参数校验与错误处理增强:
mmcc_batch_get和mmcc_batch_put增加results空指针校验;MmcacheStore::GetBatch增加BatchGetKeyInfo返回值数量校验、分配失败及批量获取失败时的内存清理;MmcMemObjMeta::AddBlob将 blob 空指针检查前置并修正日志信息;ResolveAndFillMetaDesc增加selectedBlob为空时的安全返回。


代码审查
审查总结
此 diff 共涉及 13 个文件,核心变更包括:
- 新增
pendingWaitTimeoutMs可配置超时参数(从硬编码 300ms 改为可配置) - 重构
GetByRank的读写锁时序:将READ_START从分类阶段延迟到专门的AttachReadLocks阶段,与异步 rewarm 并行 - 在 rewarm 路径引入
MMC_ALLOCATED_OK状态转换以保护新分配的 blob Stop()生命周期改进:将started_ = false提前、回调解绑/事件排空/UBSIO 销毁的顺序调整mmcache_store::GetBatch错误处理增强:检测 batch get 整体失败和逐 key 失败- UBSIO 清理流程新增
UbsioKvCacheExit调用 mmcc_batch_get/mmcc_batch_put新增results空指针校验
发现汇总:
| 优先级 | 数量 | 说明 |
|---|---|---|
| P2 | 1 | FillFrom 中 ++numBlobs_ 应为 numBlobs_ = 1,语义与 blobs_.clear() 不一致 |
| P3 | 2 | PendingWaitAndFill 中不必要的 static;UbsioKvCacheExit 使用强制加载可能导致旧版库加载失败 |
总体风险评估:低风险。 核心逻辑变更(rewarm 时序重构、状态机引入 ALLOCATED_OK)经过审查未发现正确性问题。三个发现均为边缘场景或代码质量改进项,不影响当前功能正确性。
逐文件审查确认:
src/memcache/csrc/config/mmc_config_const.h— 无问题src/memcache/csrc/config/mmc_configuration.h— 无问题src/memcache/csrc/entities/mmc_mem_obj_meta.cpp— 无问题src/memcache/csrc/local_service/mmc_local_service_default.cpp— 无问题src/memcache/csrc/meta_service/mmc_meta_manager.cpp— 1 个 P3 发现src/memcache/csrc/meta_service/mmc_meta_manager.h— 1 个 P2 发现src/memcache/csrc/meta_service/mmc_meta_service.cpp— 无问题src/memcache/csrc/mmc.cpp— 无问题src/memcache/csrc/mmc_client.cpp— 无问题src/memcache/csrc/mmcache_store.cpp— 无问题src/memcache/csrc/under_api/ubs_io/dl_ubsio_api.cpp— 1 个 P3 发现src/memcache/csrc/under_api/ubs_io/dl_ubsio_api.h— 无问题src/memcache/include/mmc_def.h— 无问题
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 2 |
💬 仅评论


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_memcache | ✅ | >>> |
| 恶意代码检查 | Antipoison_memcache | ✅ | >>> |
| 编码安全与规范检查 | pre-commit | ✅ | >>> |
| CodeCheck_memcache | ✅ | >>> | |
| 开源片段检查 | SCA_memcache | ✅ | >>> |
| 开发者测试 | UT_memcache | ✅ | >>> |
| 流水线 | PR-pipeline_memcache | ✅ | >>> |
- compile : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


合入来源
问题/功能描述
修改方案描述
是否涉及UT/ST
开发自检