diff --git a/runtime/src/snapshot_utils.rs b/runtime/src/snapshot_utils.rs index 1d98518cb9..55002602bb 100644 --- a/runtime/src/snapshot_utils.rs +++ b/runtime/src/snapshot_utils.rs @@ -2934,35 +2934,36 @@ pub fn verify_snapshot_archive( assert!(!dir_diff::is_different(&storages_to_verify, unpack_account_dir).unwrap()); } -/// Remove outdated bank snapshots +/// Purges bank snapshots, retaining the newest `num_bank_snapshots_to_retain` pub fn purge_old_bank_snapshots( bank_snapshots_dir: impl AsRef, num_bank_snapshots_to_retain: usize, filter_by_type: Option, ) { - let do_purge = |mut bank_snapshots: Vec| { - bank_snapshots.sort_unstable(); - bank_snapshots - .into_iter() - .rev() - .skip(num_bank_snapshots_to_retain) - .for_each(|bank_snapshot| { - let r = purge_bank_snapshot(&bank_snapshot.snapshot_dir); - if r.is_err() { - warn!( - "Couldn't purge bank snapshot at: {}", - bank_snapshot.snapshot_dir.display() - ); - } - }) - }; - - let bank_snapshots = match filter_by_type { + let mut bank_snapshots = match filter_by_type { Some(BankSnapshotType::Pre) => get_bank_snapshots_pre(&bank_snapshots_dir), Some(BankSnapshotType::Post) => get_bank_snapshots_post(&bank_snapshots_dir), None => get_bank_snapshots(&bank_snapshots_dir), }; - do_purge(bank_snapshots); + + bank_snapshots.sort_unstable(); + purge_bank_snapshots( + bank_snapshots + .iter() + .rev() + .skip(num_bank_snapshots_to_retain), + ); +} + +/// Purges all `bank_snapshots` +/// +/// Does not exit early if there is an error while purging a bank snapshot. +fn purge_bank_snapshots<'a>(bank_snapshots: impl IntoIterator) { + for snapshot_dir in bank_snapshots.into_iter().map(|s| &s.snapshot_dir) { + if purge_bank_snapshot(snapshot_dir).is_err() { + warn!("Failed to purge bank snapshot: {}", snapshot_dir.display()); + } + } } /// Remove the bank snapshot at this path