已合并
[反合][docs]根据doc tools扫描结果优化资料 #418
whytao创建于 7月29日
[反合][docs]根据doc tools扫描结果优化资料 #418
已合并
whytao创建于 7月29日
24 个文件变更+2433-1903
MREADME.md+18-15
@@ -1,5 +1,6 @@
1+<h1 align="center" style="margin: 0;"><img src="docs/source/memcache_icon.png" style="width: 37%" /></h1>
1<div align="center">2<div align="center">
2- <img src=doc/source/memcache_icon.png style="width: 37%" />3+ 
3 <hr style="display:block; border:none; height:0; border-top:2px solid #008000; width:100%; max-width:1250px; margin:20px auto;">4 <hr style="display:block; border:none; height:0; border-top:2px solid #008000; width:100%; max-width:1250px; margin:20px auto;">
4 <h2 align="center">5 <h2 align="center">
5High-performance distributed key-value cache6High-performance distributed key-value cache
@@ -16,6 +17,7 @@ High-performance distributed key-value cache
16<br/>17<br/>
17 18 
18## 🔄Latest News19## 🔄Latest News
20+ 
19- [2026/06] MemCache使能推理PrefixCache加速案例实践,请关注[wiki主页案例库](https://gitcode.com/Ascend/memcache/wiki/Home.md)获取最新案例21- [2026/06] MemCache使能推理PrefixCache加速案例实践,请关注[wiki主页案例库](https://gitcode.com/Ascend/memcache/wiki/Home.md)获取最新案例
20- [2025/12] MemCache已作为vllm-ascend backend使能大模型推理加速,详情查看vllm-ascend开源社区,[使用示例](https://github.com/vllm-project/vllm-ascend/blob/main/docs/source/user_guide/feature_guide/kv_pool.md#example-of-using-memcache-as-a-kv-pool-backend)22- [2025/12] MemCache已作为vllm-ascend backend使能大模型推理加速,详情查看vllm-ascend开源社区,[使用示例](https://github.com/vllm-project/vllm-ascend/blob/main/docs/source/user_guide/feature_guide/kv_pool.md#example-of-using-memcache-as-a-kv-pool-backend)
21 23 
@@ -37,8 +39,9 @@ MemCache是针对LLM推理、GR推理场景设计的高性能分布式KVCache存
37 等路径提供OneCopy跨机跨介质数据直接访问能力,满足高带宽,低时延的读写性能述求。在鲲鹏硬件上,支持host_urma(K5)。支持host_shm实现同节点共享内存通信。39 等路径提供OneCopy跨机跨介质数据直接访问能力,满足高带宽,低时延的读写性能述求。在鲲鹏硬件上,支持host_urma(K5)。支持host_shm实现同节点共享内存通信。
38- **支持扩缩容**:支持LocalService动态加入和移除40- **支持扩缩容**:支持LocalService动态加入和移除
39- **HA能力**:在K8S集群中,MetaService支持多活能力,支持元数据恢复,提供尽力而为的HA能力。41- **HA能力**:在K8S集群中,MetaService支持多活能力,支持元数据恢复,提供尽力而为的HA能力。
42+ 
40<div align="center">43<div align="center">
41- <img src="./doc/source/memcache_architecture.png" alt="architecture">44+ <img src="./docs/source/memcache_architecture.png" alt="architecture">
42</div>45</div>
43 46 
44## 🧩核心组件47## 🧩核心组件
@@ -47,51 +50,51 @@ MemCache包含LocalService和MetaService两大核心组件:
47 50 
48- **MetaService**51- **MetaService**
49 - 负责管理整个集群中内存池空间的分配和管理,处理LocalService的加入与退出。52 - 负责管理整个集群中内存池空间的分配和管理,处理LocalService的加入与退出。
50- - MetaService作为独立进程运行,提供两种启动方式:python API启动;二进制启动,详见 [whl安装使用](./doc/install_whl.md) 和 [run安装使用](./doc/install_run.md)53+ - MetaService作为独立进程运行,提供两种启动方式:python API启动;二进制启动,详见 [whl安装使用](./docs/install_whl.md) 和 [run安装使用](./docs/install_run.md)
51 - MetaService支持两种部署形态:54 - MetaService支持两种部署形态:
52 ***1、单点模式***:MetaService由单个进程组成,部署方式简单,但存在单点故障的问题。如果MetaService进程崩溃或无法访问,系统将无法继续提供服务,直至重新恢复为止。55 ***1、单点模式***:MetaService由单个进程组成,部署方式简单,但存在单点故障的问题。如果MetaService进程崩溃或无法访问,系统将无法继续提供服务,直至重新恢复为止。
53 ***2、HA模式***:该模式基于K8S的的ClusterIP Service和Lease资源构建,部署较为复杂,该模式会部署多个MetaService进程实例,实现多活高可用。部署详见[怎么部署一个MemCache的HA集群](https://gitcode.com/Ascend/memcache/wiki/%E6%80%8E%E4%B9%88%E9%83%A8%E7%BD%B2%E4%B8%80%E4%B8%AAmemcache%E7%9A%84HA%E9%9B%86%E7%BE%A4.md)56 ***2、HA模式***:该模式基于K8S的的ClusterIP Service和Lease资源构建,部署较为复杂,该模式会部署多个MetaService进程实例,实现多活高可用。部署详见[怎么部署一个MemCache的HA集群](https://gitcode.com/Ascend/memcache/wiki/%E6%80%8E%E4%B9%88%E9%83%A8%E7%BD%B2%E4%B8%80%E4%B8%AAmemcache%E7%9A%84HA%E9%9B%86%E7%BE%A4.md)
54 57 
55- 
56- **LocalService**:负责承担如下功能:58- **LocalService**:负责承担如下功能:
57 - **客户端**:作为客户端,以whl/so形式作为共享库被应用进程加载调用API59 - **客户端**:作为客户端,以whl/so形式作为共享库被应用进程加载调用API
58 - **内存提供者**:负责提供一段连续的内存区域作为内存池空间的一部分,其内存可以被其他LocalService实例基于地址直接访问。60 - **内存提供者**:负责提供一段连续的内存区域作为内存池空间的一部分,其内存可以被其他LocalService实例基于地址直接访问。
59 61 
60- 
61## 🔥性能表现62## 🔥性能表现
62 63 
63MemCache核心能力是提供大容量内存池和高性能的H2D、D2H、**D2RH、RH2D**数据访问能力,由于MemCache以 [MemFabric](https://gitcode.com/Ascend/memfabric_hybrid) 作为池化底座,所以支持RH2D、D2RH等OneCopy跨机跨介质数据直接访问能力,下图为RH2D对比其他中转路径的对比示意图。64MemCache核心能力是提供大容量内存池和高性能的H2D、D2H、**D2RH、RH2D**数据访问能力,由于MemCache以 [MemFabric](https://gitcode.com/Ascend/memfabric_hybrid) 作为池化底座,所以支持RH2D、D2RH等OneCopy跨机跨介质数据直接访问能力,下图为RH2D对比其他中转路径的对比示意图。
64<div align="center">65<div align="center">
65- <img src="./doc/source/memcache_rh2d.png" alt="RH2D">66+ <img src="./docs/source/memcache_rh2d.png" alt="RH2D">
66</div>67</div>
67 68 
68基于OneCopy跨机跨介质数据直接访问的能力,MemCache在A2/A3做了相关性能测试如下:69基于OneCopy跨机跨介质数据直接访问的能力,MemCache在A2/A3做了相关性能测试如下:
69模拟构造DeepSeek-R1模型KV大小的block,单个block size为:61x128K + 61x16K = 8784KB ≈ 8.57MB,共122个离散地址。70模拟构造DeepSeek-R1模型KV大小的block,单个block size为:61x128K + 61x16K = 8784KB ≈ 8.57MB,共122个离散地址。
70 71 
71- 使用2个昇腾A2节点(每节点8张卡)组成双机内存池进行读写测试性能如下:72- 使用2个昇腾A2节点(每节点8张卡)组成双机内存池进行读写测试性能如下:
73+ 
72<div align="center">74<div align="center">
73- <img src="./doc/source/memcache_a2.png" alt="A2 perf">75+ <img src="./docs/source/memcache_a2.png" alt="A2 perf">
74</div>76</div>
75 77 
76- 使用2个昇腾A3节点(每节点8张卡16Die)组成双机内存池进行读写测试性能如下:78- 使用2个昇腾A3节点(每节点8张卡16Die)组成双机内存池进行读写测试性能如下:
79+ 
77<div align="center">80<div align="center">
78- <img src="./doc/source/memcache_a3.png" alt="A3 perf">81+ <img src="./docs/source/memcache_a3.png" alt="A3 perf">
79</div>82</div>
80 83 
81## 🚀快速入门84## 🚀快速入门
82 85 
83请访问以下文档获取简易教程。86请访问以下文档获取简易教程。
84 87 
85-- 安装使用:[whl安装和使用](./doc/install_whl.md)(适用于Python用户),[run编译、安装和使用](./doc/install_run.md)(适用于C++用户)88+- 安装使用:[whl安装和使用](./docs/install_whl.md)(适用于Python用户),[run编译、安装和使用](./docs/install_run.md)(适用于C++用户)
86-- [配置文件](doc/memcache_config.md):涉及MetaService、LocalService公共配置89+- [配置文件](docs/memcache_config.md):涉及MetaService、LocalService公共配置
87- [样例执行](./example/examples.md):介绍如何端到端执行样例代码,包括C++和Python样例90- [样例执行](./example/examples.md):介绍如何端到端执行样例代码,包括C++和Python样例
88-- [DevContainer 远端开发](./doc/devcontainer_quickstart.md):VS Code Remote-SSH + DevContainer 一站式开发环境搭建与全量示例运行指南91+- [DevContainer 远端开发](./docs/devcontainer_quickstart.md):VS Code Remote-SSH + DevContainer 一站式开发环境搭建与全量示例运行指南
89 92 
90## 📑学习教程93## 📑学习教程
91 94 
92-- [C++接口](doc/memcache_c++_api.md):C++接口介绍以及C++接口对应的API列表95+- [C++接口](docs/memcache_c++_api.md):C++接口介绍以及C++接口对应的API列表
93-- [Python接口](doc/memcache_python_api.md):Python接口介绍以及Python接口对应的API列表96+- [Python接口](docs/memcache_python_api.md):Python接口介绍以及Python接口对应的API列表
94-- [RESTful接口](doc/memcache_restful_api.md):指标监控接口介绍以及API列表97+- [RESTful接口](docs/memcache_restful_api.md):指标监控接口介绍以及API列表
95 98 
96## 📦软件硬件配套说明99## 📦软件硬件配套说明
97 100 
@@ -103,6 +106,6 @@ MemCache核心能力是提供大容量内存池和高性能的H2D、D2H、**D2RH
103 106 
104## 📝相关信息107## 📝相关信息
105 108 
106-- [安全声明](./doc/SECURITYNOTE.md)109+- [安全声明](./docs/SECURITYNOTE.md)
107 110 
108- [许可证](./LICENSE)111- [许可证](./LICENSE)
Rdoc/SECURITYNOTE.mddocs/SECURITYNOTE.md+17-18
@@ -1,4 +1,6 @@
1-### 通信矩阵1+# 安全提示
2+ 
3+## 通信矩阵
2 4 
3| 原设备 | 源IP地址 | 源端口 | 目的设备 | 目的IP地址 | 目的端口(侦听) | 协议 | 端口说明 | 侦听端口是否可更改 | 认证方式 |5| 原设备 | 源IP地址 | 源端口 | 目的设备 | 目的IP地址 | 目的端口(侦听) | 协议 | 端口说明 | 侦听端口是否可更改 | 认证方式 |
4|-----------------|-----------|-----------------|-----------------|--------------------------|---------------------------------------------------------|---------------|:-------------------------|-----------|------|6|-----------------|-----------|-----------------|-----------------|--------------------------|---------------------------------------------------------|---------------|:-------------------------|-----------|------|
@@ -7,24 +9,23 @@
7| 参与hcom通信的实例 | 客户端通信IP地址 | 随机端口(由操作系统自动分配) | 参与hcom通信的实例 | hcom_url中的\<ip\> | hcom_url中的\<port\> , 默认值7000, 可配范围[1025, 65535] | TCP/RDMA/SDMA | 用于hcom通信 | 是 | TLS |9| 参与hcom通信的实例 | 客户端通信IP地址 | 随机端口(由操作系统自动分配) | 参与hcom通信的实例 | hcom_url中的\<ip\> | hcom_url中的\<port\> , 默认值7000, 可配范围[1025, 65535] | TCP/RDMA/SDMA | 用于hcom通信 | 是 | TLS |
8| 管理/监控客户端 | 客户端通信IP地址 | 随机端口(由操作系统自动分配) | meta service | metrics_url中的\<ip\> | metrics_url中的\<port\> , 默认值8000, 可配范围[1025, 65535] | HTTPS/HTTP | 用于RESTful API管理与监控 | 是 | mTLS(可选,默认关闭)/无认证 |10| 管理/监控客户端 | 客户端通信IP地址 | 随机端口(由操作系统自动分配) | meta service | metrics_url中的\<ip\> | metrics_url中的\<port\> , 默认值8000, 可配范围[1025, 65535] | HTTPS/HTTP | 用于RESTful API管理与监控 | 是 | mTLS(可选,默认关闭)/无认证 |
9 11 
10-说明:12+- 支持通过配置文件配置TLS私钥、证书、口令等,进行TLS安全连接。
11-支持通过配置文件配置TLS私钥、书、口令等进行TLS安全连接13+- 支持对 metrics HTTP 服务独立配置 mTLS(双向认通过 `ock.mmc.metrics.tls.*` 配置项开启
12-支持对 metrics HTTP 服务独立配置 mTLS(双向认证),通过 `ock.mmc.metrics.tls.*` 配置项开启14+- 建议用户开启TLS配置开关并使用加密的方式保存私钥,保证信安全
13-建议用户开TLS配置开关并使用加密的方式保存私,保安全15+- 系统动后建议删除本地秘钥证书等息敏感文件
14-系统启动后,建议删除本地秘钥证书等信息敏感文件16+- 支持通过环境变量 `ACCLINK_CHECK_PERIOD_HOURS`和`ACCLINK_CERT_CHECK_AHEAD_DAYS` 配置证书检查周期与证书过期预警时间
15-支持通过环境变量 `ACCLINK_CHECK_PERIOD_HOURS`和`ACCLINK_CERT_CHECK_AHEAD_DAYS` 配置证书检查周期与证书过期预警时间17+- 多local_service场景不同local_service之间会使用配置文件中的HCOM端口+local_rank作为实际使用的端口
16-多local_service场景不同local_service之间会使用配置文件中的HCOM端口+local_rank作为实际使用的端口。
17 18 
18| 环境变量 | 说明 |19| 环境变量 | 说明 |
19|-------------------------------|-----------------------------------------------------------|20|-------------------------------|-----------------------------------------------------------|
20-| ACCLINK_CHECK_PERIOD_HOURS | 指定证书检查周期(单位:小时),超出范围 [ 24, 24 * 30 ] 或不是整数,则设置默认值7 * 24 |21+| ACCLINK_CHECK_PERIOD_HOURS | 指定证书检查周期(单位:小时),超出范围 [ 24, 24 \* 30 ] 或不是整数,则设置默认值 7 \* 24 |
21| ACCLINK_CERT_CHECK_AHEAD_DAYS | 指定证书预警时间(单位:天),超出范围 [ 7, 180 ] 或不是整数或换算成小时小于检查周期,则设置默认值30 |22| ACCLINK_CERT_CHECK_AHEAD_DAYS | 指定证书预警时间(单位:天),超出范围 [ 7, 180 ] 或不是整数或换算成小时小于检查周期,则设置默认值30 |
22 23 
23-### 运行用户建议24+## 运行用户建议
24 25 
25- 基于安全性考虑,建议您在执行任何命令时,不建议使用root等管理员类型账户执行,遵循权限最小化原则。26- 基于安全性考虑,建议您在执行任何命令时,不建议使用root等管理员类型账户执行,遵循权限最小化原则。
26 27 
27-### 文件权限最大值建议28+## 文件权限最大值建议
28 29 
29- 建议用户在主机(包括宿主机)及容器中设置运行系统umask值为0027及以上,保障新增文件夹默认最高权限为750,新增文件默认最高权限为640。30- 建议用户在主机(包括宿主机)及容器中设置运行系统umask值为0027及以上,保障新增文件夹默认最高权限为750,新增文件默认最高权限为640。
30- 建议对使用当前项目已有和产生的文件、数据、目录,设置如下建议权限。31- 建议对使用当前项目已有和产生的文件、数据、目录,设置如下建议权限。
@@ -49,9 +50,9 @@
49| 密钥组件、私钥、证书、加密密文 | 600(rw-------) |50| 密钥组件、私钥、证书、加密密文 | 600(rw-------) |
50| 加解密接口、加解密脚本 | 500(r-x------) |51| 加解密接口、加解密脚本 | 500(r-x------) |
51 52 
52-### 调用acc_links接口列表53+## 调用acc_links接口列表
53 54 
54-#### TCP服务端模块55+### TCP服务端模块
55 56 
56| 接口功能描述 | 接口声明 |57| 接口功能描述 | 接口声明 |
57|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|58|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -66,13 +67,11 @@
66| 注册密码解密的函数 | `void RegisterDecryptHandler(const AccDecryptHandler &h);` |67| 注册密码解密的函数 | `void RegisterDecryptHandler(const AccDecryptHandler &h);` |
67| 加载安全认证所需动态库 | `int32_t LoadDynamicLib(const std::string &dynLibPath);` |68| 加载安全认证所需动态库 | `int32_t LoadDynamicLib(const std::string &dynLibPath);` |
68 69 
69-### 依赖软件声明70+## 依赖软件声明
70 71 
71-当前项目运行依赖 CANN 和 Ascend72+当前项目运行依赖 CANN 和 Ascend HDK,安装使用及注意事项参考 [CANN](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/81RC1beta1/index/index.html) 和 [Ascend HDK](https://support.huawei.com/enterprise/zh/undefined/ascend-hdk-pid-252764743) 并选择对应版本。
72-HDK,安装使用及注意事项参考[CANN](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/81RC1beta1/index/index.html)
73-和[Ascend HDK](https://support.huawei.com/enterprise/zh/undefined/ascend-hdk-pid-252764743)并选择对应版本。
74 73 
75-### 源码内公网地址74+## 源码内公网地址
76 75 
77| 类型 | 开源代码地址 | 文件名 | 公网IP地址/公网URL地址/域名/邮箱地址 | 用途说明 |76| 类型 | 开源代码地址 | 文件名 | 公网IP地址/公网URL地址/域名/邮箱地址 | 用途说明 |
78|------------|---------------------------------------------|------------------------|---------------------------------------------|-------------|77|------------|---------------------------------------------|------------------------|---------------------------------------------|-------------|
Rdoc/c_cpp_naming.mddocs/c_cpp_naming.md+0-0
文件重命名但无更改。
Rdoc/devcontainer_quickstart.mddocs/devcontainer_quickstart.md+35-27
@@ -2,15 +2,15 @@
2 2 
3## 前置条件3## 前置条件
4 4 
5-- **远端服务器**:昇腾 NPU 服务器,已安装 NPU 驱动5+- **远端服务器**:昇腾 NPU 服务器,已安装 NPU 驱动
6-- **本地机器**:VS Code + Remote—SSH 扩展6+- **本地机器**:VS Code + Remote—SSH 扩展
7-- **网络**:本地能 SSH 到远端服务器,远端能拉 gitcode + Docker 镜像7+- **网络**:本地能 SSH 到远端服务器,远端能拉 gitcode + Docker 镜像
8 8 
9---9---
10 10 
11## 1. 远端克隆项目11## 1. 远端克隆项目
12 12 
13-SSH 登录远端服务器,克隆仓库13+SSH 登录远端服务器,克隆仓库
14 14 
15```bash15```bash
16git clone https://gitcode.com/Ascend/memcache.git16git clone https://gitcode.com/Ascend/memcache.git
@@ -23,7 +23,7 @@ cd memcache
23 23 
24不需要手动在远端启动 VS Code Server,VS Code 会自动处理。24不需要手动在远端启动 VS Code Server,VS Code 会自动处理。
25 25 
26-**方式 A — 命令行快捷连接**(本地终端执行)26+**方式 A — 命令行快捷连接**(本地终端执行)
27 27 
28```bash28```bash
29code --remote ssh-remote+<你的服务器地址> /path/to/memcache29code --remote ssh-remote+<你的服务器地址> /path/to/memcache
@@ -35,40 +35,42 @@ code --remote ssh-remote+<你的服务器地址> /path/to/memcache
35code --remote ssh-remote+192.168.1.100 /home/user/memcache35code --remote ssh-remote+192.168.1.100 /home/user/memcache
36```36```
37 37 
38-**方式 B — VS Code UI**38+**方式 B — VS Code UI**
39 39 
40-1. `F1` → `Remote-SSH: Connect to Host...`40+1. `F1` → `Remote-SSH: Connect to Host...`
41-2. 输入 `ssh user@host` 或从 `~/.ssh/config` 选择41+2. 输入 `ssh user@host` 或从 `~/.ssh/config` 选择
42-3. 输入服务器密码42+3. 输入服务器密码
43-4. 连接后 `File > Open Folder...` → 选择 `memcache` 目录43+4. 连接后 `File > Open Folder...` → 选择 `memcache` 目录
44-5. 输入服务器密码44+5. 输入服务器密码
45 45 
46+> [!NOTE] 说明
46> VS Code 会自动在远端安装 `vscode-server`,首次连接需等待几十秒。47> VS Code 会自动在远端安装 `vscode-server`,首次连接需等待几十秒。
47 48 
48---49---
49 50 
50## 3. 在 Dev Container 中打开51## 3. 在 Dev Container 中打开
51 52 
52-1. 确保远端已安装 Docker(root 或 docker 组权限)53+1. 确保远端已安装 Docker(root 或 docker 组权限)
53-2. VS Code 中 `F1` → `Dev Containers: Reopen in Container`54+2. VS Code 中 `F1` → `Dev Containers: Reopen in Container`
54-3. 输入服务器密码55+3. 输入服务器密码
55-4. 等待镜像拉取 + 容器构建 + postCreateCommand 完成56+4. 等待镜像拉取 + 容器构建 + postCreateCommand 完成
56 57 
57-第一次会拉取 `quay.nju.edu.cn/ascend/vllm-ascend:v0.20.2rc1-a3`(约 15-20 GB),耗时较长。58+> [!NOTE] 说明
59+>
60+> - 第一次会拉取 `quay.nju.edu.cn/ascend/vllm-ascend:v0.20.2rc1-a3`(约 15-20 GB),耗时较长。
61+> - 官方镜像源为 `quay.io/ascend/vllm-ascend:v0.22.1rc1-a3`,配置中使用中国国内镜像加速下载。
62+> A2 环境请改用 `quay.nju.edu.cn/ascend/vllm-ascend:v0.20.2rc1`。
58 63 
59-> 官方镜像源为 quay.io/ascend/vllm-ascend:v0.22.1rc1-a3, 配置中使用中国国内镜像加速下载64+postCreateCommand 会自动执行以下操作(`.devcontainer/post_create.sh`):
60-> A2 环境请改用 `quay.nju.edu.cn/ascend/vllm-ascend:v0.20.2rc1`
61 65 
62-postCreateCommand 会自动做`.devcontainer/post_create.sh`66+- 安装 Python 开发依赖pre-commit、pytest、pybind11 等
63- 67+- 初始化 `3rdparty/` 子模块。
64-- 安装 Python 开发依赖pre-commitpytestpybind11 等68+- 验证工具链版本gcccmakeninja、python
65-- 初始化 `3rdparty/` 子模块69+- CMake 冒烟配置测试。
66-- 验证工具链版本(gcc、cmake、ninja、python)70+- 安装 pre-commit hooks。
67-- CMake 冒烟配置测试
68-- 安装 pre-commit hooks
69- 
70-完成后 VS Code 左下角显示 `Dev Container: MemCache Dev Container`
71 71 
72+> [!NOTE] 说明
73+> 完成后 VS Code 左下角显示 `Dev Container: MemCache Dev Container`。
72> 点击右下角的 `show logs` 会在终端显示构建细节和进度74> 点击右下角的 `show logs` 会在终端显示构建细节和进度
73 75 
74---76---
@@ -84,6 +86,7 @@ bash script/build_and_pack_run.sh --build_mode DEBUG --incremental
84```86```
85 87 
86编译产物:88编译产物:
89+ 
87- **run 包**`output/memcache_hybrid-*.run`90- **run 包**`output/memcache_hybrid-*.run`
88- **whl 包**`output/memcache/wheel/memcache_hybrid-*.whl`91- **whl 包**`output/memcache/wheel/memcache_hybrid-*.whl`
89 92 
@@ -186,9 +189,11 @@ bash example/benchmark/bench_start.sh -t read -p 1 -b 16 -s 1048576 -n 100 -d 1
186## 常见问题189## 常见问题
187 190 
188**Q: 拉镜像太慢 / 超时**191**Q: 拉镜像太慢 / 超时**
192+ 
189`.devcontainer/Dockerfile` 中已将源指向国内 mirror `quay.nju.edu.cn`。如仍需代理,在远端 `/etc/docker/daemon.json` 配置 registry mirror。193`.devcontainer/Dockerfile` 中已将源指向国内 mirror `quay.nju.edu.cn`。如仍需代理,在远端 `/etc/docker/daemon.json` 配置 registry mirror。
190 194 
191**Q: 构建时找不到 `pybind11`**195**Q: 构建时找不到 `pybind11`**
196+ 
192`postCreateCommand` 已安装,如跳过则手动:197`postCreateCommand` 已安装,如跳过则手动:
193 198 
194```bash199```bash
@@ -196,12 +201,15 @@ pip install pybind11
196```201```
197 202 
198**Q: 没有 NPU 能不能跑**203**Q: 没有 NPU 能不能跑**
204+ 
199不能。MemCache 依赖昇腾 NPU 驱动(`davinci``devmm_svm`)。无 NPU 环境下构建会失败。205不能。MemCache 依赖昇腾 NPU 驱动(`davinci``devmm_svm`)。无 NPU 环境下构建会失败。
200 206 
201**Q: 只想用 Python 不用 C++ 例子**207**Q: 只想用 Python 不用 C++ 例子**
208+ 
202```bash209```bash
203bash script/run_all_examples.sh --python210bash script/run_all_examples.sh --python
204```211```
205 212 
206**Q: 需要修改 MetaService 或 LocalService 配置**213**Q: 需要修改 MetaService 或 LocalService 配置**
214+ 
207编辑 `config/mmc-meta.conf``config/mmc-local.conf`,或通过 `--meta-config` / `--local-config` 指定自定义路径。215编辑 `config/mmc-meta.conf``config/mmc-local.conf`,或通过 `--meta-config` / `--local-config` 指定自定义路径。
Rdoc/install_run.mddocs/install_run.md+22-22
@@ -1,13 +1,14 @@
1# run包编译、安装及使用1# run包编译、安装及使用
2-介绍run包的安装及使用方法,适用于需要使用C++接口的用户
3 2 
4-run包没有发布二进制包,需要用户自行编译3+介绍run包的安装及使用方法适用于需要使C++接口的用
4+ 
5+run包没有发布二进制包,需要用户自行编译。
5 6 
6## run包编译7## run包编译
7 8 
8### 环境准备9### 环境准备
9 10 
10-编译工具建议版本11+编译工具建议版本
11 12 
12- OS: Ubuntu 22.04 LTS+13- OS: Ubuntu 22.04 LTS+
13- cmake: 3.20.x14- cmake: 3.20.x
@@ -38,38 +39,37 @@ git submodule update --init 3rdparty/
38git -c submodule.3rdparty/memfabric_hybrid.branch=master submodule update --remote 3rdparty/memfabric_hybrid39git -c submodule.3rdparty/memfabric_hybrid.branch=master submodule update --remote 3rdparty/memfabric_hybrid
39```40```
40 41 
41-**说明:**42+- `--init 3rdparty/` 初始化并更新 `3rdparty/` 下全部子模块(含 memfabric_hybrid、spdlog、nlohmann、msgpack-c、libzmq 等),避免拉取 test 目录等不必要的依赖。
42-- `--init 3rdparty/` 初始化并更新 `3rdparty/` 下全部子模块(含 memfabric_hybrid、spdlog、nlohmann、msgpack-c、libzmq 等),避免拉取 test 目录等不必要依赖43+- 通过 `-c submodule.3rdparty/memfabric_hybrid.branch=<branch_name>` 参数可以指定拉取的目标分支。
43-- 通过 `-c submodule.3rdparty/memfabric_hybrid.branch=<branch_name>` 参数可以指定拉取的目标分支44+- 若需拉取所有子模块(包括测试依赖),可使用 `git submodule update --recursive --init`。
44-- 若需拉取所有子模块(包括测试依赖),可使用 `git submodule update --recursive --init`
45 45 
46**3. 编译**46**3. 编译**
47 47 
48-执行如下命令进行编译48+执行如下命令进行编译
49 49 
50```bash50```bash
51bash script/build_and_pack_run.sh --build_mode RELEASE --build_test OFF51bash script/build_and_pack_run.sh --build_mode RELEASE --build_test OFF
52```52```
53 53 
54-- build_and_pack_run.sh支持2个参数,分别是--build_mode <build_mode>和--build_test <build_test>54+- build_and_pack_run.sh 支持2个参数,分别是`--build_mode <build_mode>``--build_test <build_test>`。
55-- build_mode: 编译类型,可填RELEASE、DEBUG或ASAN,默认RELEASE55+- build_mode: 编译类型,可填RELEASE、DEBUG或ASAN,默认RELEASE
56-- build_test: 是否打包测试工具,可填ON或OFF,默认OFF56+- build_test: 是否打包测试工具,可填ON或OFF,默认OFF
57 57 
58-编译成功后,生成的run包在output目录下,生成的whl包在output/memcache/wheel目录下58+编译成功后,生成的run包在output目录下,生成的whl包在output/memcache/wheel目录下
59 59 
60## run包安装60## run包安装
61 61 
62### 安装MemFabric62### 安装MemFabric
63 63 
64-MemCache依赖MemFabric,需要先安装MemFabric,详细安装方法可参考[MemFabric使用指导](https://gitcode.com/Ascend/memfabric_hybrid/blob/master/doc/installation.md)64+MemCache依赖MemFabric,需要先安装MemFabric,详细安装方法可参考[MemFabric使用指导](https://gitcode.com/Ascend/memfabric_hybrid/blob/develop/docs/installation.md)
atomgit-bot
atomgit-botatomgit-bot7月29日

🟡 Medium Priority

本次 diff 在 docs/install_run.mddocs/install_whl.md 中将 MemFabric 安装文档链接从 https://gitcode.com/Ascend/memfabric_hybrid/blob/master/doc/installation.md 更新为 https://gitcode.com/Ascend/memfabric_hybrid/blob/develop/docs/installation.md(分支从 master 变为 develop,路径从 doc/ 变为 docs/),但 example/cpp/README.md(第18行)和 example/python/README.md(第19行)中的相同链接未被更新,仍然指向 blob/master/doc/installation.md

影响:用户按不同文档操作时会得到不一致的指引。如果 MemFabric 仓库的 master 分支已不再维护或 doc/ 目录已迁移,旧链接可能失效或指向过时内容。

触发条件:用户按 example/cpp/README.mdexample/python/README.md 的指引点击 MemFabric 安装链接。

建议:将 example/cpp/README.mdexample/python/README.md 中相同的 MemFabric 安装链接也更新为 https://gitcode.com/Ascend/memfabric_hybrid/blob/develop/docs/installation.md,保持文档一致性。

likedislike
65 65 
66### 安装MemCache66### 安装MemCache
67 67 
68-MemCache将所有特性集成到run包中供用户使用,run包格式为 ```memcache_hybrid-${version}_${os}_${arch}.run```68+MemCache将所有特性集成到run包中供用户使用,run包格式为 `memcache_hybrid-${version}_${os}_${arch}.run`
69 69 
70-其中,version表示MemCache的版本;os表示操作系统,如linux;arch表示架构,如x86_64或aarch6470+其中,version表示MemCache的版本;os表示操作系统,如linux;arch表示架构,如x86_64或aarch64
71 71 
72-run包的默认安装根路径为 /usr/local/72+run包的默认安装根路径为 /usr/local/
73 73 
74参考安装命令如下:74参考安装命令如下:
75 75 
@@ -78,13 +78,13 @@ cd output
78bash memcache_hybrid-*_linux_aarch64.run # 请修改为实际路径和文件名78bash memcache_hybrid-*_linux_aarch64.run # 请修改为实际路径和文件名
79```79```
80 80 
81-如果想要自定义安装路径,可以添加--install-path参数81+如果想要自定义安装路径,可以添加 `--install-path` 参数
82 82 
83```bash83```bash
84bash memcache_hybrid-*_linux_aarch64.run --install-path=${your path} # 请修改为实际路径和文件名84bash memcache_hybrid-*_linux_aarch64.run --install-path=${your path} # 请修改为实际路径和文件名
85```85```
86 86 
87-安装的run包可以通过如下命令查看版本(此处以默认安装路径为例)87+安装的run包可以通过如下命令查看版本(此处以默认安装路径为例)
88 88 
89```bash89```bash
90cat /usr/local/memcache_hybrid/latest/version.info90cat /usr/local/memcache_hybrid/latest/version.info
@@ -102,15 +102,15 @@ source /usr/local/memfabric_hybrid/set_env.sh
102 102 
103### 启动MetaService103### 启动MetaService
104 104 
105-MetaService作为独立进程运行,可以在设置配置项之后直接拉起105+MetaService作为独立进程运行,可以在设置配置项之后直接拉起
106 106 
107**1. 修改配置文件**107**1. 修改配置文件**
108 108 
109-安装完成后配置文件位于安装目录下的memcache_hybrid/latest/config/mmc-meta.conf109+安装完成后配置文件位于安装目录下的`memcache_hybrid/latest/config/mmc-meta.conf`。
110 110 
111**建议将配置文件复制到其他目录再进行修改,防止重新安装后被覆盖**111**建议将配置文件复制到其他目录再进行修改,防止重新安装后被覆盖**
112 112 
113-运行前需要根据 [MetaService配置项](./memcache_config.md) 对配置文件 mmc-meta.conf 进行相关配置113+运行前需要根据 [MetaService配置项](./memcache_config.md) 对配置文件 mmc-meta.conf 进行相关配置
114 114 
115**2. 设置配置文件路径**115**2. 设置配置文件路径**
116 116 
@@ -158,7 +158,7 @@ export MMC_LOCAL_CONFIG_PATH=/usr/local/memcache_hybrid/latest/config/mmc-local.
158 158 
159## 软件卸载159## 软件卸载
160 160 
161-卸载脚本是位于安装目录下的memcache_hybrid/latest/uninstall.sh,直接执行即可完成卸载161+卸载脚本是位于安装目录下的`memcache_hybrid/latest/uninstall.sh`,直接执行即可完成卸载
162 162 
163```bash163```bash
164# 这里使用的是默认安装路径,请修改为实际路径164# 这里使用的是默认安装路径,请修改为实际路径
Rdoc/install_whl.mddocs/install_whl.md+39-25
@@ -1,10 +1,11 @@
1# whl包安装及使用1# whl包安装及使用
2 2 
3-介绍whl包的安装及使用方法,适用于需要使用Python接口的用户3+介绍whl包的安装及使用方法,适用于需要使用Python接口的用户
4 4 
5## 软件安装5## 软件安装
6 6 
7-whl包已发布到[pypi](https://pypi.org/project/memcache-hybrid/#files),可以直接进行在线安装7+whl包已发布到[pypi](https://pypi.org/project/memcache-hybrid/#files),可以直接在线安装
8+ 
8```bash9```bash
9# 安装最新版本10# 安装最新版本
10pip install memcache_hybrid11pip install memcache_hybrid
@@ -19,39 +20,41 @@ pip show memcache_hybrid
19 20 
20### 安装依赖软件MemFabric21### 安装依赖软件MemFabric
21 22 
22-MemCache运行时需要依赖MemFabric23+MemCache运行时需要依赖MemFabric
23 24 
24```bash25```bash
25# 查看memfabric_hybrid26# 查看memfabric_hybrid
26pip show memfabric_hybrid27pip show memfabric_hybrid
27```28```
28 29 
29-如果安装的MemCache是1.1.x及以上版本,则在安装时会自动安装配套依赖的MemFabric,可以无需再安装30+- 如果安装的MemCache是1.1.x及以上版本,则在安装时会自动安装配套依赖的MemFabric,可以无需再安装
30 31 
31-如果安装的MemCache是1.0.x版本,可通过[版本配套](https://gitcode.com/Ascend/memcache/releases)查看与MemCache匹配的MemFabric版本32+- 如果安装的MemCache是1.0.x版本,可通过[版本配套](https://gitcode.com/Ascend/memcache/releases)查看与MemCache匹配的MemFabric版本
32 33 
33```bash34```bash
34# 此处以1.0.8版本为例35# 此处以1.0.8版本为例
35pip install memfabric_hybrid==1.0.836pip install memfabric_hybrid==1.0.8
36```37```
37 38 
38-MemFabric详细安装方法可参考[MemFabric使用指导](https://gitcode.com/Ascend/memfabric_hybrid/blob/master/doc/installation.md)39+MemFabric详细安装方法可参考[MemFabric使用指导](https://gitcode.com/Ascend/memfabric_hybrid/blob/develop/docs/installation.md)
39 40 
40### 运行软件41### 运行软件
41 42 
42-我们提供了两种方式来启动软件,两种方式的区别在于设置配置项的方式不同43+我们提供了两种方式来启动软件,两种方式的区别在于设置配置项的方式不同
43 44 
44-方式一:通过Python接口直接设置配置项(推荐)45+- 方式一:通过Python接口直接设置配置项(推荐)
45 46 
46-方式二:通过配置文件和环境变量设置配置项(兼容原有方式)47+- 方式二:通过配置文件和环境变量设置配置项(兼容原有方式)
47 48 
48-如果安装的MemCache是1.0.x版本,只能选择方式二,1.1.x及以上版本,您可以根据需要选择其中一种启动方式即可49+> [!NOTE] 说明
50+> 如果安装的MemCache是1.0.x版本,只能选择方式二,1.1.x及以上版本,您可以根据需要选择其中一种启动方式即可。
49 51 
50#### 方式一:通过Python接口直接设置配置项(推荐)52#### 方式一:通过Python接口直接设置配置项(推荐)
51 53 
52**1. 启动MetaService**54**1. 启动MetaService**
53 55 
54-MetaService作为独立进程运行,进入python控制台或者编写python脚本如下即可拉起进程56+MetaService作为独立进程运行,进入Python控制台或者编写如下Python脚本即可拉起进程
57+ 
55```python58```python
56from memcache_hybrid import MetaService, MetaConfig59from memcache_hybrid import MetaService, MetaConfig
57 60 
@@ -68,9 +71,9 @@ MetaService.main()
68 71 
69**2. 启动LocalService**72**2. 启动LocalService**
70 73 
71-LocalService作为客户端,以whl形式作为共享库提供API供应用进程调用加载,以下是通过Python接口设置配置项的一个简单示例74+LocalService作为客户端,以whl形式作为共享库提供API供应用进程调用加载,以下是通过Python接口设置配置项的一个简单示例
72 75 
73-进入python控制台或者编写python脚本如下即可拉起示例进程76+进入Python控制台或者编写如下Python脚本即可拉起示例进程
74 77 
75```python78```python
76from memcache_hybrid import DistributedObjectStore, LocalConfig79from memcache_hybrid import DistributedObjectStore, LocalConfig
@@ -85,21 +88,24 @@ store = DistributedObjectStore()
85assert store.setup(config) == 0, "setup local config failed"88assert store.setup(config) == 0, "setup local config failed"
86```89```
87 90 
88-具体配置项可以参考[配置项说明](./memcache_config.md),配置项的值请根据实际运行环境和场景进行修改91+具体配置项可以参考[配置项说明](./memcache_config.md),配置项的值请根据实际运行环境和场景进行修改
89 92 
90- 👆 NOTE:此种方式设置的配置项优先级高于方式二中通过配置文件设置的值,如果同时使用方式二配置了配置文件,实际运行时使用的是此方法设置的值93+> [!NOTE] 说明
94+> 此种方式设置的配置项优先级高于方式二中通过配置文件设置的值,如果同时使用方式二配置了配置文件,实际运行时使用的是此方法设置的值。
91 95 
92#### 方式二:通过配置文件和环境变量设置配置项(兼容原有方式)96#### 方式二:通过配置文件和环境变量设置配置项(兼容原有方式)
93 97 
94**1. 设置配置文件**98**1. 设置配置文件**
95 99 
96-pip安装完成后可通过以下命令查看具体安装位置100+pip安装完成后可通过以下命令查看具体安装位置
101+ 
97```bash102```bash
98# 查看安装位置和版本103# 查看安装位置和版本
99pip show memcache_hybrid104pip show memcache_hybrid
100```105```
101 106 
102查询结果如下:107查询结果如下:
108+ 
103```text109```text
104Name: memcache_hybrid110Name: memcache_hybrid
105Version: 1.0.0111Version: 1.0.0
@@ -112,22 +118,28 @@ Location: /usr/local/lib/python3.11/site-packages
112Requires:118Requires:
113Required-by:119Required-by:
114```120```
115-这里安装的位置在/usr/local/lib/python3.11/site-packages,则配置文件位于/usr/local/lib/python3.11/site-packages/memcache_hybrid/config
116 121 
117- 👆 NOTE:1.0.x版本安装目录下不带配置文件,需要从[代码仓](https://gitcode.com/Ascend/memcache/tree/v1.0.0/config)获取1.2.X及以上版本 whl 包已默认编译带上 ubsio 盘管理功能,config 目录下包含 mmc-meta.conf、mmc-local.conf 和 ubsio.conf122+这里安装的位置在`/usr/local/lib/python3.11/site-packages`,则配置文件位于`/usr/local/lib/python3.11/site-packages/memcache_hybrid/config`
118 123 
119-软件运行时,配置文件 mmc-meta.conf(用于设置MetaService参数)、mmc-local.conf(用于设置LocalService参数)和 ubsio.conf(UBSIO/SSD 盘管理配置)可以位于任意目录124+> [!NOTE] 说明
125+>
126+> - 1.0.x 版本安装目录下不带配置文件,需要从[代码仓](https://gitcode.com/Ascend/memcache/tree/v1.0.0/config)获取。
127+> - 1.2.X 及以上版本 whl 包已默认编译带上 ubsio 盘管理功能,config 目录下包含 mmc-meta.conf、mmc-local.conf 和 ubsio.conf。
128+ 
129+软件运行时,配置文件 mmc-meta.conf(用于设置MetaService参数)、mmc-local.conf(用于设置LocalService参数)和 ubsio.conf(UBSIO/SSD 盘管理配置)可以位于任意目录。
120 130 
121**建议将这两个配置文件复制到其他目录(比如/usr/local)再进行修改,防止重新安装后被覆盖**131**建议将这两个配置文件复制到其他目录(比如/usr/local)再进行修改,防止重新安装后被覆盖**
122 132 
123-运行前可以根据 [配置项说明](./memcache_config.md) 对配置文件 mmc-meta.conf 和 mmc-local.conf 进行相关配置133+运行前可以根据 [配置项说明](./memcache_config.md) 对配置文件 mmc-meta.conf 和 mmc-local.conf 进行相关配置
124 134 
125**2. 设置环境变量**135**2. 设置环境变量**
126 136 
127-通过环境变量来设置配置文件的路径137+通过环境变量来设置配置文件的路径
138+ 
139+- 两个配置文件可以放在任意路径,这里以默认安装路径为例,请修改为实际路径。
140+- whl 包已默认编译带上 ubsio 盘管理功能,如启用 SSD 需修改配置文件并设置此环境变量,详见 SSD 使用文档。
141+ 
128```bash142```bash
129-# 两个配置文件可以放在任意路径,这里以默认安装路径为例,请修改为实际路径
130-# whl 包已默认编译带上 ubsio 盘管理功能,如启用 SSD 需修改配置文件并设置此环境变量,详见 SSD 使用文档
131export UBSIO_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/ubsio.conf143export UBSIO_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/ubsio.conf
132export MMC_META_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/mmc-meta.conf144export MMC_META_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/mmc-meta.conf
133export MMC_LOCAL_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/mmc-local.conf145export MMC_LOCAL_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hybrid/config/mmc-local.conf
@@ -135,7 +147,8 @@ export MMC_LOCAL_CONFIG_PATH=/usr/local/lib/python3.11/site-packages/memcache_hy
135 147 
136**3. 启动MetaService**148**3. 启动MetaService**
137 149 
138-进入python控制台或者编写python脚本如下即可拉起进程150+进入Python控制台或者编写如下Python脚本即可拉起进程
151+ 
139```python152```python
140from memcache_hybrid import MetaService153from memcache_hybrid import MetaService
141MetaService.main()154MetaService.main()
@@ -143,9 +156,10 @@ MetaService.main()
143 156 
144**4. 启动LocalService**157**4. 启动LocalService**
145 158 
146-通过MemCache提供的[API](./memcache_python_api.md)初始化客户端并拉起LocalService,执行数据写入、查询、获取、删除等159+通过MemCache提供的[API](./memcache_python_api.md)初始化客户端并拉起LocalService,执行数据写入、查询、获取、删除等
147 160 
148下面的脚本[test_mmc_demo.py](../example/python/test_mmc_demo.py)是我们提供的一个示例:161下面的脚本[test_mmc_demo.py](../example/python/test_mmc_demo.py)是我们提供的一个示例:
162+ 
149```bash163```bash
150python3 test_mmc_demo.py164python3 test_mmc_demo.py
151```165```
Rdoc/memcache_c++_api.mddocs/memcache_c++_api.md+401-224
@@ -1,59 +1,81 @@
1# MemCache API1# MemCache API
2 2 
3## C++接口列表3## C++接口列表
4+ 
4C++语言接口功能齐全,基于面向对象设计,提供统一的 `ObjectStore` 抽象基类,封装了实例管理、缓冲区注册、数据操作、批量处理及分层张量等功能。5C++语言接口功能齐全,基于面向对象设计,提供统一的 `ObjectStore` 抽象基类,封装了实例管理、缓冲区注册、数据操作、批量处理及分层张量等功能。
5 6 
6### 1. 实例创建与生命周期管理接口7### 1. 实例创建与生命周期管理接口
7 8 
8#### local_config9#### local_config
10+ 
9`local_config``Setup` 接口使用的本地配置类型,定义位于 `src/memcache/include/mmc.h`11`local_config``Setup` 接口使用的本地配置类型,定义位于 `src/memcache/include/mmc.h`
10 12 
11-**说明**:13+> [!NOTE] 说明
12-- 建议先通过 `create_default_local_config()` 获取带默认值的配置对象,再按需覆盖字段14+> 建议先通过 `create_default_local_config()` 获取带默认值的配置对象,再按需覆盖字段
13 15 
14-**常用字段**:16+**常用字段**
15-- `meta_service_url`: 元服务地址17+ 
16-- `config_store_url`: 配置存储服务地址18+- `meta_service_url`:元服务地址
17-- `log_level`: 日志级别,如 `debug`、`info`、`warn`、`error`19+- `config_store_url`:配置存储服务地址。
18-- `world_size`: 最大 rank 数20+- `log_level`:日志级别,如 `debug`、`info`、`warn`、`error`。
19-- `protocol`: 数据传输协议,如 `host_rdma`、`host_urma`、`host_tcp`、`device_rdma`、`device_urma`、`device_uboe`、`device_sdma`21+- `world_size`:最大 rank 数。
20-- `hcom_url`: HCOM 服务地址22+- `protocol`:数据传输协议,如 `host_rdma`、`host_urma`、`host_tcp`、`device_rdma`、`device_urma`、`device_uboe`、`device_sdma`。
21-- `dram_size` / `hbm_size`: 本地服务 DRAM / HBM 容量23+- `hcom_url`:HCOM 服务地址。
22-- `max_dram_size` / `max_hbm_size`: 所有本地进程可使用的 DRAM / HBM 总上限24+- `dram_size` / `hbm_size`本地服务 DRAM / HBM 容量
25+- `max_dram_size` / `max_hbm_size`:所有本地进程可使用的 DRAM / HBM 总上限。
23 26 
24#### create_default_local_config27#### create_default_local_config
28+ 
25```c++29```c++
26local_config create_default_local_config();30local_config create_default_local_config();
27```31```
28-**功能**: 创建一个带内置默认值的 `local_config` 对象,便于用户只覆盖必要配置项。
29 32 
30-**返回值**:33+**功能**
31-- 返回默认初始化后的 `local_config`34+ 
35+创建一个带内置默认值的 `local_config` 对象,便于用户只覆盖必要配置项。
36+ 
37+**返回值**
38+ 
39+返回默认初始化后的 `local_config`
32 40 
33#### ObjectStore::CreateObjectStore41#### ObjectStore::CreateObjectStore
42+ 
34```c++43```c++
35static std::shared_ptr<ObjectStore> CreateObjectStore();44static std::shared_ptr<ObjectStore> CreateObjectStore();
36```45```
37-**功能**: 创建一个分布式内存缓存存储实例。
38 46 
39-**返回值**:47+**功能**
40-- 返回 std::shared_ptr 管理的智能指针,确保资源自动释放,非空 shared_ptr 表示成功。48+ 
49+创建一个分布式内存缓存存储实例。
50+ 
51+**返回值**
52+ 
53+返回 std::shared_ptr 管理的智能指针,确保资源自动释放,非空 shared_ptr 表示成功。
41 54 
42#### Setup55#### Setup
56+ 
43```c++57```c++
44virtual int Setup(const local_config &config);58virtual int Setup(const local_config &config);
45```59```
46-**功能**: 初始化并校验本地配置,供后续 `Init` 使用。
47-**注**:如果开启device_urma或device_uboe协议,则`max dram * world_size`的池化总大小必须大于32T
48 60 
49-**参数**:61+**功能**
50-- `config`: 本地配置(`local_config`)62+ 
63+初始化并校验本地配置,供后续 `Init` 使用。
64+ 
65+> [!NOTE] 说明
66+> 如果开启device_urma或device_uboe协议,则`max dram * world_size`的池化总大小必须大于32T。
67+ 
68+**参数**
69+ 
70+`config`:本地配置(`local_config`)。
71+ 
72+**返回值**
51 73 
52-**返回值**:
53- `0`:成功74- `0`:成功
54- 其他:失败75- 其他:失败
55 76 
56-**推荐调用顺序**:77+**推荐调用顺序**
78+ 
57```c++79```c++
58auto store = ock::mmc::ObjectStore::CreateObjectStore();80auto store = ock::mmc::ObjectStore::CreateObjectStore();
59local_config config = create_default_local_config();81local_config config = create_default_local_config();
@@ -71,422 +93,577 @@ if (ret != 0) {
71```93```
72 94 
73#### Init95#### Init
96+ 
74```c++97```c++
75virtual int Init(const uint32_t deviceId, bool initBm = true) = 0;98virtual int Init(const uint32_t deviceId, bool initBm = true) = 0;
76```99```
77-**功能**: 初始化当前存储实例,绑定到指定设备。
78 100 
79-**参数**:101+**功能**
80-- `deviceId`: 目标设备ID102+ 
81-- `initBm`: 是否初始化BM提供内存,默认值为 true。 false 时将启动纯client模式,不支持数据读写操作103+初始化当前储实例绑定到指定备。
104+ 
105+**参数**
106+ 
107+- `deviceId`:目标设备ID。
108+- `initBm`:是否初始化BM提供内存,默认值为 true。设 false 时将启动纯client模式,不支持数据读写操作。
109+ 
110+**返回值**
82 111 
83-**返回值**:
84- `0`:成功112- `0`:成功
85- 其他:失败113- 其他:失败
86 114 
87#### TearDown115#### TearDown
116+ 
88```c++117```c++
89virtual int TearDown() = 0;118virtual int TearDown() = 0;
90```119```
91-**功能**: 释放当前实例占用的所有资源,断开与元服务和本地服务的连接。
92 120 
93-**返回值**:121+**功能**
122+ 
123+释放当前实例占用的所有资源,断开与元服务和本地服务的连接。
124+ 
125+**返回值**
126+ 
94- `0`:成功127- `0`:成功
95- 其他:失败128- 其他:失败
96 129 
97### 2. 缓冲区注册接口130### 2. 缓冲区注册接口
98 131 
99#### RegisterBuffer132#### RegisterBuffer
133+ 
100```c++134```c++
101virtual int RegisterBuffer(void *buffer, size_t size) = 0;135virtual int RegisterBuffer(void *buffer, size_t size) = 0;
102```136```
103-**功能**: 将用户分配的内存区域注册到系统中,以启用 RDMA 或零拷贝传输。
104 137 
105-**参数**:138+**功能**
106-- `buffer`: 内存起始地址139+ 
107-- `size`: 缓冲区字节大小140+将用户分配的内存区域注册到系统中,以启用 RDMA 或零拷贝传输。
141+ 
142+**参数**
143+ 
144+- `buffer`:内存起始地址。
145+- `size`:缓冲区字节大小。
146+ 
147+**返回值**
108 148 
109-**返回值**:
110- `0`:成功149- `0`:成功
111- 其他:失败150- 其他:失败
112 151 
113#### UnRegisterBuffer152#### UnRegisterBuffer
153+ 
114```c++154```c++
115virtual int UnRegisterBuffer(void *buffer, size_t size) = 0;155virtual int UnRegisterBuffer(void *buffer, size_t size) = 0;
116```156```
117-**功能**: 注销已注册的内存区域。
118 157 
119-**参数**:158+**功能**
120-- `buffer`: 内存起始地址
121-- `size`: 缓冲区字节大小
122 159 
123-**返回值**:160+注销已注册的内存区域。
124-- `0`: 成功161+ 
125-- 其他: 失败162+**参数**
163+ 
164+- `buffer`:内存起始地址。
165+- `size`:缓冲区字节大小。
166+ 
167+**返回值**
168+ 
169+- `0`:成功
170+- 其他:失败
126 171 
127### 3. 数据操作接口172### 3. 数据操作接口
128 173 
129#### GetInto174#### GetInto
175+ 
130```c++176```c++
131virtual int GetInto(const std::string &key, void *buffer, size_t size, const int32_t direct = 2) = 0;177virtual int GetInto(const std::string &key, void *buffer, size_t size, const int32_t direct = 2) = 0;
132```178```
133-**功能**: 将指定键的数据读入预分配的 buffer 中。
134 179 
135-**参数**:180+**功能**
136-- `key`: 数据键(长度 < 256字节)
137-- `buffer`: 目标内存地址
138-- `size`: 缓冲区容量
139-- `direct`: 数据流向
140 181 
141-**返回值**:182+将指定键的数据读入预分配的 buffer 中。
142-- `0`: 成功183+ 
143-- 其他: 失败184+**参数**
185+ 
186+- `key`:数据键(长度 < 256字节)。
187+- `buffer`:目标内存地址。
188+- `size`:缓冲区容量。
189+- `direct`:数据流向。
190+ 
191+**返回值**
192+ 
193+- `0`:成功
194+- 其他:失败
144 195 
145#### PutFrom196#### PutFrom
197+ 
146```c++198```c++
147virtual int PutFrom(const std::string &key, void *buffer, size_t size, const int32_t direct = 3,199virtual int PutFrom(const std::string &key, void *buffer, size_t size, const int32_t direct = 3,
148 const ReplicateConfig &replicateConfig = {}) = 0;200 const ReplicateConfig &replicateConfig = {}) = 0;
149```201```
150-**功能**: 将 buffer 中的数据写入缓存并关联到 key。
151 202 
152-**参数**:203+**功能**
153-- `key`: 数据键(长度 < 256字节)
154-- `buffer`: 目标内存地址
155-- `size`: 缓冲区容量
156-- `direct`: 数据流向
157-- `replicateConfig`: 副本策略配置
158 204 
159-**返回值**:205+将 buffer 中的数据写入缓存并关联到 key。
160-- `0`: 成功206+ 
161-- 其他: 失败207+**参数**
208+ 
209+- `key`:数据键(长度 < 256字节)。
210+- `buffer`:目标内存地址。
211+- `size`:缓冲区容量。
212+- `direct`:数据流向。
213+- `replicateConfig`:副本策略配置。
214+ 
215+**返回值**
216+ 
217+- `0`:成功
218+- 其他:失败
162 219 
163#### Remove220#### Remove
221+ 
164```c++222```c++
165virtual int Remove(const std::string &key) = 0;223virtual int Remove(const std::string &key) = 0;
166```224```
167-**功能**: 删除指定键的数据对象。
168 225 
169-**参数**:226+**功能**
170-- `key`: 数据键(长度 < 256字节)
171 227 
172-**返回值**:228+删除指定键的数据对象。
173-- `0`: 成功229+ 
174-- 其他: 失败230+**参数**
231+ 
232+`key`:数据键(长度 < 256字节)。
233+ 
234+**返回值**
235+ 
236+- `0`:成功
237+- 其他:失败
175 238 
176#### IsExist239#### IsExist
240+ 
177```c++241```c++
178virtual int IsExist(const std::string &key) = 0;242virtual int IsExist(const std::string &key) = 0;
179```243```
180-**功能**: 检查键是否存在。
181 244 
182-**参数**:245+**功能**
183-- `key`: 数据键(长度 < 256字节)
184 246 
185-**返回值**:247+检查键是否存在。
186-- `1`: 存在248+ 
187-- `0`: 不存在249+**参数**
188-- 其他: 失败250+ 
251+`key`:数据键(长度 < 256字节)。
252+ 
253+**返回值**
254+ 
255+- `1`:存在
256+- `0`:不存在
257+- 其他:失败
189 258 
190#### GetKeyInfo259#### GetKeyInfo
260+ 
191```c++261```c++
192virtual KeyInfo GetKeyInfo(const std::string &key, uint32_t flag = 0) = 0;262virtual KeyInfo GetKeyInfo(const std::string &key, uint32_t flag = 0) = 0;
193```263```
194-**功能**: 获取键的元信息。
195 264 
196-**参数**:265+**功能**
197-- `key`: 数据的键,长度小于256个字节266+ 
198-- `flag`: 查询标志,默认值为 `0`267+获取键的元信息。
268+ 
269+**参数**
270+ 
271+- `key`:数据的键,长度小于256个字节。
272+- `flag`:查询标志,默认值为 `0`
273+ 
274+**返回值**
199 275 
200-**返回值**:
201返回 KeyInfo,包含:276返回 KeyInfo,包含:
202-- `size_`: 数据字节数
203-- `blobNum_`: 数据副本数
204-- `loc_`: 数据副本所在位置列表
205-- `type_`: 数据副本所在介质类型列表
206-- `gva_`: 数据副本对应的 GVA 列表
207 277 
208-> 补充说明278+- `size_`数据字节数。
209-> `GetKeyInfo` 的实际签名带 `flag` 参数。默认值为 `0`279+- `blobNum_`据副本数
210-> `KeyInfo` 除 `size_`、`blobNum_`、`loc_`、`type_` 外,还包含 `gva_`,用于描述每个 blob 对应的 GVA 列表。280+- `loc_`:数据副本所在位置列表。
281+- `type_`:数据副本所在介质类型列表。
282+- `gva_`:数据副本对应的 GVA 列表。
283+ 
284+> [!NOTE] 补充说明
285+>
286+> - `GetKeyInfo` 的实际签名带 `flag` 参数。默认值为 `0`。
287+> - `KeyInfo` 除 `size_`、`blobNum_`、`loc_`、`type_` 外,还包含 `gva_`,用于描述每个 blob 对应的 GVA 列表。
211 288 
212### 4. 批量操作接口289### 4. 批量操作接口
213 290 
214#### BatchGetInto291#### BatchGetInto
292+ 
215```c++293```c++
216virtual std::vector<int> BatchGetInto(const std::vector<std::string> &keys, const std::vector<void *> &buffers,294virtual std::vector<int> BatchGetInto(const std::vector<std::string> &keys, const std::vector<void *> &buffers,
217 const std::vector<size_t> &sizes, const int32_t direct = 2) = 0;295 const std::vector<size_t> &sizes, const int32_t direct = 2) = 0;
218```296```
219-**功能**: 批量读取多个键到各自缓冲区。
220 297 
221-**参数**:298+**功能**
222-- `keys`: 数据键列表(每个键长度 < 256字节)
223-- `buffers`: 目标内存地址列表,必须与keys一一对应
224-- `sizes`: 缓冲区容量列表,必须与buffers长度一致
225-- `direct`: 数据流向
226 299 
227-**返回值**:300+批量读取多个键到各自缓冲区。
228-- 返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败301+ 
302+**参数**
303+ 
304+- `keys`:数据键列表(每个键长度 < 256字节)。
305+- `buffers`:目标内存地址列表,必须与keys一一对应。
306+- `sizes`:缓冲区容量列表,必须与buffers长度一致。
307+- `direct`:数据流向。
308+ 
309+**返回值**
310+ 
311+返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败。
229 312 
230#### BatchPutFrom313#### BatchPutFrom
314+ 
231```c++315```c++
232virtual std::vector<int> BatchPutFrom(const std::vector<std::string> &keys, const std::vector<void *> &buffers,316virtual std::vector<int> BatchPutFrom(const std::vector<std::string> &keys, const std::vector<void *> &buffers,
233 const std::vector<size_t> &sizes, const int32_t direct = 3,317 const std::vector<size_t> &sizes, const int32_t direct = 3,
234 const ReplicateConfig &replicateConfig = {}) = 0;318 const ReplicateConfig &replicateConfig = {}) = 0;
235```319```
236-**功能**: 批量写入多个键。
237 320 
238-**参数**:321+**功能**
239-- `keys`: 数据键列表(每个键长度 < 256字节)
240-- `buffers`: 目标内存地址列表,必须与keys一一对应
241-- `sizes`: 缓冲区容量列表,必须与buffers长度一致
242-- `direct`: 数据流向
243-- `replicateConfig`: 副本策略配置
244 322 
245-**返回值**:323+批量写入多个键。
246-- 返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败324+ 
325+**参数**
326+ 
327+- `keys`:数据键列表(每个键长度 < 256字节)。
328+- `buffers`:目标内存地址列表,必须与keys一一对应。
329+- `sizes`:缓冲区容量列表,必须与buffers长度一致。
330+- `direct`:数据流向。
331+- `replicateConfig`:副本策略配置。
332+ 
333+**返回值**
334+ 
335+返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败。
247 336 
248#### BatchRemove337#### BatchRemove
338+ 
249```c++339```c++
250virtual std::vector<int> BatchRemove(const std::vector<std::string> &keys) = 0;340virtual std::vector<int> BatchRemove(const std::vector<std::string> &keys) = 0;
251```341```
252-**功能**: 批量删除。
253 342 
254-**参数**:343+**功能**
255-- `keys`: 数据键列表(每个键长度 < 256字节)
256 344 
257-**返回值**:345+批量删除。
258-- 返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败346+ 
347+**参数**
348+ 
349+`keys`:数据键列表(每个键长度 < 256字节)。
350+ 
351+**返回值**
352+ 
353+返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败。
259 354 
260#### BatchIsExist355#### BatchIsExist
356+ 
261```c++357```c++
262virtual std::vector<int> BatchIsExist(const std::vector<std::string> &keys) = 0;358virtual std::vector<int> BatchIsExist(const std::vector<std::string> &keys) = 0;
263```359```
264-**功能**: 批量存在性检查。
265 360 
266-**参数**:361+**功能**
267-- `keys`: 数据键列表(每个键长度 < 256字节)
268 362 
269-**返回值**:363+批量存在性检查。
270-- `1`: 存在364+ 
271-- `0`: 不存在365+**参数**
272-- 其他: 失败366+ 
367+`keys`:数据键列表(每个键长度 < 256字节)。
368+ 
369+**返回值**
370+ 
371+- `1`:存在
372+- `0`:不存在
373+- 其他:失败
273 374 
274#### BatchGetKeyInfo375#### BatchGetKeyInfo
376+ 
275```c++377```c++
276virtual std::vector<KeyInfo> BatchGetKeyInfo(const std::vector<std::string> &keys, uint32_t flag = 0) = 0;378virtual std::vector<KeyInfo> BatchGetKeyInfo(const std::vector<std::string> &keys, uint32_t flag = 0) = 0;
277```379```
278-**功能**: 批量查询元信息。
279 380 
280-**参数**:381+**功能**
281-- `keys`: 数据键列表(每个键长度 < 256字节)382+ 
282-- `flag`: 查询标志,默认值为 `0`383+批量查询元信息。
384+ 
385+**参数**
386+ 
387+- `keys`:数据键列表(每个键长度 < 256字节)。
388+- `flag`:查询标志,默认值为 `0`
389+ 
390+**返回值**
283 391 
284-**返回值**:
285返回KeyInfo列表,每个KeyInfo包含:392返回KeyInfo列表,每个KeyInfo包含:
286-- `size_`: 数据字节数393+ 
287-- `blobNum_`: 数据副本394+- `size_`数据字节
288-- `loc_`: 数据副本所在位置列表395+- `blobNum_`数据副本数。
289-- `type_`: 数据副本所在介质类型列表396+- `loc_`数据副本所在位置列表
290-- `gva_`: 数据副本对应的 GVA 列表397+- `type_`数据副本所在介质类型列表
398+- `gva_`:数据副本对应的 GVA 列表。
291 399 
292#### BatchAddLease400#### BatchAddLease
401+ 
293```c++402```c++
294virtual std::vector<int> BatchAddLease(const std::vector<std::string> &keys, uint64_t leaseTtlMs = 0) = 0;403virtual std::vector<int> BatchAddLease(const std::vector<std::string> &keys, uint64_t leaseTtlMs = 0) = 0;
295```404```
296-**功能**: 批量为多个 key 增加读租约,并记录后续 GVA 读取所需的读租约状态。
297 405 
298-**参数**:406+**功能**
299-- `keys`: 要增加读租约的 key 列表(每个键长度 < 256字节),不能为空
300-- `leaseTtlMs`: 要增加的租约时间,单位为毫秒,默认为 `0`。为 `0` 时使用 meta 侧配置项
301- `ock.mmc.meta.lease_ttl_ms`
302 407 
303-**返回值**:408+批量为多个 key 增加读租约,并记录后续 GVA 读取所需的读租约状态。
304-- `std::vector<int>`: 每个元素表示对应 key 的处理结果,`0` 表示成功,其他值表示失败409+ 
305- 返回列表长度与 `keys` 一致。410+**参数**
411+ 
412+- `keys`:要增加读租约的 key 列表(每个键长度 < 256字节),不能为空。
413+- `leaseTtlMs`:要增加的租约时间,单位为毫秒,默认为 `0`。为 `0` 时使用 meta 侧配置项 `ock.mmc.meta.lease_ttl_ms`
414+ 
415+**返回值**
416+ 
417+`std::vector<int>`:每个元素表示对应 key 的处理结果,`0` 表示成功,其他值表示失败。返回列表长度与 `keys` 一致。
418+ 
419+**使用说明**
306 420 
307-**使用说明**:
308- 该接口返回每个 key 的错误码,不返回 `KeyInfo`421- 该接口返回每个 key 的错误码,不返回 `KeyInfo`
309- 该接口为非事务接口;某个 key 失败不会回滚其他 key 已经成功增加的读租约。422- 该接口为非事务接口;某个 key 失败不会回滚其他 key 已经成功增加的读租约。
310- `leaseTtlMs``0` 时,meta 侧使用配置项 `ock.mmc.meta.lease_ttl_ms` 的值增加租约。423- `leaseTtlMs``0` 时,meta 侧使用配置项 `ock.mmc.meta.lease_ttl_ms` 的值增加租约。
311- 调用方应只对返回值为 `0` 的 key 继续执行后续基于 GVA 的读取流程。424- 调用方应只对返回值为 `0` 的 key 继续执行后续基于 GVA 的读取流程。
312-- 典型用法是先通过 `BatchGetKeyInfo(keys)` 获取 GVA,再调用 `BatchAddLease(keys)`425+- 典型用法是先通过 `BatchGetKeyInfo(keys)` 获取 GVA,再调用 `BatchAddLease(keys)`,为后续基于 GVA 的读取流程建立读租约状态。
313- 为后续基于 GVA 的读取流程建立读租约状态426+- 同一进程对同一 key 重复调用时,会复用当前进程中已有的读租约并在 meta 侧续租;完成读取后调用一次 `BatchRemoveLease` 即可释放
314-- 同一进程对同一 key 重复调用时,会复用当前进程中已有的读租约并在 meta 侧续租;
315- 完成读取后调用一次 `BatchRemoveLease` 即可释放。
316 427 
317#### BatchRemoveLease428#### BatchRemoveLease
429+ 
318```c++430```c++
319virtual int BatchRemoveLease(const std::vector<std::string> &keys) = 0;431virtual int BatchRemoveLease(const std::vector<std::string> &keys) = 0;
320```432```
321-**功能**: 批量移除多个 key 的读租约,并清理当前进程中对应的 GVA 读取状态。
322 433 
323-**参数**:434+**功能**
324-- `keys`: 要移除读租约的 key 列表(每个键长度 < 256字节),不能为空
325 435 
326-**返回值**:436+批量移除多个 key 的读租约,并清理当前进程中对应的 GVA 读取状态。
327-- `int`: `0` 表示本地读租约检查通过并已触发移除租约请求发送流程;其他值表示失败。
328 437 
329-**使用说明**:438+**参数**
330-- 调用方完成基于 GVA 的读取后,应调用该接口显式释放由 `BatchAddLease` 建立的读租约。439+ 
440+`keys`:要移除读租约的 key 列表(每个键长度 < 256字节),不能为空。
441+ 
442+**返回值**
443+ 
444+- `int``0` 表示本地读租约检查通过并已触发移除租约请求发送流程。
445+- 其他值表示失败。
446+ 
447+**使用说明**
448+ 
449+调用方完成基于 GVA 的读取后,应调用该接口显式释放由 `BatchAddLease` 建立的读租约。
331 450 
332#### BatchMalloc451#### BatchMalloc
452+ 
333```c++453```c++
334virtual std::vector<uintptr_t> BatchMalloc(const std::vector<std::string> &keys, const std::vector<size_t> &sizes,454virtual std::vector<uintptr_t> BatchMalloc(const std::vector<std::string> &keys, const std::vector<size_t> &sizes,
335 uint16_t media, uint64_t leaseTtlMs = 0) = 0;455 uint16_t media, uint64_t leaseTtlMs = 0) = 0;
336```456```
337-**功能**: 批量为多个 key 申请全局内存,并返回每个 key 对应的起始 GVA。
338 457 
339-**参数**:458+**功能**
340-- `keys`: 要申请内存的 key 列表,长度必须与 `sizes` 一致
341-- `sizes`: 每个 key 对应的数据大小列表
342-- `media`: 申请的介质类型,如 `MEDIA_HBM``MEDIA_DRAM`
343-- `leaseTtlMs`: 要增加的租约时间,单位为毫秒,默认为 `0`。为 `0` 时使用 meta 侧配置项 `ock.mmc.meta.lease_ttl_ms`
344 459 
345-**返回值**:460+批量为多个 key 申请全局内存,并返回每个 key 对应的起始 GVA。
346-- `std::vector<uintptr_t>`: 每个元素为一个 key 对应的起始 GVA461+ 
347-- 申请失败或参数非法时,对应元素为 `0`462+**参数**
463+ 
464+- `keys`:要申请内存的 key 列表,长度必须与 `sizes` 一致。
465+- `sizes`:每个 key 对应的数据大小列表。
466+- `media`:申请的介质类型,如 `MEDIA_HBM``MEDIA_DRAM`
467+- `leaseTtlMs`:要增加的租约时间,单位为毫秒,默认为 `0`。为 `0` 时使用 meta 侧配置项 `ock.mmc.meta.lease_ttl_ms`
468+ 
469+**返回值**
470+ 
471+- `std::vector<uintptr_t>`:每个元素为一个 key 对应的起始 GVA。
472+- 申请失败或参数非法时,对应元素为 `0`
348 473 
349#### BatchCopy474#### BatchCopy
475+ 
350```c++476```c++
351virtual int BatchCopy(std::vector<void *> &gvas, std::vector<void *> &buffers, std::vector<size_t> &sizes,477virtual int BatchCopy(std::vector<void *> &gvas, std::vector<void *> &buffers, std::vector<size_t> &sizes,
352 const int32_t direct = 3) = 0;478 const int32_t direct = 3) = 0;
353```479```
354-**功能**: 批量在 GVA 地址与本地缓冲区之间执行数据拷贝。注意:写方向(如 `SMEMB_COPY_L2G`/`SMEMB_COPY_H2G`)只拷贝数据,**不会**将 GVA 对应的 blob 状态翻转为 READABLE;调用方必须再调用 `MmcacheStore::BatchWriteFinish` 显式通知写完成,blob 才会进入可读状态。
355 480 
356-**参数**:481+**功能**
357-- `gvas`: GVA 地址列表
358-- `buffers`: 本地缓冲区列表,必须与 `gvas` 一一对应
359-- `sizes`: 每次拷贝的大小列表,长度必须与 `gvas` 一致
360-- `direct`: 数据拷贝方向,取值参见 `smem_bm_copy_type`,常用值包括 `SMEMB_COPY_L2G``SMEMB_COPY_G2L``SMEMB_COPY_G2H``SMEMB_COPY_H2G`
361 482 
362-**返回值**:483+批量在 GVA 地址与本地缓冲区之间执行数据拷贝。
363-- `0`: 成功484+ 
364-- 其他: 失败485+> [!NOTE] 说明
486+> 写方向(如 `SMEMB_COPY_L2G`/`SMEMB_COPY_H2G`)只拷贝数据,**不会**将 GVA 对应的 blob 状态翻转为 READABLE;调用方必须再调用 `MmcacheStore::BatchWriteFinish` 显式通知写完成,blob 才会进入可读状态。
487+ 
488+**参数**
489+ 
490+- `gvas`:GVA 地址列表。
491+- `buffers`:本地缓冲区列表,必须与 `gvas` 一一对应。
492+- `sizes`:每次拷贝的大小列表,长度必须与 `gvas` 一致。
493+- `direct`:数据拷贝方向,取值参见 `smem_bm_copy_type`,常用值包括 `SMEMB_COPY_L2G``SMEMB_COPY_G2L``SMEMB_COPY_G2H``SMEMB_COPY_H2G`
494+ 
495+**返回值**
496+ 
497+- `0`:成功
498+- 其他:失败
365 499 
366#### BatchWriteFinish500#### BatchWriteFinish
501+ 
367```c++502```c++
368virtual std::vector<int> BatchWriteFinish(const std::vector<std::string> &keys,503virtual std::vector<int> BatchWriteFinish(const std::vector<std::string> &keys,
369 const std::vector<int32_t> &writeResults) = 0;504 const std::vector<int32_t> &writeResults) = 0;
370```505```
371-**功能**: 显式通知 meta service 给定 key 的写入已完成。调用方在 `BatchCopy` 写方向完成后必须调用此接口,meta service 才会将对应 blob 从 `ALLOCATED` 翻转为 `READABLE`,此后其他进程才能通过 `BatchGetKeyInfo` / `BatchCopy` 读方向读到数据。对于已处于 `READABLE` 的 key,再次调用为幂等并直接返回成功;对未分配过的 key 返回 `MMC_UNMATCHED_KEY`
372 506 
373-**参数**:507+**功能**
374-- `keys`: 已写入完成的键列表,每个键长度小于 256 个字节
375-- `writeResults`: 与 `keys` 等长的每键写入结果,`0` 表示成功(对应 `MMC_WRITE_OK`,blob 翻为 `READABLE`),非 `0` 表示失败(对应 `MMC_WRITE_FAIL`,meta service 会移除该 blob)
376 508 
377-**返回值**:509+显式通知 meta service 给定 key 的写入已完成。
378-- `std::vector<int>`: 与 `keys` 等长,每个元素为 meta service 对该键的实际更新结果;`0` 表示成功
379 510 
380-> 典型 GVA 跨进程读取流程:511+> [!NOTE] 说明
512+> 调用方在 `BatchCopy` 写方向完成后必须调用此接口,meta service 才会将对应 blob 从 `ALLOCATED` 翻转为 `READABLE`,此后其他进程才能通过 `BatchGetKeyInfo` / `BatchCopy` 读方向读到数据。对于已处于 `READABLE` 的 key,再次调用为幂等并直接返回成功;对未分配过的 key 返回 `MMC_UNMATCHED_KEY`。
513+ 
514+**参数**
515+ 
516+- `keys`:已写入完成的键列表,每个键长度小于 256 个字节。
517+- `writeResults`:与 `keys` 等长的每键写入结果,`0` 表示成功(对应 `MMC_WRITE_OK`,blob 翻为 `READABLE`),非 `0` 表示失败(对应 `MMC_WRITE_FAIL`,meta service 会移除该 blob)。
518+ 
519+**返回值**
520+ 
521+`std::vector<int>`:与 `keys` 等长,每个元素为 meta service 对该键的实际更新结果;`0` 表示成功。
522+ 
523+> [!NOTE] 典型 GVA 跨进程读取流程:
524+>
381> - 写进程:`BatchMalloc -> BatchCopy`(写入数据)-> `BatchWriteFinish` 显式通知写完成,blob 翻为 READABLE。525> - 写进程:`BatchMalloc -> BatchCopy`(写入数据)-> `BatchWriteFinish` 显式通知写完成,blob 翻为 READABLE。
382-> - 读进程:`BatchGetKeyInfo(keys, 0)` 获取 GVA -> `BatchAddLease(...)` 增加读租约并准备 GVA 读取状态 ->526+> - 读进程:`BatchGetKeyInfo(keys, 0)` 获取 GVA -> `BatchAddLease(...)` 增加读租约并准备 GVA 读取状态 -> `BatchCopy`(读取)-> `BatchRemoveLease(...)` 显式释放读租约。
383-> `BatchCopy`(读取)-> `BatchRemoveLease(...)` 显式释放读租约。
384 527 
385### 5. 分层张量操作528### 5. 分层张量操作
386 529 
387#### PutFromLayers530#### PutFromLayers
531+ 
388```c++532```c++
389virtual int PutFromLayers(const std::string &key, const std::vector<void *> &buffers,533virtual int PutFromLayers(const std::string &key, const std::vector<void *> &buffers,
390 const std::vector<size_t> &sizes, const int32_t direct = 3,534 const std::vector<size_t> &sizes, const int32_t direct = 3,
391 const ReplicateConfig &replicateConfig = {}) = 0;535 const ReplicateConfig &replicateConfig = {}) = 0;
392 536 
393```537```
394-**功能**: 将多个内存块(layers)拼接后作为一个逻辑对象写入缓存,并关联到指定键。
395 538 
396-**参数**:539+**功能**
397-- `key`: 数据键(长度 < 256字节)
398-- `buffers`: 多层内存地址列表
399-- `sizes`: 每层缓冲区容量大小列表,必须与buffers长度一致
400-- `direct`: 数据流向
401-- `replicateConfig`: 副本策略配置
402 540 
403-**返回值**:541+将多个内存块(layers)拼接后作为一个逻辑对象写入缓存,并关联到指定键。
404-- `0`: 成功542+ 
405-- 其他: 失败543+**参数**
544+ 
545+- `key`:数据键(长度 < 256字节)。
546+- `buffers`:多层内存地址列表。
547+- `sizes`:每层缓冲区容量大小列表,必须与buffers长度一致。
548+- `direct`:数据流向。
549+- `replicateConfig`:副本策略配置。
550+ 
551+**返回值**
552+ 
553+- `0`:成功
554+- 其他:失败
406 555 
407#### GetIntoLayers556#### GetIntoLayers
557+ 
408```c++558```c++
409virtual int GetIntoLayers(const std::string &key, const std::vector<void *> &buffers,559virtual int GetIntoLayers(const std::string &key, const std::vector<void *> &buffers,
410 const std::vector<size_t> &sizes, const int32_t direct = 2) = 0;560 const std::vector<size_t> &sizes, const int32_t direct = 2) = 0;
411```561```
412-**功能**: 从缓存中读取指定键的逻辑对象,并按预定义大小分发到多个目标缓冲区。
413 562 
414-**参数**:563+**功能**
415-- `key`: 数据键(长度 < 256字节)
416-- `buffers`: 多层内存地址列表
417-- `sizes`: 每层缓冲区容量大小列表,必须与buffers长度一致
418-- `direct`: 数据流向
419 564 
420-**返回值**:565+从缓存中读取指定键的逻辑对象,并按预定义大小分发到多个目标缓冲区。
421-- `0`: 成功566+ 
422-- 其他: 失败567+**参数**
568+ 
569+- `key`:数据键(长度 < 256字节)。
570+- `buffers`:多层内存地址列表。
571+- `sizes`:每层缓冲区容量大小列表,必须与buffers长度一致。
572+- `direct`:数据流向。
573+ 
574+**返回值**
575+ 
576+- `0`:成功
577+- 其他:失败
423 578 
424#### BatchPutFromLayers579#### BatchPutFromLayers
580+ 
425```c++581```c++
426virtual std::vector<int> BatchPutFromLayers(const std::vector<std::string> &keys,582virtual std::vector<int> BatchPutFromLayers(const std::vector<std::string> &keys,
427 const std::vector<std::vector<void *>> &buffers,583 const std::vector<std::vector<void *>> &buffers,
428 const std::vector<std::vector<size_t>> &sizes, const int32_t direct = 3,584 const std::vector<std::vector<size_t>> &sizes, const int32_t direct = 3,
429 const ReplicateConfig &replicateConfig = {}) = 0;585 const ReplicateConfig &replicateConfig = {}) = 0;
430```586```
431-**功能**: 批量将多个逻辑对象(每个由多层内存块组成)写入缓存。
432 587 
433-**参数**:588+**功能**
434-- `keys`: 数据键列表(每个键长度 < 256字节)589+ 
435-- `buffers`: 多层内存地址列表,必须与keys一一对应590+批量将个逻辑对象(每个由多层内存块组成)写入缓存。
436-- `sizes`: 每层缓冲区容量大小列表,必须与buffers长度一致591+ 
437-- `direct`: 据流向592+**参**
438-- `replicateConfig`: 副本策略配置593+ 
594+- `keys`:数据键列表(每个键长度 < 256字节)。
595+- `buffers`:多层内存地址列表,必须与keys一一对应。
596+- `sizes`:每层缓冲区容量大小列表,必须与buffers长度一致。
597+- `direct`:数据流向。
598+- `replicateConfig`:副本策略配置。
599+ 
600+**返回值**
439 601 
440-**返回值**:
441返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败602返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败
442 603 
443#### BatchGetIntoLayers604#### BatchGetIntoLayers
605+ 
444```c++606```c++
445virtual std::vector<int> BatchGetIntoLayers(const std::vector<std::string> &keys,607virtual std::vector<int> BatchGetIntoLayers(const std::vector<std::string> &keys,
446 const std::vector<std::vector<void *>> &buffers,608 const std::vector<std::vector<void *>> &buffers,
447 const std::vector<std::vector<size_t>> &sizes,609 const std::vector<std::vector<size_t>> &sizes,
448 const int32_t direct = 2) = 0;610 const int32_t direct = 2) = 0;
449```611```
450-**功能**: 批量从缓存中读取多个逻辑对象,并分别分发到各自的多层缓冲区。
451 612 
452-**参数**:613+**功能**
453-- `keys`: 数据键列表(每个键长度 < 256字节)
454-- `buffers`: 多层内存地址列表,必须与keys一一对应
455-- `sizes`: 每层缓冲区容量大小列表,必须与buffers长度一致
456-- `direct`: 数据流向
457 614 
458-**返回值**:615+批量从缓存中读取多个逻辑对象,并分别分发到各自的多层缓冲区。
459-返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败616+ 
617+**参数**
618+ 
619+- `keys`:数据键列表(每个键长度 < 256字节)。
620+- `buffers`:多层内存地址列表,必须与keys一一对应。
621+- `sizes`:每层缓冲区容量大小列表,必须与buffers长度一致。
622+- `direct`:数据流向。
623+ 
624+**返回值**
625+ 
626+返回每个键对应的处理结果列表,每个元素 `0` 表示成功,负数表示失败。
460 627 
461### 6. 辅助接口628### 6. 辅助接口
462 629 
463#### GetLocalServiceId630#### GetLocalServiceId
631+ 
464```c++632```c++
465virtual int GetLocalServiceId(uint32_t &localServiceId) = 0;633virtual int GetLocalServiceId(uint32_t &localServiceId) = 0;
466```634```
467-**功能**: 获取当前实例关联的本地服务 ID(用于调试或日志追踪)。
468 635 
469-**参数**:636+**功能**
470-- `localServiceId`: 输出参数
471 637 
472-**返回值**:638+获取当前实例关联的本地服务 ID(用于调试或日志追踪)。
473-- `0`: 成功639+ 
474-- 其他: 失败640+**参数**
641+ 
642+`localServiceId`:输出参数。
643+ 
644+**返回值**
645+ 
646+- `0`:成功
647+- 其他:失败
475 648 
476## 数据结构649## 数据结构
477 650 
478### ReplicateConfig651### ReplicateConfig
652+ 
479副本策略配置,包含以下字段:653副本策略配置,包含以下字段:
480-- `replicaNum`: 副本数,默认1,最大8654+ 
481-- `preferredLocalServiceIDs`: 优先分配的地服务 ID 列表列表小必须小于或等于replicaNum655+- `replicaNum`:副默认1,最8。
656+- `preferredLocalServiceIDs`:优先分配的本地服务 ID 列表,列表大小必须小于或等于replicaNum。
482 657 
483### KeyInfo658### KeyInfo
659+ 
484键元信息结构体,包含以下字段:660键元信息结构体,包含以下字段:
485-- `size_`: 数据字节数661+ 
486-- `blobNum_`: 数据副本662+- `size_`数据字节
487-- `loc_`: 数据副本所在位置列表663+- `blobNum_`数据副本数。
488-- `type_`: 数据副本所在介质类型列表664+- `loc_`数据副本所在位置列表
489-- `gva_`: 数据副本的全局虚拟地址列表665+- `type_`数据副本所在介质类型列表
666+- `gva_`:数据副本的全局虚拟地址列表。
490 667 
491## smem_bm_copy_type 枚举类型668## smem_bm_copy_type 枚举类型
492 669 
@@ -536,6 +713,6 @@ virtual int GetLocalServiceId(uint32_t &localServiceId) = 0;
536 713 
537## 注意事项714## 注意事项
538 715 
539-- 所有键的长度必须小于256个字节716+- 所有键的长度必须小于256个字节
540-- 支持同步和异步两种操作模式717+- 支持同步和异步两种操作模式
541-- 批量操作可以提高处理效率718+- 批量操作可以提高处理效率
Rdoc/memcache_c_api.mddocs/memcache_c_api.md+475-283
@@ -1,543 +1,735 @@
1# MemCache API1# MemCache API
2 2 
3## C接口列表3## C接口列表
4+ 
4C语言接口功能齐全,包含metaservice/localservice服务启停接口,客户端初始化和反初始化接口,数据操作接口和日志设置接口。5C语言接口功能齐全,包含metaservice/localservice服务启停接口,客户端初始化和反初始化接口,数据操作接口和日志设置接口。
5 6 
6### 1. 服务启动停止接口7### 1. 服务启动停止接口
7 8 
8#### mmcs_meta_service_start9#### mmcs_meta_service_start
10+ 
9```c11```c
10mmc_meta_service_t mmcs_meta_service_start(mmc_meta_service_config_t *config);12mmc_meta_service_t mmcs_meta_service_start(mmc_meta_service_config_t *config);
11```13```
12-**功能**: 启动分布式内存缓存的元数据服务,该服务是全局的。
13 14 
14-**参数**:15+**功能**
15-- `config`: 元数据服务配置信息
16 16 
17-**返回值**:17+启动分布式内存缓存的元数据服务,该服务是全局的。
18-- `mmc_meta_service_t`: 元数据服务句柄(成功),NULL(失败)18+ 
19+**参数**
20+ 
21+`config`:元数据服务配置信息。
22+ 
23+**返回值**
24+ 
25+`mmc_meta_service_t`:元数据服务句柄(成功),NULL(失败)。
19 26 
20#### mmcs_meta_service_stop27#### mmcs_meta_service_stop
28+ 
21```c29```c
22void mmcs_meta_service_stop(mmc_meta_service_t handle);30void mmcs_meta_service_stop(mmc_meta_service_t handle);
23```31```
24-**功能**: 停止分布式内存缓存的元数据服务。
25 32 
26-**参数**:33+**功能**
27-- `handle`: 元数据服务句柄34+ 
35+停止分布式内存缓存的元数据服务。
36+ 
37+**参数**
38+ 
39+`handle`:元数据服务句柄。
28 40 
29#### mmcs_local_service_start41#### mmcs_local_service_start
42+ 
30```c43```c
31mmc_local_service_t mmcs_local_service_start(mmc_local_service_config_t *config);44mmc_local_service_t mmcs_local_service_start(mmc_local_service_config_t *config);
32```45```
33-**功能**: 启动分布式内存缓存的本地服务,负责本地内存对象的管理。
34-**注**:如果开启device_urma协议,则`max dram * world_size`的池化总大小必须大于32T
35 46 
36-**参数**:47+**功能**
37-- `config`: 本地服务配置信息
38 48 
39-**返回值**:49+启动分布式内存缓存的本地服务,负责本地内存对象的管理。
40-- `mmc_local_service_t`: 本地服务句柄(成功),NULL(失败)50+ 
51+> [!NOTE] 说明
52+> 如果开启device_urma协议,则`max dram * world_size`的池化总大小必须大于32T。
53+ 
54+**参数**
55+ 
56+`config`:本地服务配置信息。
57+ 
58+**返回值**
59+ 
60+`mmc_local_service_t`:本地服务句柄(成功),NULL(失败)。
41 61 
42#### mmcs_local_service_stop62#### mmcs_local_service_stop
63+ 
43```c64```c
44void mmcs_local_service_stop(mmc_local_service_t handle);65void mmcs_local_service_stop(mmc_local_service_t handle);
45```66```
46-**功能**: 停止分布式内存缓存的本地服务。
47 67 
48-**参数**:68+**功能**
49-- `handle`: 本地服务句柄69+ 
70+停止分布式内存缓存的本地服务。
71+ 
72+**参数**
73+ 
74+`handle`:本地服务句柄。
50 75 
51### 2. SDK初始化和反初始化76### 2. SDK初始化和反初始化
52 77 
53#### mmc_setup78#### mmc_setup
79+ 
54```c80```c
55int32_t mmc_setup(const local_config *config);81int32_t mmc_setup(const local_config *config);
56```82```
57-**功能**: 初始化并校验本地配置,供后续 `mmc_init` 使用。
58 83 
59-**参数**:84+**功能**
60-- `config`: 本地配置(`local_config`
61 85 
62-**返回值**:86+初始化并校验本地配置,供后续 `mmc_init` 使用。
63-- `0`: 成功87+ 
64-- 其他: 失败88+**参数**
89+ 
90+`config`:本地配置(`local_config`)。
91+ 
92+**返回值**
93+ 
94+- `0`:成功
95+- 其他:失败
65 96 
66#### mmc_init97#### mmc_init
98+ 
67```c99```c
68int32_t mmc_init(const mmc_init_config *config);100int32_t mmc_init(const mmc_init_config *config);
69```101```
70-**功能**: 初始化MemCache运行环境(只读客户端和可选local service)。
71 102 
72-**参数**:103+**功能**
73-- `config`: 初始化参数(`mmc_init_config`
74- - `deviceId`: 设备ID
75- - `initBm`: 是否初始化本地服务并提供内存(`true` 启用,`false` 只读客户端)
76 104 
77-**返回值**:105+初始化MemCache运行环境(只读客户端和可选local service)。
78-- `0`: 成功106+ 
79-- 其他: 失败107+**参数**
108+ 
109+`config`:初始化参数(`mmc_init_config`)。
110+ 
111+ - `deviceId`:设备ID。
112+ - `initBm`:是否初始化本地服务并提供内存(`true` 启用,`false` 只读客户端)。
113+ 
114+**返回值**
115+ 
116+- `0`:成功
117+- 其他:失败
80 118 
81#### mmc_uninit119#### mmc_uninit
120+ 
82```c121```c
83void mmc_uninit(void);122void mmc_uninit(void);
84```123```
85-**功能**: 反初始化MemCache运行环境,释放相关资源。124+ 
125+**功能**
126+ 
127+反初始化MemCache运行环境,释放相关资源。
86 128 
87### 3. 客户端底层初始化和反初始化(兼容接口)129### 3. 客户端底层初始化和反初始化(兼容接口)
88 130 
89#### mmcc_init131#### mmcc_init
132+ 
90```c133```c
91int32_t mmcc_init(mmc_client_config_t *config);134int32_t mmcc_init(mmc_client_config_t *config);
92```135```
93-**功能**: 初始化分布式内存缓存客户端,这是一个单例模式。
94 136 
95-**参数**:137+**功能**
96-- `config`: 客户端配置信息
97 138 
98-**返回值**:139+初始化分布式内存缓存客户端,这是一个单例模式。
99-- `0`: 成功140+ 
100-- 其他: 失败141+**参数**
142+ 
143+`config`:客户端配置信息
144+ 
145+**返回值**
146+ 
147+- `0`:成功
148+- 其他:失败
101 149 
102#### mmcc_uninit150#### mmcc_uninit
151+ 
103```c152```c
104void mmcc_uninit(void);153void mmcc_uninit(void);
105```154```
106-**功能**: 反初始化客户端,释放相关资源。155+ 
156+**功能**
157+ 
158+反初始化客户端,释放相关资源。
107 159 
108### 4. 数据操作接口160### 4. 数据操作接口
109 161 
110#### mmcc_register_buffer162#### mmcc_register_buffer
163+ 
111```c164```c
112int32_t mmcc_register_buffer(uint64_t addr, uint64_t size);165int32_t mmcc_register_buffer(uint64_t addr, uint64_t size);
113```166```
114-**功能**: 将指定地址和大小的内存缓冲区注册到BM中,以加速device rdma操作。
115 167 
116-**参数**:168+**功能**
117-- `addr`: 要注册的内存缓冲区地址
118-- `size`: 要注册的内存缓冲区大小
119 169 
120-**返回值**:170+将指定地址和大小的内存缓冲区注册到BM中,以加速device rdma操作。
121-- `0`: 成功171+ 
122-- 其他: 失败172+**参数**
173+ 
174+- `addr`:要注册的内存缓冲区地址。
175+- `size`:要注册的内存缓冲区大小。
176+ 
177+**返回值**
178+ 
179+- `0`:成功
180+- 其他:失败
123 181 
124#### mmcc_unregister_buffer182#### mmcc_unregister_buffer
183+ 
125```c184```c
126int32_t mmcc_unregister_buffer(uint64_t addr, uint64_t size);185int32_t mmcc_unregister_buffer(uint64_t addr, uint64_t size);
127```186```
128-**功能**: 从BM中注销指定地址和大小的内存缓冲区。
129 187 
130-**参数**:188+**功能**
131-- `addr`: 要注销的内存缓冲区地址
132-- `size`: 要注销的内存缓冲区大小
133 189 
134-**返回值**:190+从BM中注销指定地址和大小的内存缓冲区。
135-- `0`: 成功191+ 
136-- 其他: 失败192+**参数**
193+ 
194+- `addr`:要注销的内存缓冲区地址。
195+- `size`:要注销的内存缓冲区大小。
196+ 
197+**返回值**
198+ 
199+- `0`:成功
200+- 其他:失败
137 201 
138#### mmcc_local_service_id202#### mmcc_local_service_id
203+ 
139```c204```c
140int32_t mmcc_local_service_id(uint32_t *localServiceId);205int32_t mmcc_local_service_id(uint32_t *localServiceId);
141```206```
142-**功能**: 获取本地服务的实例id。
143 207 
144-**参数**:208+**功能**
145-- `localServiceId`: 本地服务的实例id
146 209 
147-**返回值**:210+获取本地服务的实例ID。
148-- `0`: 成功211+ 
149-- 其他: 失败212+**参数**
213+ 
214+`localServiceId`:本地服务的实例ID。
215+ 
216+**返回值**
217+ 
218+- `0`:成功
219+- 其他:失败
150 220 
151#### mmcc_put221#### mmcc_put
222+ 
152```c223```c
153int32_t mmcc_put(const char *key, mmc_buffer *buf, mmc_put_options options, uint32_t flags);224int32_t mmcc_put(const char *key, mmc_buffer *buf, mmc_put_options options, uint32_t flags);
154```225```
155-**功能**: 将指定 key 的数据放入分布式内存缓存中。
156 226 
157-**参数**:227+**功能**
158 228 
159-- `key`: 数据的键,长度小于256个字节229+将指定 key 数据放入分布式内存缓存中。
160-- `buf`: 要放入的数据缓冲区
161-- `options`: 放置操作的选项
162-- `flags`: 可选标志,保留字段
163 230 
164-**返回值**:231+**参数**
165-- `0`: 成功232+ 
166-- 其他: 失败233+- `key`:数据的键,长度小于256个字节。
234+- `buf`:要放入的数据缓冲区。
235+- `options`:放置操作的选项。
236+- `flags`:可选标志,保留字段。
237+ 
238+**返回值**
239+ 
240+- `0`:成功
241+- 其他:失败
167 242 
168#### mmcc_get243#### mmcc_get
244+ 
169```c245```c
170int32_t mmcc_get(const char *key, mmc_buffer *buf, uint32_t flags);246int32_t mmcc_get(const char *key, mmc_buffer *buf, uint32_t flags);
171```247```
172-**功能**: 从分布式内存缓存中获取指定 key 的数据。
173 248 
174-**参数**:249+**功能**
175 250 
176-- `key`: 数据的键,长度小于256个字节251+从分布式内存缓存中获取指定 key 数据
177-- `buf`: 存储获取数据的缓冲区
178-- `flags`: 可选标志,保留字段
179 252 
180-**返回值**:253+**参数**
181-- `0`: 成功254+ 
182-- 其他: 失败255+- `key`:数据的键,长度小于256个字节。
256+- `buf`:存储获取数据的缓冲区。
257+- `flags`:可选标志,保留字段。
258+ 
259+**返回值**
260+ 
261+- `0`:成功
262+- 其他:失败
183 263 
184#### mmcc_query264#### mmcc_query
265+ 
185```c266```c
186int32_t mmcc_query(const char *key, mmc_data_info *info, uint32_t flags);267int32_t mmcc_query(const char *key, mmc_data_info *info, uint32_t flags);
187```268```
188-**功能**: 查询分布式内存缓存中指定 key 的数据信息。
189 269 
190-**参数**:270+**功能**
191 271 
192-- `key`: 数据的键,长度小于256个字节272+查询分布式内存缓存中指定 key 数据信息。
193-- `info`: 存储数据信息的结构体
194-- `flags`: 可选标志,保留字段
195 273 
196-**返回值**:274+**参数**
197-- `0`: 成功275+ 
198-- 其他: 失败276+- `key`:数据的键,长度小于256个字节。
277+- `info`:存储数据信息的结构体。
278+- `flags`:可选标志,保留字段。
279+ 
280+**返回值**
281+ 
282+- `0`:成功
283+- 其他:失败
199 284 
200#### mmcc_remove285#### mmcc_remove
286+ 
201```c287```c
202int32_t mmcc_remove(const char *key, uint32_t flags);288int32_t mmcc_remove(const char *key, uint32_t flags);
203```289```
204-**功能**: 从分布式内存缓存中删除指定 key 的对象。
205 290 
206-**参数**:291+**功能**
207 292 
208-- `key`: 数据键,长度小于256个字节293+从分布式内存缓存中删除指定 key 的对象。
209-- `flags`: 可选标志,保留字段
210 294 
211-**返回值**:295+**参数**
212-- `0`: 成功296+ 
213-- 其他: 失败297+- `key`:数据的键,长度小于256个字节。
298+- `flags`:可选标志,保留字段。
299+ 
300+**返回值**
301+ 
302+- `0`:成功
303+- 其他:失败
214 304 
215#### mmcc_exist305#### mmcc_exist
306+ 
216```c307```c
217int32_t mmcc_exist(const char *key, uint32_t flags);308int32_t mmcc_exist(const char *key, uint32_t flags);
218```309```
219-**功能**: 判断指定 key 是否存在于分布式内存缓存中。
220 310 
221-**参数**:311+**功能**
222 312 
223-- `key`: 数据的键,长度小256个字节313+判断指定 key 是否存在分布式内存缓存中。
224-- `flags`: 可选标志,保留字段
225 314 
226-**返回值**:315+**参数**
227-- `0`: 成功316+ 
228-- 其他: 失败317+- `key`:数据的键,长度小于256个字节。
318+- `flags`:可选标志,保留字段。
319+ 
320+**返回值**
321+ 
322+- `0`:成功
323+- 其他:失败
229 324 
230#### mmcc_batch_query325#### mmcc_batch_query
326+ 
231```c327```c
232int32_t mmcc_batch_query(const char **keys, size_t keys_count, mmc_data_info *info, uint32_t flags);328int32_t mmcc_batch_query(const char **keys, size_t keys_count, mmc_data_info *info, uint32_t flags);
233```329```
234-**功能**: 批量查询指定 keys 的 blob 信息。
235 330 
236-**参数**:331+**功能**
237 332 
238-- `keys`: 数据键数组,每个键长度小于256个字节333+批量查询指定 keys 的 blob 信息。
239-- `keys_count`: 键的数量
240-- `info`: 输出的键的 Blob 信息
241-- `flags`: 操作标志
242 334 
243-**返回值**:335+**参数**
244-- `0`: 成功336+ 
245-- 其他: 失败337+- `keys`:数据键数组,每个键长度小于256个字节。
338+- `keys_count`:键的数量。
339+- `info`:输出的键的 Blob 信息。
340+- `flags`:操作标志。
341+ 
342+**返回值**
343+ 
344+- `0`:成功
345+- 其他:失败
246 346 
247#### mmcc_batch_add_lease347#### mmcc_batch_add_lease
348+ 
248```c349```c
249int32_t mmcc_batch_add_lease(const char **keys, uint32_t keys_count, uint64_t lease_ttl_ms, int32_t *results);350int32_t mmcc_batch_add_lease(const char **keys, uint32_t keys_count, uint64_t lease_ttl_ms, int32_t *results);
250```351```
251-**功能**: 批量增加多个 key 的读租约,并记录后续 GVA 读取所需的读租约状态。
252 352 
253-**参数**:353+**功能**
254 354 
255-- `keys`: 数据键数组每个键长度小于256个字节355+批量增加多个 key 的读租约并记录后续 GVA 读取所需的读租约状态。
256-- `keys_count`: 键的数量
257-- `lease_ttl_ms`: 要增加的租约时间,单位为毫秒;为 `0` 时使用 MetaService 配置的默认租期
258-- `results`: 每个增加租约操作的结果,`0` 表示成功,其他值表示失败
259 356 
260-**返回值**:357+**参数**
261-- `0`: 调用成功,逐 key 结果见 `results`358+ 
262-- 其他: 失败359+- `keys`:数据键数组,每个键长度小于256个字节。
360+- `keys_count`:键的数量。
361+- `lease_ttl_ms`:要增加的租约时间,单位为毫秒;为 `0` 时使用 MetaService 配置的默认租期。
362+- `results`:每个增加租约操作的结果,`0` 表示成功,其他值表示失败。
363+ 
364+**返回值**
365+ 
366+- `0`:调用成功,逐 key 结果见 `results`
367+- 其他:失败。
263 368 
264#### mmcc_batch_remove_lease369#### mmcc_batch_remove_lease
370+ 
265```c371```c
266int32_t mmcc_batch_remove_lease(const char **keys, uint32_t keys_count);372int32_t mmcc_batch_remove_lease(const char **keys, uint32_t keys_count);
267```373```
268-**功能**: 批量移除多个 key 的读租约,并清理当前进程中对应的 GVA 读取状态。
269 374 
270-**参数**:375+**功能**
271 376 
272-- `keys`: 数据键数组每个键长度小于256个字节377+批量移除多个 key 的读租约并清理当前进程中对应的 GVA 读取状态。
273-- `keys_count`: 键的数量
274 378 
275-**返回值**:379+**参数**
276-- `0`: 本地读租约检查通过并已触发移除租约请求发送流程380+ 
277-- 其他: 失败381+- `keys`:数据键数组,每个键长度小于256个字节。
382+- `keys_count`:键的数量。
383+ 
384+**返回值**
385+ 
386+- `0`:本地读租约检查通过并已触发移除租约请求发送流程。
387+- 其他:失败。
278 388 
279#### mmcc_batch_malloc389#### mmcc_batch_malloc
390+ 
280```c391```c
281int32_t mmcc_batch_malloc(const char **keys, uint32_t keys_count, const size_t *sizes,392int32_t mmcc_batch_malloc(const char **keys, uint32_t keys_count, const size_t *sizes,
282 mmc_put_options options, uint64_t lease_ttl_ms, uint64_t *gvas);393 mmc_put_options options, uint64_t lease_ttl_ms, uint64_t *gvas);
283```394```
284-**功能**: 批量为多个 key 申请 GVA blob,并返回每个 key 对应的 GVA 起始地址。
285 395 
286-**参数**:396+**功能**
287 397 
288-- `keys`: 数据键数组,每个键长度小于256个字节398+批量为多个 key 申请 GVA blob并返回每个 key 对应的 GVA 起始地址。
289-- `keys_count`: 键的数量
290-- `sizes`: 每个 key 对应的 GVA blob 大小
291-- `options`: 申请 GVA blob 的选项
292-- `lease_ttl_ms`: 要增加的租约时间,单位为毫秒;为 `0` 时使用 MetaService 配置的默认租期
293-- `gvas`: 输出的 GVA 起始地址数组;对应 key 申请失败时该元素为 `0`
294 399 
295-**返回值**:400+**参数**
296-- `0`: 成功401+ 
297-- 其他: 失败402+- `keys`:数据键数组,每个键长度小于256个字节。
403+- `keys_count`:键的数量。
404+- `sizes`:每个 key 对应的 GVA blob 大小。
405+- `options`:申请 GVA blob 的选项。
406+- `lease_ttl_ms`:要增加的租约时间,单位为毫秒;为 `0` 时使用 MetaService 配置的默认租期。
407+- `gvas`:输出的 GVA 起始地址数组;对应 key 申请失败时该元素为 `0`
408+ 
409+**返回值**
410+ 
411+- `0`:成功
412+- 其他:失败
298 413 
299#### mmcc_batch_copy414#### mmcc_batch_copy
415+ 
300```c416```c
301int32_t mmcc_batch_copy(const uint64_t *gvas, void **buffers, const size_t *sizes,417int32_t mmcc_batch_copy(const uint64_t *gvas, void **buffers, const size_t *sizes,
302 uint32_t count, int32_t direct);418 uint32_t count, int32_t direct);
303```419```
304-**功能**: 批量在 GVA 地址和本地 buffer 之间进行数据拷贝。注意:写方向(如 `SMEMB_COPY_L2G`/`SMEMB_COPY_H2G`)只拷贝数据,**不会**将 GVA 对应的 blob 状态翻转为 READABLE;调用方必须再调用 `mmcc_batch_write_finish` 显式通知写完成。
305 420 
306-**参数**:421+**功能**
307 422 
308-- `gvas`: GVA 起始地址数423+批量在 GVA 地址和本地 buffer 之间进行据拷贝。
309-- `buffers`: 本地 buffer 地址数组
310-- `sizes`: 每段 GVA 地址要拷贝的数据大小
311-- `count`: GVA 地址段数量
312-- `direct`: 数据拷贝方向
313 424 
314-**返回值**:425+> [!NOTE] 注意
315-- `0`:426+> 写方向(如 `SMEMB_COPY_L2G`/`SMEMB_COPY_H2G`)只拷贝数据,**不会**将 GVA 对应的 blob 状态翻转为 READABLE;调用方必须再调用 `mmcc_batch_write_finish` 显式通知写完
316-- 其他: 失败427+ 
428+**参数**
429+ 
430+- `gvas`:GVA 起始地址数组。
431+- `buffers`:本地 buffer 地址数组。
432+- `sizes`:每段 GVA 地址要拷贝的数据大小。
433+- `count`:GVA 地址段数量。
434+- `direct`:数据拷贝方向。
435+ 
436+**返回值**
437+ 
438+- `0`:成功
439+- 其他:失败
317 440 
318#### mmcc_batch_write_finish441#### mmcc_batch_write_finish
442+ 
319```c443```c
320int32_t mmcc_batch_write_finish(const char **keys, uint32_t keys_count,444int32_t mmcc_batch_write_finish(const char **keys, uint32_t keys_count,
321 const int32_t *writeResults, int32_t *outResults);445 const int32_t *writeResults, int32_t *outResults);
322```446```
323-**功能**: 显式通知 meta service 给定 key 的写入已完成。调用方在 `mmcc_batch_copy` 写方向完成后必须调用此接口,meta service 才会将对应 blob 从 `ALLOCATED` 翻转为 `READABLE`,此后其他进程才能通过 `mmcc_query` / `mmcc_batch_copy` 读方向读到数据。对于已处于 `READABLE` 的 key,再次调用为幂等并直接返回成功;对未分配过的 key 返回 `MMC_UNMATCHED_KEY`。447+ 
448+**功能**
449+ 
450+显式通知 meta service 给定 key 的写入已完成。
451+ 
452+> [!NOTE] 说明
453+>
454+> - 调用方在 `mmcc_batch_copy` 写方向完成后必须调用此接口,meta service 才会将对应 blob 从 `ALLOCATED` 翻转为 `READABLE`,此后其他进程才能通过 `mmcc_query` / `mmcc_batch_copy` 读方向读到数据。
455+> - 对于已处于 `READABLE` 的 key,再次调用为幂等并直接返回成功。
456+> - 对未分配过的 key 返回 `MMC_UNMATCHED_KEY`。
324 457 
325**参数**:458**参数**:
326 459 
327-- `keys`: 已写入完成的键列表,每个键长度小于 256 个字节460+- `keys`已写入完成的键列表,每个键长度小于 256 个字节
328-- `keys_count`: 键的数量461+- `keys_count`键的数量
329-- `writeResults`: 与 `keys` 等长的每键写入结果,`0` 表示成功(对应 `MMC_WRITE_OK`,blob 翻为 `READABLE`),非 `0` 表示失败(对应 `MMC_WRITE_FAIL`,meta service 会移除该 blob)462+- `writeResults`与 `keys` 等长的每键写入结果,`0` 表示成功(对应 `MMC_WRITE_OK`,blob 翻为 `READABLE`),非 `0` 表示失败(对应 `MMC_WRITE_FAIL`,meta service 会移除该 blob)
330-- `outResults`: 与 `keys` 等长的输出数组,每个元素为 meta service 对该键的实际更新结果463+- `outResults`与 `keys` 等长的输出数组,每个元素为 meta service 对该键的实际更新结果
331 464 
332-**返回值**:465+**返回值**
333-- `0`: 批量 RPC 调用本身成功466+ 
334-- 其他: RPC 调用失败(此时 `outResults` 中对应位置为错误码)467+- `0`:批量 RPC 调用本身成功。
468+- 其他:RPC 调用失败(此时 `outResults` 中对应位置为错误码)。
335 469 
336#### mmcc_batch_remove470#### mmcc_batch_remove
471+ 
337```c472```c
338int32_t mmcc_batch_remove(const char **keys, uint32_t keys_count, int32_t *remove_results, uint32_t flags);473int32_t mmcc_batch_remove(const char **keys, uint32_t keys_count, int32_t *remove_results, uint32_t flags);
339```474```
340-**功能**: 从 BM 中批量删除多个键。
341 475 
342-**参数**:476+**功能**
343-- `keys`: 要从 BM 中删除的键列表,每个键长度小于256个字节
344-- `keys_count`: 键的数量
345-- `remove_results`: 每个删除操作的结果
346-- `flags`: 操作标志
347 477 
348-**返回值**:478+从 BM 中批量删除多个键。
349-- `0`: 成功479+ 
350-- 其他: 失败480+**参数**
481+ 
482+- `keys`:要从 BM 中删除的键列表,每个键长度小于256个字节。
483+- `keys_count`:键的数量。
484+- `remove_results`:每个删除操作的结果。
485+- `flags`:操作标志。
486+ 
487+**返回值**
488+ 
489+- `0`:成功
490+- 其他:失败
351 491 
352#### mmcc_batch_exist492#### mmcc_batch_exist
493+ 
353```c494```c
354int32_t mmcc_batch_exist(const char **keys, uint32_t keys_count, int32_t *exist_results, uint32_t flags);495int32_t mmcc_batch_exist(const char **keys, uint32_t keys_count, int32_t *exist_results, uint32_t flags);
355```496```
356-**功能**: 判断多个键是否存在于 BM 中。
357 497 
358-**参数**:498+**功能**
359 499 
360-- `keys`: 数据键数组,每个键长度小256个字节500+判断多个键是否存在 BM 中。
361-- `keys_count`: 键的数量
362-- `exist_results`: BM 中键的存在状态列表
363-- `flags`: 可选标志,保留字段
364 501 
365-**返回值**:502+**参数**
366-- `0`: 成功503+ 
367-- 其他: 失败504+- `keys`:数据键数组,每个键长度小于256个字节。
505+- `keys_count`:键的数量。
506+- `exist_results`:BM 中键的存在状态列表。
507+- `flags`:可选标志,保留字段。
508+ 
509+**返回值**
510+ 
511+- `0`:成功
512+- 其他:失败
368 513 
369#### mmcc_batch_put514#### mmcc_batch_put
515+ 
370```c516```c
371int32_t mmcc_batch_put(const char **keys, uint32_t keys_count, const mmc_buffer *bufs,517int32_t mmcc_batch_put(const char **keys, uint32_t keys_count, const mmc_buffer *bufs,
372 mmc_put_options& options, uint32_t flags, int *results);518 mmc_put_options& options, uint32_t flags, int *results);
373```519```
374-**功能**: 批量将多个数据对象放入分布式内存缓存中。
375 520 
376-**参数**:521+**功能**
377-- `keys`: 数据对象的键数组,每个键长度小于256个字节
378-- `keys_count`: 数组中键的数量
379-- `bufs`: 要放入的数据缓冲区数组
380-- `options`: 批量放置操作的选项
381-- `flags`: 可选标志,保留字段
382-- `results`: 每个放置操作的结果
383 522 
384-**返回值**:523+批量将多个数据对象放入分布式内存缓存中。
385-- `0`: 成功524+ 
386-- 其他: 失败525+**参数**
526+ 
527+- `keys`:数据对象的键数组,每个键长度小于256个字节。
528+- `keys_count`:数组中键的数量。
529+- `bufs`:要放入的数据缓冲区数组。
530+- `options`:批量放置操作的选项。
531+- `flags`:可选标志,保留字段。
532+- `results`:每个放置操作的结果。
533+ 
534+**返回值**
535+ 
536+- `0`:成功
537+- 其他:失败
387 538 
388#### mmcc_batch_get539#### mmcc_batch_get
540+ 
389```c541```c
390int32_t mmcc_batch_get(const char **keys, uint32_t keys_count, mmc_buffer *bufs, uint32_t flags, int *results);542int32_t mmcc_batch_get(const char **keys, uint32_t keys_count, mmc_buffer *bufs, uint32_t flags, int *results);
391```543```
392-**功能**: 批量从分布式内存缓存中获取多个数据对象。
393 544 
394-**参数**:545+**功能**
395-- `keys`: 数据对象的键数组,每个键长度小于256个字节
396-- `keys_count`: 数组中键的数量
397-- `bufs`: 存储检索数据的数据缓冲区数组
398-- `flags`: 可选标志,保留字段
399-- `results`: 每个获取操作的结果
400 546 
401-**返回值**:547+批量从分布式内存缓存中获取多个数据对象。
402-- `0`: 成功548+ 
403-- 其他: 失败549+**参数**
550+ 
551+- `keys`:数据对象的键数组,每个键长度小于256个字节。
552+- `keys_count`:数组中键的数量。
553+- `bufs`:存储检索数据的数据缓冲区数组。
554+- `flags`:可选标志,保留字段。
555+- `results`:每个获取操作的结果。
556+ 
557+**返回值**
558+ 
559+- `0`:成功
560+- 其他:失败
404 561 
405### 5. 日志设置接口562### 5. 日志设置接口
406 563 
407#### mmc_set_extern_logger564#### mmc_set_extern_logger
565+ 
408```c566```c
409int32_t mmc_set_extern_logger(void (*func)(int level, const char *msg));567int32_t mmc_set_extern_logger(void (*func)(int level, const char *msg));
410```568```
411-**功能**: 设置外部日志函数,用户可以设置自定义的日志记录函数。在自定义的日志记录函数中,用户可以使用统一的日志工具,这样日志消息就可以写入与调用者相同的日志文件中。如果未设置,日志消息将被打印到标准输出。569+ 
570+**功能**
571+ 
572+设置外部日志函数,用户可以设置自定义的日志记录函数。在自定义的日志记录函数中,用户可以使用统一的日志工具,这样日志消息就可以写入与调用者相同的日志文件中。如果未设置,日志消息将被打印到标准输出。
412 573 
413日志级别说明:574日志级别说明:
414-- `0`: DEBUG
415-- `1`: INFO
416-- `2`: WARN
417-- `3`: ERROR
418 575 
419-**参数**:576+- `0`:DEBUG
420-- `func`: 外部日志记录函数577+- `1`:INFO
578+- `2`:WARN
579+- `3`:ERROR
421 580 
422-**返回值**:581+**参数**
423-- `0`: 成功582+ 
424-- 其他: 失败583+`func`:外部日志记录函数。
584+ 
585+**返回值**
586+ 
587+- `0`:成功
588+- 其他:失败
425 589 
426#### mmc_set_log_level590#### mmc_set_log_level
591+ 
427```c592```c
428int32_t mmc_set_log_level(int level);593int32_t mmc_set_log_level(int level);
429```594```
430-**功能**: 设置日志打印级别。
431 595 
432-**参数**:596+**功能**
433-- `level`: 日志级别,0:debug 1:info 2:warn 3:error
434 597 
435-**返回值**:598+设置日志打印级别。
436-- `0`: 成功599+ 
437-- 其他: 失败600+**参数**
601+ 
602+`level`:日志级别。
603+ 
604+- 0:debug
605+- 1:info
606+- 2:warn
607+- 3:error
608+ 
609+**返回值**
610+ 
611+- `0`:成功
612+- 其他:失败
438 613 
439### smem_bm_copy_type 枚举类型614### smem_bm_copy_type 枚举类型
440 615 
441用于指定数据拷贝方向的枚举类型:616用于指定数据拷贝方向的枚举类型:
442-- `SMEMB_COPY_L2G` (0): 从卡上内存到全局内存617+ 
443-- `SMEMB_COPY_G2L` (1): 全局内存到卡上内存618+- `SMEMB_COPY_L2G` (0)卡上内存到全局内存
444-- `SMEMB_COPY_G2H` (2): 从全局内存到主机内存619+- `SMEMB_COPY_G2L` (1)从全局内存到卡上内存
445-- `SMEMB_COPY_H2G` (3): 主机内存到全局内存620+- `SMEMB_COPY_G2H` (2)全局内存到主机内存
446-- `SMEMB_COPY_L2GH` (4): 卡上内存到全局主机内存621+- `SMEMB_COPY_H2G` (3)主机内存到全局内存
447-- `SMEMB_COPY_GH2L` (5): 从全局主机内存到卡上内存622+- `SMEMB_COPY_L2GH` (4)卡上内存到全局主机内存
448-- `SMEMB_COPY_GH2H` (6): 从全局主机内存到主机内存623+- `SMEMB_COPY_GH2L` (5)从全局主机内存到卡上内存
449-- `SMEMB_COPY_H2GH` (7): 从主机内存到全局主机内存624+- `SMEMB_COPY_GH2H` (6)全局主机内存到主机内存
450-- `SMEMB_COPY_G2G` (8): 全局内存到全局内存625+- `SMEMB_COPY_H2GH` (7)主机内存到全局主机内存
451-- `SMEMB_COPY_AUTO` (9): 自动选择数据拷贝方向626+- `SMEMB_COPY_G2G` (8):从全局内存到全局内存。
627+- `SMEMB_COPY_AUTO` (9):自动选择数据拷贝方向。
452 628 
453## 数据结构629## 数据结构
454 630 
455### mmc_client_config_t631### mmc_client_config_t
632+ 
456客户端配置结构体,包含以下字段:633客户端配置结构体,包含以下字段:
457-- `discoveryURL`: 发现服务URL634+ 
458-- `rankId`: Rank ID635+- `discoveryURL`:发现服务URL。
459-- `rpcRetryTimeOut`: rpc重试超时时间636+- `rankId`:Rank ID。
460-- `timeOut`: 超时时间637+- `rpcRetryTimeOut`:rpc重试超时时间
461-- `readThreadPoolNum`: 读线程池线程数638+- `timeOut`:超时时间。
462-- `aggregateIO`: 是否聚合IO,默认false639+- `readThreadPoolNum`:读线程池线程数。
463-- `writeThreadPoolNum`: 写线程池线程数640+- `aggregateIO`:是否聚合IO,默认false。
464-- `logLevel`: 日志级别641+- `writeThreadPoolNum`:写线程池线程数。
465-- `logFunc`: 外部日志函数642+- `logLevel`日志级别。
466-- `tlsConfig`: TLS配置643+- `logFunc`:外部日志函数。
644+- `tlsConfig`:TLS配置。
467 645 
468### ReplicateConfig646### ReplicateConfig
647+ 
469客户端配置结构体,包含以下字段:648客户端配置结构体,包含以下字段:
470-- `replicaNum`: 副本数,最大为8,默认为1649+ 
471-- `preferredLocalServiceIDs`: 强制分配的实例id列表列表小必须小于或等于replicaNum650+- `replicaNum`:副本数为8,默认为1。
651+- `preferredLocalServiceIDs`:强制分配的实例id列表,列表大小必须小于或等于replicaNum。
472 652 
473### mmc_meta_service_config_t653### mmc_meta_service_config_t
654+ 
474元数据服务配置结构体,包含以下字段:655元数据服务配置结构体,包含以下字段:
475-- `discoveryURL`: 发现服务URL656+ 
476-- `configStoreURL`: config store URL657+- `discoveryURL`:发现服务URL
477-- `httpURL`: http服务URL658+- `configStoreURL`:config store URL
478-- `haEnable`: 是否使能高可用659+- `httpURL`:http服务URL。
479-- `logLevel`: 日志级别660+- `haEnable`:是否使能高可用。
480-- `logPath`: 日志文件保存路径661+- `logLevel`日志级别。
481-- `logRotationFileSize`: 轮转日志文件大小662+- `logPath`日志文件保存路径。
482-- `logRotationFileCount`: 轮转日志文件个数663+- `logRotationFileSize`轮转日志文件大小。
483-- `evictThresholdHigh`: 高水位驱逐阈值664+- `logRotationFileCount`:轮转日志文件个数。
484-- `evictThresholdLow`: 低水位驱逐阈值665+- `evictThresholdHigh`:高水位驱逐阈值
485-- `accTlsConfig`: 元数据服务TLS配置666+- `evictThresholdLow`:低水位驱逐阈值。
486-- `configStoreTlsConfig`: config store的TLS配置667+- `accTlsConfig`:元数据服务TLS配置
487-- `metricsTlsConfig`: metrics HTTP 服务 mTLS 配置668+- `configStoreTlsConfig`:config storeTLS配置
669+- `metricsTlsConfig`:metrics HTTP 服务的 mTLS 配置。
488 670 
489### mmc_local_service_config_t671### mmc_local_service_config_t
672+ 
490本地服务配置结构体,包含以下字段:673本地服务配置结构体,包含以下字段:
491-- `discoveryURL`: 发现服务URL674+ 
492-- `deviceId`: 设备ID675+- `discoveryURL`:发现服务URL。
493-- `rankId`: BM全局统一编号676+- `deviceId`:设备ID。
494-- `worldSize`: 本地服务的总数677+- `rankId`:BM全局统一编号。
495-- `bmIpPort`: BM IP端口678+- `worldSize`:本地服务的总数。
496-- `bmHcomUrl`: BM HCOM URL679+- `bmIpPort`BM IP端口。
497-- `createId`: 创建ID680+- `bmHcomUrl`:BM HCOM URL。
498-- `dataOpType`: 数据操作类型681+- `createId`:创建ID。
499-- `localDRAMSize`: 本地DRAM大小682+- `dataOpType`:数据操作类型。
500-- `localHBMSize`: 本地HBM大小683+- `localDRAMSize`本地DRAM大小
501-- `flags`: 标志684+- `localHBMSize`:本地HBM大小。
502-- `accTlsConfig`: 本地服务的TLS配置685+- `flags`:标志。
503-- `logLevel`: 日志级别686+- `accTlsConfig`:本地服务的TLS配置。
504-- `logFunc`: 外部日志函数687+- `logLevel`日志级别。
505-- `hcomTlsConfig`: 本地服务的TLS配置688+- `logFunc`:外部日志函数。
506-- `configStoreTlsConfig`: config store的TLS配置689+- `hcomTlsConfig`:本地服务的TLS配置
690+- `configStoreTlsConfig`:config store的TLS配置。
507 691 
508### mmc_buffer692### mmc_buffer
693+ 
509内存缓冲区结构体,包含内存地址、类型和长度信息。694内存缓冲区结构体,包含内存地址、类型和长度信息。
510-- `addr`: 内存地址695+ 
511-- `type`: 介质类型,参考MediaType696+- `addr`:内存地址。
512-- `offset`: 偏移697+- `type`:介质类型,参考MediaType。
513-- `len`: 缓冲区长度698+- `offset`:偏移。
699+- `len`:缓冲区长度。
514 700 
515### mmc_put_options701### mmc_put_options
702+ 
516放置操作选项,包含介质类型和亲和策略。703放置操作选项,包含介质类型和亲和策略。
517-- `mediaType`: 介质类型704+ 
518-- `policy`: 亲和策略705+- `mediaType`:介质类型。
519-- `replicaNum`: 副本数,最大支持8副本706+- `policy`:亲和策略。
520-- `preferredLocalServiceIDs`: 优先地服务ID707+- `replicaNum`:副数,最大支持8副本。
708+- `preferredLocalServiceIDs`:优先本地服务ID。
521 709 
522### mmc_data_info710### mmc_data_info
711+ 
523数据信息结构体,包含大小、保护标志、blob数量和有效性标志。712数据信息结构体,包含大小、保护标志、blob数量和有效性标志。
524-- `size`: 数据大小713+ 
525-- `prot`: 保护标志714+- `size`:数据大小。
526-- `numBlobs`: blob数量715+- `prot`:保护标志。
527-- `valid`: 有效性标志716+- `numBlobs`:blob数量。
528-- `ranks`: 各blob所在设备列表717+- `valid`:有效性标志。
529-- `types`: 各blob所在介质类型718+- `ranks`各blob所在设备列表。
719+- `types`:各blob所在介质类型。
530 720 
531### mmc_tls_config721### mmc_tls_config
722+ 
532TLS配置结构体,包含以下字段:723TLS配置结构体,包含以下字段:
533-- `tlsEnable`: TLS启用标志724+ 
534-- `caPath`: 根证书文件路径725+- `tlsEnable`:TLS启用标志。
535-- `crlPath`: 证书吊销列表文件路径726+- `caPath`:根证书文件路径
536-- `certPath`: 证书文件路径727+- `crlPath`证书吊销列表文件路径
537-- `keyPath`: 私钥文件路径728+- `certPath`:证书文件路径
538-- `keyPassPath`: 私钥加密密码(口令)文件路径729+- `keyPath`私钥文件路径
539-- `packagePath`: openssl动态库路径730+- `keyPassPath`:私钥加密密码(口令)文件路径
540-- `decrypterLibPath`: 自定义口令解密算法动态库路径731+- `packagePath`:openssl动态库路径
732+- `decrypterLibPath`:自定义口令解密算法动态库路径。
541 733 
542## 错误码734## 错误码
543 735 
@@ -572,6 +764,6 @@ TLS配置结构体,包含以下字段:
572 764 
573## 注意事项765## 注意事项
574 766 
575-- 推荐调用顺序:`mmc_setup` -> `mmc_init` -> 数据读写接口 -> `mmc_uninit`767+- 推荐调用顺序:`mmc_setup` -> `mmc_init` -> 数据读写接口 -> `mmc_uninit`
576-- 所有键的长度必须小于256个字节768+- 所有键的长度必须小于256个字节
577-- 批量操作可以提高处理效率769+- 批量操作可以提高处理效率
Rdoc/memcache_config.mddocs/memcache_config.md+5-5
@@ -1,12 +1,12 @@
1-## MemCache Configs1+# MemCache Configs
2 2 
3-#### MetaService Config3+## MetaService Config
4 4 
5| key | value type | requirement | default | valid range | description |5| key | value type | requirement | default | valid range | description |
6|------------------------------------------------------|------------|-------------|--------------------------|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|6|------------------------------------------------------|------------|-------------|--------------------------|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
7| ock.mmc.meta_service_url | string | optional | tcp://127.0.0.1:5000 | tcp://\<host>\<port> | host supports ip and domain, port in [1025, 65535] |7| ock.mmc.meta_service_url | string | optional | tcp://127.0.0.1:5000 | tcp://\<host>\<port> | host supports ip and domain, port in [1025, 65535] |
8| ock.mmc.meta_service.config_store_url | string | optional | tcp://127.0.0.1:6000 | tcp://\<host>\<port> | host supports ip and domain, port in [1025, 65535] |8| ock.mmc.meta_service.config_store_url | string | optional | tcp://127.0.0.1:6000 | tcp://\<host>\<port> | host supports ip and domain, port in [1025, 65535] |
9-| ock.mmc.meta_service.metrics_url | string | optional | http://127.0.0.1:8000 | <protocol>://<host>:<port> | protocol is http or https, host supports ip and domain, port in [1025, 65535] |9+| ock.mmc.meta_service.metrics_url | string | optional | http://127.0.0.1:8000 | \<protocol>://\<host>:\<port>| protocol is http or https, host supports ip and domain, port in [1025, 65535] |
10| ock.mmc.meta.ha.enable | bool | optional | false | true/false | enable meta service master/backup HA in k8s cluster |10| ock.mmc.meta.ha.enable | bool | optional | false | true/false | enable meta service master/backup HA in k8s cluster |
11| ock.mmc.meta.backup.enable | bool | optional | false | true/false | enable meta service backup |11| ock.mmc.meta.backup.enable | bool | optional | false | true/false | enable meta service backup |
12| ock.mmc.meta_service.metrics_report_interval_seconds | integer | optional | 30 | [0, 86400] | metrics summary printing interval in seconds, 0 disables periodic metrics printing |12| ock.mmc.meta_service.metrics_report_interval_seconds | integer | optional | 30 | [0, 86400] | metrics summary printing interval in seconds, 0 disables periodic metrics printing |
@@ -48,7 +48,7 @@
48| ock.mmc.metrics.tls.package.path | string | optional | | 0 <= len < 256 | openssl dynamic libraries path for metrics HTTP |48| ock.mmc.metrics.tls.package.path | string | optional | | 0 <= len < 256 | openssl dynamic libraries path for metrics HTTP |
49| ock.mmc.metrics.tls.decrypter.path | string | optional | | 0 <= len < 256 | the keypass decrypter library path for metrics HTTP (leave empty if the password is not encrypted) |49| ock.mmc.metrics.tls.decrypter.path | string | optional | | 0 <= len < 256 | the keypass decrypter library path for metrics HTTP (leave empty if the password is not encrypted) |
50 50 
51-#### LocalService Config51+## LocalService Config
52 52 
53| key | value type | requirement | default | valid range | description |53| key | value type | requirement | default | valid range | description |
54|------------------------------------------------|------------|--------------|----------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|54|------------------------------------------------|------------|--------------|----------------------|---------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -107,7 +107,7 @@
107| ock.mmc.dynamic_config.enable | bool | optional | false | true/false | Enable dynamic config polling. When enabled, LocalService periodically checks the config file for `meta_service_url` and `config_store_url` changes and lazily updates reconnection targets without restart |107| ock.mmc.dynamic_config.enable | bool | optional | false | true/false | Enable dynamic config polling. When enabled, LocalService periodically checks the config file for `meta_service_url` and `config_store_url` changes and lazily updates reconnection targets without restart |
108| ock.mmc.dynamic_config.interval | integer | optional | 5 | [1, 300] | Polling interval in seconds for dynamic config file check |108| ock.mmc.dynamic_config.interval | integer | optional | 5 | [1, 300] | Polling interval in seconds for dynamic config file check |
109 109 
110-#### KV Events Config110+## KV Events Config
111 111 
112| key | value type | requirement | default | valid range | description |112| key | value type | requirement | default | valid range | description |
113|----------------------------------|------------|-------------|---------|----------------------|---------------------------------------------------------------------------|113|----------------------------------|------------|-------------|---------|----------------------|---------------------------------------------------------------------------|
Rdoc/memcache_python_api.mddocs/memcache_python_api.md+1200-1111
Rdoc/memcache_restful_api.mddocs/memcache_restful_api.md+177-153
Rdoc/memcache_ssd_usage.mddocs/memcache_ssd_usage.md+3-2
Rdoc/source/memcache_a2.pngdocs/source/memcache_a2.png+0-0
Rdoc/source/memcache_a3.pngdocs/source/memcache_a3.png+0-0
Rdoc/source/memcache_architecture.pngdocs/source/memcache_architecture.png+0-0
Rdoc/source/memcache_icon.pngdocs/source/memcache_icon.png+0-0
Rdoc/source/memcache_metaservice_ha.pngdocs/source/memcache_metaservice_ha.png+0-0
Rdoc/source/memcache_rh2d.pngdocs/source/memcache_rh2d.png+0-0