已关闭
[RFC]: MetaService加载不匹配MemFabric版本时发生coredump #281
zhangjiale创建于 8月28日关闭于 25 天前
8月28日 关联了pull request:fix: 修复MemFabric版本不一致导致MetaService崩溃
8月28日 关联了pull request:fix: 修复release/1.2中MemFabric版本不一致导致MetaService崩溃
shilinlee
8月28日 评论:
8月28日 评论:
/label add triaged


shilinlee
8月28日 评论:
8月28日 评论:
Issue 标签使用规范
请根据以下规则为 Issue 打标签,保持分类准确:
| # | 场景 | 标签 |
|---|---|---|
| 1 | 提交者本人提的 Issue | /label add triaged |
| 2 | 属于 v1.0.0/release 里程碑的问题 | high-priority |
| 3 | 提交者本人正在跟进 / 排查中 | triage-review |
| 4 | 系统自动打标(无需手动操作) | triaged |
| 5 | 测试同学提的 Issue | 需确保复现步骤明确、所属仓库准确 |
| 6 | 开发同学提的建设性 Issue | 按类型选择:feature / rfc / performance |
| 7 | 已定位、待合入或待测试 | ok-to-test |
| 8 | 方案未明确、需团队讨论 | help-wanted |
⚠️ 测试or用户提 Issue 前请检查:问题描述是否清晰、仓库是否正确,避免信息不全影响处理效率。


8月28日 添加了label:triaged
Zzhangjiale
8月31日 修改标题为 “[RFC]MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“MetaService加载不匹配MemFabric版本时发生coredump”
8月31日 修改标题为 “[RFC]MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“MetaService加载不匹配MemFabric版本时发生coredump”
8月31日 添加了label:rfc
Zzhangjiale
8月31日 修改标题为 “[RFC]: MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“[RFC]MetaService加载不匹配MemFabric版本时发生coredump”
8月31日 修改标题为 “[RFC]: MetaService加载不匹配MemFabric版本时发生coredump”,原标题为“[RFC]MetaService加载不匹配MemFabric版本时发生coredump”
9月1日 关联了pull request:feat: 提供memcache运行时C ABI
9月1日 关联了pull request:feat: 提供memcache运行时C ABI
9月1日 将 zhangjialee 设为负责人
lujiajun
9月1日 评论:
9月1日 评论:
边界与验收建议
该问题应归类为 MemCache ↔ MemFabric 跨组件 ABI/生命周期契约问题,而不是单独归责某一个仓库。编译期内嵌的 MemFabric C++ 实现与运行期另一版本 libmf_smem.so 发生符号抢占,导致两套全局对象交叉创建/析构,退出时触发 double free。
当前 MemCache #536/#537 与 MemFabric #1210/#1211 采用版本化纯 C ABI、函数表校验和运行时加载的方向是合理的。建议验收至少包括:
- 编译版本与运行版本匹配时,MetaService 正常启动、服务和退出;
- 故意注入旧版/不兼容
libmf_smem.so时必须 fail-fast,输出 ABI 版本/结构长度/缺失函数,不能 core; - develop 与 release/1.2 都验证真实动态库加载路径、
DT_NEEDED和导出符号; - 覆盖重复初始化/退出、异常启动回滚及异步线程仍存活时的卸载;
- 建立 MemCache 编译版本 × MemFabric 运行版本兼容矩阵。
在相关 PR 合入前,运行环境应严格保持 MemCache 编译依赖与实际加载的 MemFabric 版本配套。


25 天前 issue状态由 TODO 改变为 DONE
25 天前 关闭了 issue
问题描述
MemCache 与 MemFabric 小版本切换或三方库版本未对齐时,
mmc_meta_service进程可能同时包含编译期内嵌的 MemFabric 实现和运行环境中的另一版本libmf_smem.so。外部动态库会抢占libmf_memcache.so中默认可见的同名 C++ 符号及全局对象,导致跨版本对象被混合创建、访问和析构,最终出现 coredump。软件配套与复现场景
develop@bad2b60c15c519cb768643166362fa7e6dff3a9elibmf_memcache.so和mmc_meta_service9a832dee6a6ac95a95e6e5aabc117362c1cdd898,版本 1.3.0config_store/acc_links部分实现嵌入 MemCache 产物c5d098ff...,版本 1.2.0LD_PRELOAD优先加载该版本的libmf_smem.sozjl-vllm容器,AArch64复现步骤:
LD_PRELOAD注入 MemFabric 1.2.0 的libmf_smem.so;关键日志:
Core 文件:
coredump 关键堆栈
其他存活线程位于运行期注入的 MemFabric 1.2.0
libmf_smem.so的 AccTcp worker/cleanup 路径,说明进程退出时混用了不同版本的全局状态。完整堆栈记录:
根因
config_store_object和ptracer_object已经嵌入libmf_memcache.so,但mmc_meta_service又重复编译了一份,进程内形成两套 C++ 单例和全局状态;libmf_memcache.so内嵌的config_store/acc_tcp_net_static符号未做本地绑定,运行环境中另一版本libmf_smem.so的同名默认可见符号能够发生 ELF symbol interposition;建议修复
ptracer_object和config_store_object,统一使用libmf_memcache.so中的实现;libmf_memcache.so使用-Wl,-Bsymbolic,将内嵌 MemFabric 私有实现及全局状态绑定到库内部,阻止外部libmf_smem.so抢占;验收标准
libmf_smem.so后仍能启动并正常停止;double free,不产生新 core;libmf_memcache.so不直接依赖libmf_smem.so,且相关私有 C++ 状态不再保留可被抢占的动态重定位。