in cachelib/rust/src/lrucache.rs [267:365]
fn init_cache_once(&mut self, _fb: FacebookInit, config: LruCacheConfig) -> Result<()> {
let mut cache_config = ffi::make_lru_allocator_config()?;
cache_config.pin_mut().setCacheSize(config.size);
match config.shrinker {
ShrinkerType::NoShrinker => {}
ShrinkerType::Container => {
if !ffi::enable_container_memory_monitor(cache_config.pin_mut())? {
return Err(ErrorKind::NotInContainer.into());
}
}
ShrinkerType::Config(shrinker) => {
let rebalancer = shrinker.strategy.get_strategy()?;
match shrinker.shrinker_type {
ShrinkMonitorType::FreeMemory {
max_free_mem_gib,
min_free_mem_gib,
} => {
ffi::enable_free_memory_monitor(
cache_config.pin_mut(),
shrinker.interval.into(),
shrinker.max_resize_per_iteration_percent,
shrinker.max_removed_percent,
min_free_mem_gib,
max_free_mem_gib,
rebalancer,
)?;
}
ShrinkMonitorType::ResidentSize {
max_process_size_gib,
min_process_size_gib,
} => {
ffi::enable_resident_memory_monitor(
cache_config.pin_mut(),
shrinker.interval.into(),
shrinker.max_resize_per_iteration_percent,
shrinker.max_removed_percent,
min_process_size_gib,
max_process_size_gib,
rebalancer,
)?;
}
}
}
};
if let Some(pool_rebalance) = config.pool_rebalance {
let rebalancer = pool_rebalance.strategy.get_strategy()?;
ffi::enable_pool_rebalancing(
cache_config.pin_mut(),
rebalancer,
pool_rebalance.interval.into(),
)?;
}
if let Some(pool_resize) = config.pool_resize {
let rebalancer = pool_resize.strategy.get_strategy()?;
ffi::enable_pool_resizing(
cache_config.pin_mut(),
rebalancer,
pool_resize.interval.into(),
pool_resize.slabs_per_iteration,
)?;
}
if let Some(AccessConfig {
bucket_power,
lock_power,
}) = config.access_config
{
ffi::set_access_config(cache_config.pin_mut(), bucket_power, lock_power)?;
}
if let Some(cache_name) = config.cache_name {
let_cxx_string!(name = cache_name);
cache_config.pin_mut().setCacheName(&name);
}
if let Some(addr) = config.base_address {
ffi::set_base_address(cache_config.pin_mut(), addr as usize)?;
}
if let Some(cache_directory) = config.cache_directory {
// If cache directory is enabled, create a persistent shared-memory cache.
let_cxx_string!(cache_directory = cache_directory.as_os_str().as_bytes());
ffi::enable_cache_persistence(cache_config.pin_mut(), cache_directory);
self.cache = ffi::make_shm_lru_allocator(cache_config)?;
} else {
let mut is_volatile = self.is_volatile.write().expect("lock poisoned");
*is_volatile = true;
self.cache = ffi::make_lru_allocator(cache_config)?;
}
if self.cache.is_null() {
Err(ErrorKind::CacheNotInitialized.into())
} else {
Ok(())
}
}