in chunk_cache/src/disk.rs [667:724]
fn try_parse_cache_file(file_result: io::Result<DirEntry>, capacity: u64) -> OptionResult<CacheItem, ChunkCacheError> {
let item = match file_result {
Ok(item) => item,
Err(e) => {
if e.kind() == ErrorKind::NotFound {
return Ok(None);
}
return Err(e.into());
},
};
let md = match item.metadata() {
Ok(md) => md,
Err(e) => {
if e.kind() == ErrorKind::NotFound {
return Ok(None);
}
return Err(e.into());
},
};
if !md.is_file() {
return Ok(None);
}
if md.len() > DEFAULT_CHUNK_CACHE_CAPACITY {
return Err(ChunkCacheError::general(format!(
"Cache directory contains a file larger than {} GB, cache directory state is invalid",
(DEFAULT_CHUNK_CACHE_CAPACITY as f64 / (1 << 30) as f64)
)));
}
// don't track an item that takes up the whole capacity
if md.len() > capacity {
return Ok(None);
}
let cache_item = match CacheItem::parse(item.file_name().as_encoded_bytes())
.debug_error("failed to decode a file name as a cache item")
{
Ok(i) => i,
Err(e) => {
debug!("not a valid cache file, removing: {:?} {e:?}", item.file_name());
remove_file(item.path())?;
return Ok(None);
},
};
if md.len() != cache_item.len {
// file is invalid, remove it
debug!(
"cache file len {} does not match expected length {}, removing path: {:?}",
md.len(),
cache_item.len,
item.path()
);
remove_file(item.path())?;
return Ok(None);
}
Ok(Some(cache_item))
}