diff --git a/ledger-tool/src/main.rs b/ledger-tool/src/main.rs index fcc6714bbaecca..0a20ea658d4c49 100644 --- a/ledger-tool/src/main.rs +++ b/ledger-tool/src/main.rs @@ -741,6 +741,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 { @@ -748,6 +750,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, @@ -757,6 +772,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