use crate::constants::DEFAULT_METADATA_PAGE_BYTES;
const MIB: u64 = 1024 * 1024;
const DEFAULT_WASM_CACHE_BYTES: u64 = 64 * MIB;
const DEFAULT_NATIVE_CACHE_BYTES: u64 = 128 * MIB;
const DEFAULT_NATIVE_AUTO_WORKERS: usize = 6;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CacheLimit {
Auto,
Bytes(u64),
Disabled,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LockboxOptions {
pub cache_limit: CacheLimit,
pub workload_profile: WorkloadProfile,
pub worker_policy: WorkerPolicy,
}
impl Default for LockboxOptions {
fn default() -> Self {
Self {
cache_limit: CacheLimit::Auto,
workload_profile: WorkloadProfile::Interactive,
worker_policy: WorkerPolicy::Auto,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WorkerPolicy {
Auto,
Single,
Threads(usize),
}
impl WorkerPolicy {
pub(crate) fn effective_jobs(self) -> usize {
match self {
Self::Single => 1,
Self::Threads(jobs) => jobs.max(1),
Self::Auto => {
if cfg!(target_arch = "wasm32") {
1
} else {
std::thread::available_parallelism()
.map(usize::from)
.unwrap_or(1)
.clamp(1, DEFAULT_NATIVE_AUTO_WORKERS)
}
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WorkloadProfile {
Interactive,
BulkImport,
ReadMostly,
ExtractMany,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CacheStats {
pub limit_bytes: u64,
pub used_bytes: u64,
pub entries: usize,
pub hits: u64,
pub misses: u64,
}
pub(crate) fn cache_limit_bytes(limit: CacheLimit) -> u64 {
match limit {
CacheLimit::Disabled => 0,
CacheLimit::Bytes(bytes) => bytes,
CacheLimit::Auto => auto_cache_limit_bytes(),
}
}
pub(crate) fn auto_cache_limit_bytes() -> u64 {
if cfg!(target_arch = "wasm32") {
return DEFAULT_WASM_CACHE_BYTES;
}
DEFAULT_NATIVE_CACHE_BYTES.max(minimum_useful_cache_bytes())
}
fn minimum_useful_cache_bytes() -> u64 {
let by_page = (DEFAULT_METADATA_PAGE_BYTES as u64).saturating_mul(64);
by_page.max(64 * MIB)
}
#[cfg(test)]
mod tests {
use super::{auto_cache_limit_bytes, MIB};
#[test]
fn automatic_cache_limit_uses_conservative_platform_default() {
let expected = if cfg!(target_arch = "wasm32") {
64 * MIB
} else {
128 * MIB
};
assert_eq!(auto_cache_limit_bytes(), expected);
}
}