summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_incremental/src/persist/fs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_incremental/src/persist/fs.rs')
-rw-r--r--compiler/rustc_incremental/src/persist/fs.rs203
1 files changed, 104 insertions, 99 deletions
diff --git a/compiler/rustc_incremental/src/persist/fs.rs b/compiler/rustc_incremental/src/persist/fs.rs
index e3c688b3e..7708deece 100644
--- a/compiler/rustc_incremental/src/persist/fs.rs
+++ b/compiler/rustc_incremental/src/persist/fs.rs
@@ -104,8 +104,9 @@
//! implemented.
use crate::errors;
-use rustc_data_structures::fx::{FxHashMap, FxHashSet};
+use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
use rustc_data_structures::svh::Svh;
+use rustc_data_structures::unord::{UnordMap, UnordSet};
use rustc_data_structures::{base_n, flock};
use rustc_errors::ErrorGuaranteed;
use rustc_fs_util::{link_or_copy, try_canonicalize, LinkOrCopy};
@@ -635,8 +636,8 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
// First do a pass over the crate directory, collecting lock files and
// session directories
- let mut session_directories = FxHashSet::default();
- let mut lock_files = FxHashSet::default();
+ let mut session_directories = FxIndexSet::default();
+ let mut lock_files = UnordSet::default();
for dir_entry in crate_directory.read_dir()? {
let Ok(dir_entry) = dir_entry else {
@@ -657,10 +658,11 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
// This is something we don't know, leave it alone
}
}
+ session_directories.sort();
// Now map from lock files to session directories
- let lock_file_to_session_dir: FxHashMap<String, Option<String>> = lock_files
- .into_iter()
+ let lock_file_to_session_dir: UnordMap<String, Option<String>> = lock_files
+ .into_items()
.map(|lock_file_name| {
assert!(lock_file_name.ends_with(LOCK_FILE_EXT));
let dir_prefix_end = lock_file_name.len() - LOCK_FILE_EXT.len();
@@ -670,11 +672,13 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
};
(lock_file_name, session_dir.map(String::clone))
})
- .collect();
+ .into();
// Delete all lock files, that don't have an associated directory. They must
// be some kind of leftover
- for (lock_file_name, directory_name) in &lock_file_to_session_dir {
+ for (lock_file_name, directory_name) in
+ lock_file_to_session_dir.items().into_sorted_stable_ord()
+ {
if directory_name.is_none() {
let Ok(timestamp) = extract_timestamp_from_session_dir(lock_file_name) else {
debug!(
@@ -685,19 +689,19 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
continue;
};
- let lock_file_path = crate_directory.join(&**lock_file_name);
+ let lock_file_path = crate_directory.join(&*lock_file_name);
if is_old_enough_to_be_collected(timestamp) {
debug!(
"garbage_collect_session_directories() - deleting \
- garbage lock file: {}",
+ garbage lock file: {}",
lock_file_path.display()
);
delete_session_dir_lock_file(sess, &lock_file_path);
} else {
debug!(
"garbage_collect_session_directories() - lock file with \
- no session dir not old enough to be collected: {}",
+ no session dir not old enough to be collected: {}",
lock_file_path.display()
);
}
@@ -705,14 +709,14 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
}
// Filter out `None` directories
- let lock_file_to_session_dir: FxHashMap<String, String> = lock_file_to_session_dir
- .into_iter()
+ let lock_file_to_session_dir: UnordMap<String, String> = lock_file_to_session_dir
+ .into_items()
.filter_map(|(lock_file_name, directory_name)| directory_name.map(|n| (lock_file_name, n)))
- .collect();
+ .into();
// Delete all session directories that don't have a lock file.
for directory_name in session_directories {
- if !lock_file_to_session_dir.values().any(|dir| *dir == directory_name) {
+ if !lock_file_to_session_dir.items().any(|(_, dir)| *dir == directory_name) {
let path = crate_directory.join(directory_name);
if let Err(err) = safe_remove_dir_all(&path) {
sess.emit_warning(errors::InvalidGcFailed { path: &path, err });
@@ -721,103 +725,103 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
}
// Now garbage collect the valid session directories.
- let mut deletion_candidates = vec![];
+ let deletion_candidates =
+ lock_file_to_session_dir.items().filter_map(|(lock_file_name, directory_name)| {
+ debug!("garbage_collect_session_directories() - inspecting: {}", directory_name);
- for (lock_file_name, directory_name) in &lock_file_to_session_dir {
- debug!("garbage_collect_session_directories() - inspecting: {}", directory_name);
-
- let Ok(timestamp) = extract_timestamp_from_session_dir(directory_name) else {
+ let Ok(timestamp) = extract_timestamp_from_session_dir(directory_name) else {
debug!(
"found session-dir with malformed timestamp: {}",
crate_directory.join(directory_name).display()
);
// Ignore it
- continue;
+ return None;
};
- if is_finalized(directory_name) {
- let lock_file_path = crate_directory.join(lock_file_name);
- match flock::Lock::new(
- &lock_file_path,
- false, // don't wait
- false, // don't create the lock-file
- true,
- ) {
- // get an exclusive lock
- Ok(lock) => {
- debug!(
- "garbage_collect_session_directories() - \
+ if is_finalized(directory_name) {
+ let lock_file_path = crate_directory.join(lock_file_name);
+ match flock::Lock::new(
+ &lock_file_path,
+ false, // don't wait
+ false, // don't create the lock-file
+ true,
+ ) {
+ // get an exclusive lock
+ Ok(lock) => {
+ debug!(
+ "garbage_collect_session_directories() - \
successfully acquired lock"
- );
- debug!(
- "garbage_collect_session_directories() - adding \
+ );
+ debug!(
+ "garbage_collect_session_directories() - adding \
deletion candidate: {}",
- directory_name
- );
-
- // Note that we are holding on to the lock
- deletion_candidates.push((
- timestamp,
- crate_directory.join(directory_name),
- Some(lock),
- ));
- }
- Err(_) => {
- debug!(
- "garbage_collect_session_directories() - \
+ directory_name
+ );
+
+ // Note that we are holding on to the lock
+ return Some((
+ (timestamp, crate_directory.join(directory_name)),
+ Some(lock),
+ ));
+ }
+ Err(_) => {
+ debug!(
+ "garbage_collect_session_directories() - \
not collecting, still in use"
- );
+ );
+ }
}
- }
- } else if is_old_enough_to_be_collected(timestamp) {
- // When cleaning out "-working" session directories, i.e.
- // session directories that might still be in use by another
- // compiler instance, we only look a directories that are
- // at least ten seconds old. This is supposed to reduce the
- // chance of deleting a directory in the time window where
- // the process has allocated the directory but has not yet
- // acquired the file-lock on it.
-
- // Try to acquire the directory lock. If we can't, it
- // means that the owning process is still alive and we
- // leave this directory alone.
- let lock_file_path = crate_directory.join(lock_file_name);
- match flock::Lock::new(
- &lock_file_path,
- false, // don't wait
- false, // don't create the lock-file
- true,
- ) {
- // get an exclusive lock
- Ok(lock) => {
- debug!(
- "garbage_collect_session_directories() - \
+ } else if is_old_enough_to_be_collected(timestamp) {
+ // When cleaning out "-working" session directories, i.e.
+ // session directories that might still be in use by another
+ // compiler instance, we only look a directories that are
+ // at least ten seconds old. This is supposed to reduce the
+ // chance of deleting a directory in the time window where
+ // the process has allocated the directory but has not yet
+ // acquired the file-lock on it.
+
+ // Try to acquire the directory lock. If we can't, it
+ // means that the owning process is still alive and we
+ // leave this directory alone.
+ let lock_file_path = crate_directory.join(lock_file_name);
+ match flock::Lock::new(
+ &lock_file_path,
+ false, // don't wait
+ false, // don't create the lock-file
+ true,
+ ) {
+ // get an exclusive lock
+ Ok(lock) => {
+ debug!(
+ "garbage_collect_session_directories() - \
successfully acquired lock"
- );
+ );
- delete_old(sess, &crate_directory.join(directory_name));
+ delete_old(sess, &crate_directory.join(directory_name));
- // Let's make it explicit that the file lock is released at this point,
- // or rather, that we held on to it until here
- drop(lock);
- }
- Err(_) => {
- debug!(
- "garbage_collect_session_directories() - \
+ // Let's make it explicit that the file lock is released at this point,
+ // or rather, that we held on to it until here
+ drop(lock);
+ }
+ Err(_) => {
+ debug!(
+ "garbage_collect_session_directories() - \
not collecting, still in use"
- );
+ );
+ }
}
- }
- } else {
- debug!(
- "garbage_collect_session_directories() - not finalized, not \
+ } else {
+ debug!(
+ "garbage_collect_session_directories() - not finalized, not \
old enough"
- );
- }
- }
+ );
+ }
+ None
+ });
+ let deletion_candidates = deletion_candidates.into();
// Delete all but the most recent of the candidates
- for (path, lock) in all_except_most_recent(deletion_candidates) {
+ all_except_most_recent(deletion_candidates).into_items().all(|(path, lock)| {
debug!("garbage_collect_session_directories() - deleting `{}`", path.display());
if let Err(err) = safe_remove_dir_all(&path) {
@@ -829,7 +833,8 @@ pub fn garbage_collect_session_directories(sess: &Session) -> io::Result<()> {
// Let's make it explicit that the file lock is released at this point,
// or rather, that we held on to it until here
drop(lock);
- }
+ true
+ });
Ok(())
}
@@ -845,18 +850,18 @@ fn delete_old(sess: &Session, path: &Path) {
}
fn all_except_most_recent(
- deletion_candidates: Vec<(SystemTime, PathBuf, Option<flock::Lock>)>,
-) -> FxHashMap<PathBuf, Option<flock::Lock>> {
- let most_recent = deletion_candidates.iter().map(|&(timestamp, ..)| timestamp).max();
+ deletion_candidates: UnordMap<(SystemTime, PathBuf), Option<flock::Lock>>,
+) -> UnordMap<PathBuf, Option<flock::Lock>> {
+ let most_recent = deletion_candidates.items().map(|(&(timestamp, _), _)| timestamp).max();
if let Some(most_recent) = most_recent {
deletion_candidates
- .into_iter()
- .filter(|&(timestamp, ..)| timestamp != most_recent)
- .map(|(_, path, lock)| (path, lock))
+ .into_items()
+ .filter(|&((timestamp, _), _)| timestamp != most_recent)
+ .map(|((_, path), lock)| (path, lock))
.collect()
} else {
- FxHashMap::default()
+ UnordMap::default()
}
}