Move get_bank_forks() into ledger/ so its available for use by ledger-tool/ (#6720)

This commit is contained in:
Michael Vines 2019-11-04 19:10:06 -07:00 committed by GitHub
parent f54cfcdb8f
commit 4d52f47f87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 98 additions and 88 deletions

View File

@ -20,10 +20,10 @@ use crate::{
}; };
use solana_ledger::{ use solana_ledger::{
bank_forks::{BankForks, SnapshotConfig}, bank_forks::{BankForks, SnapshotConfig},
bank_forks_utils,
blocktree::{Blocktree, CompletedSlotsReceiver}, blocktree::{Blocktree, CompletedSlotsReceiver},
blocktree_processor::{self, BankForksInfo}, blocktree_processor::{self, BankForksInfo},
leader_schedule_cache::LeaderScheduleCache, leader_schedule_cache::LeaderScheduleCache,
snapshot_utils,
}; };
use solana_metrics::datapoint_info; use solana_metrics::datapoint_info;
use solana_sdk::{ use solana_sdk::{
@ -37,7 +37,6 @@ use solana_sdk::{
}; };
use std::{ use std::{
fs,
net::{IpAddr, Ipv4Addr, SocketAddr}, net::{IpAddr, Ipv4Addr, SocketAddr},
path::{Path, PathBuf}, path::{Path, PathBuf},
process, process,
@ -409,67 +408,6 @@ impl Validator {
} }
} }
fn get_bank_forks(
genesis_block: &GenesisBlock,
blocktree: &Blocktree,
account_paths: Option<String>,
snapshot_config: Option<&SnapshotConfig>,
verify_ledger: bool,
dev_halt_at_slot: Option<Slot>,
) -> (BankForks, Vec<BankForksInfo>, LeaderScheduleCache) {
let process_options = blocktree_processor::ProcessOptions {
verify_ledger,
dev_halt_at_slot,
..blocktree_processor::ProcessOptions::default()
};
if let Some(snapshot_config) = snapshot_config.as_ref() {
info!(
"Initializing snapshot path: {:?}",
snapshot_config.snapshot_path
);
let _ = fs::remove_dir_all(&snapshot_config.snapshot_path);
fs::create_dir_all(&snapshot_config.snapshot_path)
.expect("Couldn't create snapshot directory");
let tar =
snapshot_utils::get_snapshot_tar_path(&snapshot_config.snapshot_package_output_path);
if tar.exists() {
info!("Loading snapshot package: {:?}", tar);
// Fail hard here if snapshot fails to load, don't silently continue
let deserialized_bank = snapshot_utils::bank_from_archive(
account_paths
.clone()
.expect("Account paths not present when booting from snapshot"),
&snapshot_config.snapshot_path,
&tar,
)
.expect("Load from snapshot failed");
return blocktree_processor::process_blocktree_from_root(
genesis_block,
blocktree,
Arc::new(deserialized_bank),
&process_options,
)
.expect("processing blocktree after loading snapshot failed");
} else {
info!("Snapshot package does not exist: {:?}", tar);
}
} else {
info!("Snapshots disabled");
}
info!("Processing ledger from genesis");
blocktree_processor::process_blocktree(
&genesis_block,
&blocktree,
account_paths,
process_options,
)
.expect("process_blocktree failed")
}
#[cfg(not(unix))] #[cfg(not(unix))]
fn adjust_ulimit_nofile() {} fn adjust_ulimit_nofile() {}
@ -549,18 +487,25 @@ pub fn new_banks_from_blocktree(
let (blocktree, ledger_signal_receiver, completed_slots_receiver) = let (blocktree, ledger_signal_receiver, completed_slots_receiver) =
Blocktree::open_with_signal(blocktree_path).expect("Failed to open ledger database"); Blocktree::open_with_signal(blocktree_path).expect("Failed to open ledger database");
let (mut bank_forks, bank_forks_info, leader_schedule_cache) = get_bank_forks( let process_options = blocktree_processor::ProcessOptions {
verify_ledger,
dev_halt_at_slot,
..blocktree_processor::ProcessOptions::default()
};
let (mut bank_forks, bank_forks_info, leader_schedule_cache) = bank_forks_utils::load(
&genesis_block, &genesis_block,
&blocktree, &blocktree,
account_paths, account_paths,
snapshot_config.as_ref(), snapshot_config.as_ref(),
verify_ledger, process_options,
dev_halt_at_slot, )
); .unwrap_or_else(|err| {
error!("Failed to load ledger: {:?}", err);
std::process::exit(1);
});
if let Some(snapshot_config) = snapshot_config { bank_forks.set_snapshot_config(snapshot_config);
bank_forks.set_snapshot_config(snapshot_config);
}
( (
genesis_blockhash, genesis_blockhash,

View File

@ -63,7 +63,7 @@ mod tests {
snapshot_package_output_path: PathBuf::from(snapshot_output_path.path()), snapshot_package_output_path: PathBuf::from(snapshot_output_path.path()),
snapshot_path: PathBuf::from(snapshot_dir.path()), snapshot_path: PathBuf::from(snapshot_dir.path()),
}; };
bank_forks.set_snapshot_config(snapshot_config.clone()); bank_forks.set_snapshot_config(Some(snapshot_config.clone()));
SnapshotTestConfig { SnapshotTestConfig {
accounts_dir, accounts_dir,
snapshot_dir, snapshot_dir,

View File

@ -1,15 +1,17 @@
use clap::{crate_description, crate_name, crate_version, value_t_or_exit, App, Arg, SubCommand}; use clap::{crate_description, crate_name, crate_version, value_t_or_exit, App, Arg, SubCommand};
use solana_ledger::blocktree::Blocktree; use solana_ledger::{
use solana_ledger::blocktree_processor::{process_blocktree, ProcessOptions}; bank_forks_utils, blocktree::Blocktree, blocktree_processor,
use solana_ledger::rooted_slot_iterator::RootedSlotIterator; rooted_slot_iterator::RootedSlotIterator,
use solana_sdk::clock::Slot; };
use solana_sdk::genesis_block::GenesisBlock; use solana_sdk::{clock::Slot, genesis_block::GenesisBlock};
use std::collections::BTreeMap; use std::{
use std::fs::File; collections::BTreeMap,
use std::io::{stdout, Write}; fs::File,
use std::path::PathBuf; io::{stdout, Write},
use std::process::exit; path::PathBuf,
use std::str::FromStr; process::exit,
str::FromStr,
};
#[derive(PartialEq)] #[derive(PartialEq)]
enum LedgerOutputMethod { enum LedgerOutputMethod {
@ -169,12 +171,12 @@ fn main() {
} }
("verify", _) => { ("verify", _) => {
println!("Verifying ledger..."); println!("Verifying ledger...");
let options = ProcessOptions { let process_options = blocktree_processor::ProcessOptions {
verify_ledger: true, verify_ledger: true,
..ProcessOptions::default() ..blocktree_processor::ProcessOptions::default()
}; };
match process_blocktree(&genesis_block, &blocktree, None, options) { match bank_forks_utils::load(&genesis_block, &blocktree, None, None, process_options) {
Ok((_bank_forks, bank_forks_info, _)) => { Ok((_bank_forks, bank_forks_info, _leader_schedule_cache)) => {
println!("{:?}", bank_forks_info); println!("{:?}", bank_forks_info);
} }
Err(err) => { Err(err) => {

View File

@ -292,8 +292,8 @@ impl BankForks {
.retain(|slot, _| slot == &root || descendants[&root].contains(slot)); .retain(|slot, _| slot == &root || descendants[&root].contains(slot));
} }
pub fn set_snapshot_config(&mut self, snapshot_config: SnapshotConfig) { pub fn set_snapshot_config(&mut self, snapshot_config: Option<SnapshotConfig>) {
self.snapshot_config = Some(snapshot_config); self.snapshot_config = snapshot_config;
} }
pub fn snapshot_config(&self) -> &Option<SnapshotConfig> { pub fn snapshot_config(&self) -> &Option<SnapshotConfig> {

View File

@ -0,0 +1,62 @@
use crate::{
bank_forks::{BankForks, SnapshotConfig},
blocktree::Blocktree,
blocktree_processor::{self, BankForksInfo, BlocktreeProcessorError, ProcessOptions},
leader_schedule_cache::LeaderScheduleCache,
snapshot_utils,
};
use log::*;
use solana_sdk::genesis_block::GenesisBlock;
use std::{fs, sync::Arc};
pub fn load(
genesis_block: &GenesisBlock,
blocktree: &Blocktree,
account_paths: Option<String>,
snapshot_config: Option<&SnapshotConfig>,
process_options: ProcessOptions,
) -> Result<(BankForks, Vec<BankForksInfo>, LeaderScheduleCache), BlocktreeProcessorError> {
if let Some(snapshot_config) = snapshot_config.as_ref() {
info!(
"Initializing snapshot path: {:?}",
snapshot_config.snapshot_path
);
let _ = fs::remove_dir_all(&snapshot_config.snapshot_path);
fs::create_dir_all(&snapshot_config.snapshot_path)
.expect("Couldn't create snapshot directory");
let tar =
snapshot_utils::get_snapshot_tar_path(&snapshot_config.snapshot_package_output_path);
if tar.exists() {
info!("Loading snapshot package: {:?}", tar);
// Fail hard here if snapshot fails to load, don't silently continue
let deserialized_bank = snapshot_utils::bank_from_archive(
account_paths
.clone()
.expect("Account paths not present when booting from snapshot"),
&snapshot_config.snapshot_path,
&tar,
)
.expect("Load from snapshot failed");
return blocktree_processor::process_blocktree_from_root(
genesis_block,
blocktree,
Arc::new(deserialized_bank),
&process_options,
);
} else {
info!("Snapshot package does not exist: {:?}", tar);
}
} else {
info!("Snapshots disabled");
}
info!("Processing ledger from genesis");
blocktree_processor::process_blocktree(
&genesis_block,
&blocktree,
account_paths,
process_options,
)
}

View File

@ -1,4 +1,5 @@
pub mod bank_forks; pub mod bank_forks;
pub mod bank_forks_utils;
pub mod block_error; pub mod block_error;
#[macro_use] #[macro_use]
pub mod blocktree; pub mod blocktree;