in mdb_shard/src/shard_file_handle.rs [274:322]
fn scan_impl(
path: impl AsRef<Path>,
skip_on_error: bool,
mut callback: impl FnMut(Arc<Self>) -> Result<()>,
) -> Result<()> {
let path = path.as_ref();
let mut load_file = |h: MerkleHash, file_name: &Path| -> Result<()> {
let s_res = Self::load_from_hash_and_path(h, file_name);
let s = match s_res {
Ok(s) => s,
Err(e) => {
if skip_on_error {
info!("Error loading shard {file_name:?}: {e}; skipping.");
return Ok(());
} else {
error!("Error reading shard {file_name:?}: {e}; skipping.");
return Err(e);
}
},
};
s.verify_shard_integrity_debug_only();
callback(s)?;
debug!("Registerd shard file '{file_name:?}'.");
Ok(())
};
if path.is_dir() {
for entry in std::fs::read_dir(path)? {
if entry.is_err() && skip_on_error {
continue;
}
let entry = entry?;
if let Some(h) = entry.file_name().to_str().and_then(parse_shard_filename) {
load_file(h, &path.join(entry.file_name()))?;
}
}
} else if let Some(h) = path.file_name().and_then(parse_shard_filename) {
load_file(h, path)?;
} else {
return Err(MDBShardError::BadFilename(format!("Filename {path:?} not valid shard file name.")));
}
Ok(())
}