use super::*;
pub(super) async fn handle_clear(state: &SharedState) -> Response {
let artifacts_removed = {
let count = state.artifacts.len() as u64;
state.artifacts.clear();
count
};
let metadata_cleared = state.cache_system.metadata().len() as u64;
let dep_graph_contexts_cleared = state.dep_graph.stats().context_count as u64;
let on_disk_bytes_freed = match std::fs::read_dir(&state.artifact_dir) {
Ok(entries) => entries
.filter_map(|e| e.ok())
.filter_map(|e| e.metadata().ok().map(|m| m.len()))
.sum(),
Err(_) => 0,
};
state.dep_graph.clear();
state.cache_system.clear();
state.fast_hit_cache.clear();
state.request_cache.clear();
state.request_validation_cache.clear();
state.rsp_cache.clear();
state.watched_raw_dirs.clear();
state.system_includes.lock().await.clear();
state.watched_dirs.lock().await.clear();
state.stats.reset();
state.profiler.reset();
if let Ok(entries) = std::fs::read_dir(&state.artifact_dir) {
use rayon::prelude::*;
let paths: Vec<_> = entries.flatten().map(|e| e.path()).collect();
paths.par_iter().for_each(|p| {
let _ = std::fs::remove_file(p);
});
}
state.artifact_store.clear();
let _ = state.artifact_store.flush();
if let Err(e) = state
.cache_system
.metadata()
.save_to_disk(state.metadata_path.as_path())
{
tracing::warn!(
path = %state.metadata_path.display(),
"metadata cache save during Clear failed: {e}"
);
}
let _ = std::fs::remove_file(state.metadata_path.as_path());
let _ = std::fs::remove_file(crate::depgraph::depgraph_file_path());
tracing::info!(
artifacts_removed,
metadata_cleared,
dep_graph_contexts_cleared,
on_disk_bytes_freed,
"cache cleared"
);
Response::Cleared {
artifacts_removed,
metadata_cleared,
dep_graph_contexts_cleared,
on_disk_bytes_freed,
}
}