@@ -73,7 +73,6 @@ database:
7373- **依赖注入**:VFS 构造函数接受 ` MetaStore` 实例,解耦具体实现
7474- **持久化操作**:写操作(如 `mkdir_p`、`create_file`)会持久化至后端
7575- **延迟加载**:`readdir` 按需加载目录内容
76- - **缓存集成**:内存 `Namespace` 作为直写缓存层
7776
7877# ## 工具与示例
7978
@@ -89,6 +88,47 @@ database:
8988 cargo run --example persistence_demo -- --config config.yaml
9089 ` ` `
9190
91+ # ## 元数据缓存实现
92+
93+ `MetaClient`作为元数据客户端代理,实现了一个高性能、高并发、支持 TTL/LRU 策略的元数据缓存层,旨在加速底层元数据存储(MetaStore)的访问性能。其核心设计目标是提供快速的路径解析、Inode 属性查询和目录列表读取,同时通过一套高效的缓存失效机制来保证数据的一致性。
94+
95+ # ### 2. 核心架构
96+
97+ 缓存系统采用分层、多策略的复合架构,主要由以下三个核心组件构成:
98+
99+ - **Inode 缓存 (InodeCache):** 负责缓存文件和目录的元数据属性(FileAttr)、父子关系及目录内容。
100+ - **路径解析缓存 (Path Cache & PathTrie):** 负责缓存从绝对路径到 Inode 编号的映射关系。
101+ - **缓存失效机制:** 一套基于前缀树和反向索引的精确、高效的缓存失效策略。
102+
103+ # ### 3. 关键组件详解
104+
105+ **3.1. Inode 缓存 (InodeCache)**
106+
107+ - **双层存储模型:** 采用 `Moka Cache` 和 `DashMap` 结合的双层设计。
108+ - **Moka:** 作为生命周期管理器,负责实现基于 TTL(存活时间)和 LRU(最近最少使用)的缓存淘汰策略。
109+ - **DashMap:** 作为主存储,提供对` InodeEntry `的高并发、分片锁读写访问,允许在不影响 Moka 内部结构的情况下对缓存项进行原地修改。
110+ - **状态化目录内容 (ChildrenState):** 通过` NotLoaded`、`Partial`、`Complete` 三种状态精确追踪目录内容的缓存状态,确保了只有从后端完整加载过的目录(Complete 状态)才会被用于响应 readdir 请求,有效避免了数据不完整问题。
111+ - **数据结构:** `InodeEntry` 封装了单个 Inode 的所有缓存信息,包括属性 (attr)、父节点指针 (parent) 和子节点列表 (children),均采用 Arc<RwLock<T>> 进行并发保护。
112+
113+ **3.2. 路径解析缓存**
114+
115+ 为实现高效的路径解析和失效,系统同时使用了两种数据结构:
116+
117+ - **直接路径缓存 (path_cache):** 一个基于 Moka 的 K-V 缓存,用于存储完整路径字符串到 Inode 编号的直接映射。它为已解析路径提供了 O(1) 的访问速度。
118+ - **路径前缀树 (PathTrie):** 一个专用于路径管理的前缀树.结构的核心优势在于支持**前缀匹配失效**。当一个目录被修改时(如重命名或删除),可以 O(depth) 的复杂度移除整个子树对应的所有路径缓存,相比于遍历扁平化缓存(O(N)),效率极高。
119+
120+ **3.3. 缓存失效策略**
121+
122+ 缓存失效是保证数据一致性的关键。本系统设计了一套精准、高效的失效流程:
123+
124+ 1. **反向索引 (inode_to_paths):** 维护一个从 Inode 到其所有路径的 DashMap 映射,可在 O(1) 时间内定位到特定 Inode 对应的所有路径。
125+ 2. **级联失效:** 当目录发生写操作时,触发 `invalidate_parent_path` 函数。
126+ 3. **执行流程:**
127+ a. 使用**反向索引**找到被修改目录的所有路径。
128+ b. 对每个路径,调用 **PathTrie::remove_by_prefix** 方法,原子性地移除该路径及其所有子孙路径。
129+ c. remove_by_prefix 返回所有被移除的路径-Inode 对。
130+ d. 遍历这些被移除的条目,从**直接路径缓存 (path_cache)** 和**反向索引 (inode_to_paths)** 中清理对应的数据,从而完成整个级联失效过程。
131+
92132# # TODO:
93133
94134# ## 高优先级(P0)
@@ -121,21 +161,14 @@ database:
121161cache:
122162 enabled: true
123163
124- # Cache capacity (number of entries)
125164 capacity:
126- attr: 10000 # File attributes cache
127- dentry: 10000 # Directory entry cache
165+ inode: 10000 # Inode metadata cache (includes attr, children, parent)
128166 path: 5000 # Path resolution cache
129- inode_to_path: 5000 # Reverse path cache
130- readdir: 1000 # Directory content cache
131167
132168 # Cache TTL (in seconds, supports decimal values)
133169 ttl:
134- attr_ttl: 10.0 # 10 seconds
135- dentry_ttl: 8.0 # 8 seconds
136- path_ttl: 10.0 # 10 seconds
137- inode_to_path_ttl: 10.0
138- readdir_ttl: 5.0 # 5 seconds (directory content cache)
170+ inode_ttl: 10.0 # 10 seconds for inode metadata
171+ path_ttl: 10.0 # 10 seconds for path resolution
139172
140173` ` `
141174
@@ -156,23 +189,16 @@ database:
156189cache:
157190 enabled: true
158191
159- # Cache capacity (number of entries)
160192 capacity:
161- attr: 10000 # File attributes cache
162- dentry: 10000 # Directory entry cache
193+ inode: 10000 # Inode metadata cache (includes attr, children, parent)
163194 path: 5000 # Path resolution cache
164- inode_to_path: 5000 # Reverse path cache
165- readdir: 1000 # Directory content cache
166195
167196 # Cache TTL (in seconds, supports decimal values)
168197 ttl:
169- attr_ttl: 10.0 # 10 seconds
170- dentry_ttl: 8.0 # 8 seconds
171- path_ttl: 10.0 # 10 seconds
172- inode_to_path_ttl: 10.0
173- readdir_ttl: 5.0 # 5 seconds (directory content cache)
198+ inode_ttl: 10.0 # 10 seconds for inode metadata
199+ path_ttl: 10.0 # 10 seconds for path resolution
174200` ` `
175201
176- 目前,本地数据库模式下,在挂载后的文件夹中,可以正常操作文件夹,包括重命名,删除,读写文件之类的操作。
202+ 目前,本地数据库模式下,在挂载后的文件夹中,可以正常操作文件夹,包括重命名,删除,读写文件之类的操作。
177203
178204运行scripts/cache_demo.sh 后可以在log中看到关于缓存命中、加入、移除等信息
0 commit comments