mountpoint_s3_fs/
data_cache.rs1mod cache_directory;
8mod disk_data_cache;
9mod express_data_cache;
10mod in_memory_data_cache;
11mod multilevel_cache;
12
13use async_trait::async_trait;
14use thiserror::Error;
15
16pub use crate::checksums::ChecksummedBytes;
17pub use crate::data_cache::cache_directory::ManagedCacheDir;
18pub use crate::data_cache::disk_data_cache::{CacheLimit, DiskDataCache, DiskDataCacheConfig};
19pub use crate::data_cache::express_data_cache::{ExpressDataCache, ExpressDataCacheConfig, build_prefix, get_s3_key};
20pub use crate::data_cache::in_memory_data_cache::InMemoryDataCache;
21pub use crate::data_cache::multilevel_cache::MultilevelDataCache;
22
23use crate::object::ObjectId;
24
25pub type BlockIndex = u64;
27
28#[derive(Debug, Error)]
30pub enum DataCacheError {
31 #[error("IO error when reading or writing from cache: {0}")]
32 IoFailure(#[source] anyhow::Error),
33 #[error("Block header was not valid: {0}")]
34 InvalidBlockHeader(String),
35 #[error("Block checksum was not valid")]
36 InvalidBlockChecksum,
37 #[error("Block content was not valid/readable")]
38 InvalidBlockContent,
39 #[error("Block offset does not match block index")]
40 InvalidBlockOffset,
41 #[error("Error while trying to evict cache content")]
42 EvictionFailure,
43}
44
45pub type DataCacheResult<Value> = Result<Value, DataCacheError>;
46
47#[async_trait]
52pub trait DataCache {
53 async fn get_block(
57 &self,
58 cache_key: &ObjectId,
59 block_idx: BlockIndex,
60 block_offset: u64,
61 object_size: usize,
62 ) -> DataCacheResult<Option<ChecksummedBytes>>;
63
64 async fn put_block(
66 &self,
67 cache_key: ObjectId,
68 block_idx: BlockIndex,
69 block_offset: u64,
70 bytes: ChecksummedBytes,
71 object_size: usize,
72 ) -> DataCacheResult<()>;
73
74 fn block_size(&self) -> u64;
76}
77
78#[derive(Debug, Default)]
83pub struct DataCacheConfig {
84 pub disk_cache_config: Option<DiskDataCacheConfig>,
85 pub express_cache_config: Option<ExpressDataCacheConfig>,
86}