mod cache_directory;
mod disk_data_cache;
mod express_data_cache;
mod in_memory_data_cache;
mod multilevel_cache;
use async_trait::async_trait;
use thiserror::Error;
pub use crate::checksums::ChecksummedBytes;
pub use crate::data_cache::cache_directory::ManagedCacheDir;
pub use crate::data_cache::disk_data_cache::{
CacheLimit, DEFAULT_CACHE_MIN_AVAILABLE_RATIO, DiskDataCache, DiskDataCacheConfig,
};
pub use crate::data_cache::express_data_cache::{ExpressDataCache, ExpressDataCacheConfig, build_prefix, get_s3_key};
pub use crate::data_cache::in_memory_data_cache::InMemoryDataCache;
pub use crate::data_cache::multilevel_cache::MultilevelDataCache;
use crate::object::ObjectId;
pub type BlockIndex = u64;
#[derive(Debug, Error)]
pub enum DataCacheError {
#[error("IO error when reading or writing from cache: {0}")]
IoFailure(#[source] anyhow::Error),
#[error("Block header was not valid: {0}")]
InvalidBlockHeader(String),
#[error("Block checksum was not valid")]
InvalidBlockChecksum,
#[error("Block content was not valid/readable")]
InvalidBlockContent,
#[error("Block offset does not match block index")]
InvalidBlockOffset,
#[error("Error while trying to evict cache content")]
EvictionFailure,
}
pub type DataCacheResult<Value> = Result<Value, DataCacheError>;
#[async_trait]
pub trait DataCache {
async fn get_block(
&self,
cache_key: &ObjectId,
block_idx: BlockIndex,
block_offset: u64,
object_size: usize,
) -> DataCacheResult<Option<ChecksummedBytes>>;
async fn put_block(
&self,
cache_key: ObjectId,
block_idx: BlockIndex,
block_offset: u64,
bytes: ChecksummedBytes,
object_size: usize,
) -> DataCacheResult<()>;
fn block_size(&self) -> u64;
}
#[derive(Debug, Default)]
pub struct DataCacheConfig {
pub disk_cache_config: Option<DiskDataCacheConfig>,
pub express_cache_config: Option<ExpressDataCacheConfig>,
}