From 1e7d877494d0c0cb407a15c19f6935e48cb4277e Mon Sep 17 00:00:00 2001 From: apfitzge Date: Fri, 20 May 2022 09:11:18 -0500 Subject: [PATCH] Create-snapshot check if slot is available on startup (#25329) * Add a check during ledger-tool create-snapshot startup to see if the snapshot slot is available * check all slots from the start to snapshot_slot during load_bank_forks * unwrap_or_default incremental snapshot slot before comparison * Improve error messages on missing or not full slots --- ledger-tool/src/main.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index 94a8d75d43a7e0..84a88748aad108 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -766,6 +766,8 @@ fn load_bank_forks( } else { "snapshot.ledger-tool" }); + + let mut starting_slot = 0; // default start check with genesis let snapshot_config = if arg_matches.is_present("no_snapshot") { None } else { @@ -773,6 +775,19 @@ fn load_bank_forks( snapshot_archive_path.unwrap_or_else(|| blockstore.ledger_path().to_path_buf()); let incremental_snapshot_archives_dir = incremental_snapshot_archive_path.unwrap_or_else(|| full_snapshot_archives_dir.clone()); + + if let Some(full_snapshot_slot) = + snapshot_utils::get_highest_full_snapshot_archive_slot(&full_snapshot_archives_dir) + { + let incremental_snapshot_slot = + snapshot_utils::get_highest_incremental_snapshot_archive_slot( + &incremental_snapshot_archives_dir, + full_snapshot_slot, + ) + .unwrap_or_default(); + starting_slot = std::cmp::max(full_snapshot_slot, incremental_snapshot_slot); + } + Some(SnapshotConfig { full_snapshot_archive_interval_slots: Slot::MAX, incremental_snapshot_archive_interval_slots: Slot::MAX, @@ -782,6 +797,25 @@ fn load_bank_forks( ..SnapshotConfig::default() }) }; + + if let Some(halt_slot) = process_options.halt_at_slot { + for slot in starting_slot..=halt_slot { + if let Ok(Some(slot_meta)) = blockstore.meta(slot) { + if !slot_meta.is_full() { + eprintln!("Unable to process from slot {} to {} due to blockstore slot {} not being full", + starting_slot, halt_slot, slot); + exit(1); + } + } else { + eprintln!( + "Unable to process from slot {} to {} due to blockstore missing slot {}", + starting_slot, halt_slot, slot + ); + exit(1); + } + } + } + let account_paths = if let Some(account_paths) = arg_matches.value_of("account_paths") { if !blockstore.is_primary_access() { // Be defensive, when default account dir is explicitly specified, it's still possible