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
This commit is contained in:
apfitzge 2022-05-20 09:11:18 -05:00 committed by GitHub
parent de03a3d3aa
commit 1e7d877494
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 0 deletions

View File

@ -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