in chunk_cache/src/disk.rs [225:311]
fn initialize_state(cache_root: &PathBuf, capacity: u64) -> Result<CacheState, ChunkCacheError> {
let mut state = HashMap::new();
let mut total_bytes = 0;
let mut num_items = 0;
let max_num_bytes = 2 * capacity;
let Some(cache_root_readdir) = read_dir(cache_root)? else {
return Ok(CacheState::new(state, 0, 0));
};
// loop through cache root directory, first level containing "prefix" directories
// each of which may contain key directories with cache items
for key_prefix_dir in cache_root_readdir {
let Some(key_prefix_dir) = is_ok_dir(key_prefix_dir)? else {
continue;
};
let key_prefix_dir_name = key_prefix_dir.file_name();
if key_prefix_dir_name.as_encoded_bytes().len() != PREFIX_DIR_NAME_LEN {
debug!("prefix dir name len != {PREFIX_DIR_NAME_LEN}");
continue;
}
let Some(key_prefix_readdir) = read_dir(key_prefix_dir.path())? else {
continue;
};
// loop through key directories inside prefix directory
for key_dir in key_prefix_readdir {
let key_dir = match is_ok_dir(key_dir) {
Ok(Some(dirent)) => dirent,
Ok(None) => continue,
Err(e) => return Err(e),
};
let key_dir_name = key_dir.file_name();
// asserts that the prefix dir name is actually the prefix of this key dir
debug_assert_eq!(
key_dir_name.as_encoded_bytes()[..PREFIX_DIR_NAME_LEN].to_ascii_uppercase(),
key_prefix_dir_name.as_encoded_bytes().to_ascii_uppercase(),
"{key_dir_name:?}",
);
let key = match try_parse_key(key_dir_name.as_encoded_bytes()) {
Ok(key) => key,
Err(e) => {
debug!("failed to decoded a directory name as a key: {e}");
continue;
},
};
let mut items = Vec::new();
let key_readdir = match read_dir(key_dir.path()) {
Ok(Some(krd)) => krd,
Ok(None) => continue,
Err(e) => return Err(e),
};
// loop through cache items inside key directory
for item in key_readdir {
let cache_item = match try_parse_cache_file(item, capacity) {
Ok(Some(ci)) => ci,
Ok(None) => continue,
Err(e) => return Err(e),
};
total_bytes += cache_item.len;
num_items += 1;
items.push(VerificationCell::new_unverified(cache_item));
// if already filled capacity, stop iterating over cache items
if total_bytes >= max_num_bytes {
state.insert(key, items);
return Ok(CacheState::new(state, num_items, total_bytes));
}
}
if !items.is_empty() {
state.insert(key, items);
}
}
}
Ok(CacheState::new(state, num_items, total_bytes))
}