cyfs_util/cache/
named_data_cache.rs

1use cyfs_base::*;
2
3use async_trait::async_trait;
4use int_enum::IntEnum;
5
6#[derive(Debug, Clone)]
7pub struct FileDirRef {
8    pub dir_id: DirId,
9    pub inner_path: String,
10}
11
12#[derive(Debug)]
13pub struct FileCacheData {
14    pub hash: String,
15
16    pub file_id: FileId,
17
18    pub length: u64,
19
20    pub flags: u32,
21
22    pub owner: Option<ObjectId>,
23
24    // 可选,关联的quickhash
25    pub quick_hash: Option<Vec<String>>,
26
27    // 可选,关联的dirs
28    pub dirs: Option<Vec<FileDirRef>>,
29}
30
31pub struct InsertFileRequest {
32    pub file_id: FileId,
33
34    // 需要插入的file对象
35    pub file: File,
36
37    pub flags: u32,
38
39    // 关联的quickhash
40    pub quick_hash: Option<Vec<String>>,
41
42    // 关联的dirs信息
43    pub dirs: Option<Vec<FileDirRef>>,
44}
45
46pub struct RemoveFileRequest {
47    pub file_id: FileId,
48}
49
50// quickhash相关操作
51pub struct FileAddQuickhashRequest {
52    pub hash: String,
53
54    // TODO 是否支持以file_id为键值来更新?
55    // pub file_id: FileId,
56    pub quick_hash: Vec<String>,
57}
58
59pub struct FileUpdateQuickhashRequest {
60    pub hash: String,
61
62    // TODO 是否支持以file_id为键值来更新?
63    // pub file_id: FileId,
64    pub add_list: Vec<String>,
65    pub remove_list: Vec<String>,
66}
67
68// GetFileByHashRequest的标志位,表示是不是要获取对应的信息
69pub const NDC_FILE_REQUEST_FLAG_QUICK_HASN: u32 = 0x01 << 1;
70pub const NDC_FILE_REQUEST_FLAG_REF_DIRS: u32 = 0x01 << 2;
71
72pub struct GetFileByHashRequest {
73    pub hash: String,
74
75    pub flags: u32,
76}
77
78pub struct GetFileByFileIdRequest {
79    pub file_id: FileId,
80
81    pub flags: u32,
82}
83
84pub struct GetFileByQuickHashRequest {
85    pub quick_hash: String,
86    pub length: u64,
87    pub flags: u32,
88}
89
90pub struct GetFileByChunkRequest {
91    pub chunk_id: ChunkId,
92    pub flags: u32,
93}
94
95pub struct GetDirByFileRequest {
96    pub file_id: FileId,
97    pub flags: u32,
98}
99
100// chunk的状态
101// chunk和object的关系
102#[repr(u8)]
103#[derive(Debug, Clone, Copy, Eq, PartialEq, IntEnum)]
104pub enum ChunkObjectRelation {
105    Unknown = 0,
106    FileBody = 1,
107    DirMeta = 2,
108}
109
110impl Into<u8> for ChunkObjectRelation {
111    fn into(self) -> u8 {
112        unsafe { std::mem::transmute(self as u8) }
113    }
114}
115
116impl From<u8> for ChunkObjectRelation {
117    fn from(code: u8) -> Self {
118        match ChunkObjectRelation::from_int(code) {
119            Ok(code) => code,
120            Err(e) => {
121                error!("unknown ChunkObjectRelation code: {} {}", code, e);
122                ChunkObjectRelation::Unknown
123            }
124        }
125    }
126}
127
128// chunk关联的对象
129#[derive(Debug, Clone)]
130pub struct ChunkObjectRef {
131    pub object_id: ObjectId,
132    pub relation: ChunkObjectRelation,
133}
134
135//#[derive(Clone)]
136pub struct InsertChunkRequest {
137    pub chunk_id: ChunkId,
138
139    pub state: ChunkState,
140
141    // 有关系的对象
142    pub ref_objects: Option<Vec<ChunkObjectRef>>,
143
144    // 所属的trans_session列表
145    pub trans_sessions: Option<Vec<String>>,
146
147    pub flags: u32,
148}
149
150pub struct RemoveChunkRequest {
151    pub chunk_id: ChunkId,
152}
153
154// GetChunkRequest的额外查询信息
155pub const NDC_CHUNK_REQUEST_FLAG_TRANS_SESSIONS: u32 = 0x01 << 1;
156pub const NDC_CHUNK_REQUEST_FLAG_REF_OBJECTS: u32 = 0x01 << 2;
157
158pub struct GetChunkRequest {
159    pub chunk_id: ChunkId,
160    pub flags: u32,
161}
162
163pub struct ExistsChunkRequest {
164    pub chunk_list: Vec<ChunkId>,
165    pub states: Vec<ChunkState>,
166}
167
168pub struct ChunkCacheData {
169    pub chunk_id: ChunkId,
170
171    pub state: ChunkState,
172    pub flags: u32,
173
174    pub insert_time: u64,
175    pub update_time: u64,
176    pub last_access_time: u64,
177
178    pub trans_sessions: Option<Vec<String>>,
179    pub ref_objects: Option<Vec<ChunkObjectRef>>,
180}
181
182pub struct UpdateChunkStateRequest {
183    pub chunk_id: ChunkId,
184
185    // 如果指定了当前状态,那么只有在匹配情况下才更新到目标状态
186    pub current_state: Option<ChunkState>,
187
188    pub state: ChunkState,
189}
190
191pub struct UpdateChunkTransSessionRequest {
192    pub chunk_id: ChunkId,
193
194    pub add_list: Vec<String>,
195    pub remove_list: Vec<String>,
196}
197
198pub struct UpdateChunkRefsRequest {
199    pub chunk_id: ChunkId,
200
201    pub add_list: Vec<ChunkObjectRef>,
202    pub remove_list: Vec<ChunkObjectRef>,
203}
204
205pub struct GetChunkTransSessionsRequest {
206    pub chunk_id: ChunkId,
207}
208
209pub struct GetChunkTransSessionsResponse {
210    pub chunk_id: ChunkId,
211    pub trans_sessions: Option<Vec<String>>,
212}
213
214pub struct GetChunkRefObjectsRequest {
215    pub chunk_id: ChunkId,
216    pub relation: Option<ChunkObjectRelation>,
217}
218
219pub struct GetChunkRefObjectsResponse {
220    pub chunk_id: ChunkId,
221    pub ref_objects: Option<ChunkObjectRef>,
222}
223
224#[derive(Clone, Debug)]
225pub struct SelectChunkFilter {
226    pub state: Option<ChunkState>,
227}
228
229#[derive(Debug, Clone)]
230pub struct SelectChunkOption {
231    // The number of readings per page
232    pub page_size: usize,
233
234    // The page number currently read, starting from 0
235    pub page_index: usize,
236}
237
238impl Default for SelectChunkOption {
239    fn default() -> Self {
240        Self {
241            page_size: 256,
242            page_index: 0,
243        }
244    }
245}
246
247#[derive(Clone, Debug)]
248pub struct SelectChunkRequest {
249    // filters
250    pub filter: SelectChunkFilter,
251
252    // configs
253    pub opt: SelectChunkOption,
254}
255
256#[derive(Debug)]
257pub struct SelectChunkData {
258    pub chunk_id: ChunkId,
259}
260
261#[derive(Debug)]
262pub struct SelectChunkResponse {
263    pub list: Vec<SelectChunkData>,
264}
265
266#[derive(Debug, Clone)]
267pub struct NamedDataCacheStat {
268    // chunks count
269    pub count: u64,
270
271    pub storage_size: u64,
272}
273
274#[async_trait]
275pub trait NamedDataCache: Sync + Send + 'static {
276    fn clone(&self) -> Box<dyn NamedDataCache>;
277
278    // file related interface
279    async fn insert_file(&self, req: &InsertFileRequest) -> BuckyResult<()>;
280    async fn remove_file(&self, req: &RemoveFileRequest) -> BuckyResult<usize>;
281
282    async fn file_update_quick_hash(&self, req: &FileUpdateQuickhashRequest) -> BuckyResult<()>;
283
284    async fn get_file_by_hash(
285        &self,
286        req: &GetFileByHashRequest,
287    ) -> BuckyResult<Option<FileCacheData>>;
288    async fn get_file_by_file_id(
289        &self,
290        req: &GetFileByFileIdRequest,
291    ) -> BuckyResult<Option<FileCacheData>>;
292    async fn get_files_by_quick_hash(
293        &self,
294        req: &GetFileByQuickHashRequest,
295    ) -> BuckyResult<Vec<FileCacheData>>;
296    async fn get_files_by_chunk(
297        &self,
298        req: &GetFileByChunkRequest,
299    ) -> BuckyResult<Vec<FileCacheData>>;
300    async fn get_dirs_by_file(&self, req: &GetDirByFileRequest) -> BuckyResult<Vec<FileDirRef>>;
301
302    // chunk related interface
303    async fn insert_chunk(&self, req: &InsertChunkRequest) -> BuckyResult<()>;
304    async fn remove_chunk(&self, req: &RemoveChunkRequest) -> BuckyResult<usize>;
305
306    async fn update_chunk_state(&self, req: &UpdateChunkStateRequest) -> BuckyResult<ChunkState>;
307    //async fn update_chunk_trans_session(&self, req: &UpdateChunkTransSessionRequest) -> BuckyResult<()>;
308    async fn update_chunk_ref_objects(&self, req: &UpdateChunkRefsRequest) -> BuckyResult<()>;
309
310    async fn exists_chunks(&self, req: &ExistsChunkRequest) -> BuckyResult<Vec<bool>>;
311
312    async fn get_chunk(&self, req: &GetChunkRequest) -> BuckyResult<Option<ChunkCacheData>>;
313    async fn get_chunks(
314        &self,
315        req: &Vec<GetChunkRequest>,
316    ) -> BuckyResult<Vec<Option<ChunkCacheData>>>;
317    //async fn get_chunk_trans_sessions(&self, req: &GetChunkTransSessionsRequest) -> BuckyResult<GetChunkTransSessionsResponse>;
318    async fn get_chunk_ref_objects(
319        &self,
320        req: &GetChunkRefObjectsRequest,
321    ) -> BuckyResult<Vec<ChunkObjectRef>>;
322
323    // for internal use only
324    async fn select_chunk(&self, req: &SelectChunkRequest) -> BuckyResult<SelectChunkResponse>;
325    async fn stat(&self) -> BuckyResult<NamedDataCacheStat>;
326}
327
328use std::sync::Arc;
329
330pub type NamedDataCacheRef = Arc<Box<dyn NamedDataCache>>;