Refactor genesis download/load/check functions (#17276)
* Refactor genesis ingest functions * Consolidate genesis.bin/genesis.tar.bz2 references
This commit is contained in:
@ -34,6 +34,7 @@ solana-client = { path = "../client", version = "=1.7.0" }
|
||||
solana-core = { path = "../core", version = "=1.7.0" }
|
||||
solana-download-utils = { path = "../download-utils", version = "=1.7.0" }
|
||||
solana-faucet = { path = "../faucet", version = "=1.7.0" }
|
||||
solana-genesis-utils = { path = "../genesis-utils", version = "=1.7.0" }
|
||||
solana-ledger = { path = "../ledger", version = "=1.7.0" }
|
||||
solana-logger = { path = "../logger", version = "=1.7.0" }
|
||||
solana-metrics = { path = "../metrics", version = "=1.7.0" }
|
||||
|
@ -34,7 +34,8 @@ use {
|
||||
is_snapshot_config_invalid, Validator, ValidatorConfig, ValidatorStartProgress,
|
||||
},
|
||||
},
|
||||
solana_download_utils::{download_genesis_if_missing, download_snapshot},
|
||||
solana_download_utils::download_snapshot,
|
||||
solana_genesis_utils::download_then_check_genesis_hash,
|
||||
solana_ledger::blockstore_db::BlockstoreRecoveryMode,
|
||||
solana_perf::recycler::enable_recycler_warming,
|
||||
solana_rpc::rpc_pubsub_service::PubSubConfig,
|
||||
@ -43,13 +44,12 @@ use {
|
||||
AccountIndex, AccountSecondaryIndexes, AccountSecondaryIndexesIncludeExclude,
|
||||
},
|
||||
bank_forks::{ArchiveFormat, SnapshotConfig, SnapshotVersion},
|
||||
hardened_unpack::{unpack_genesis_archive, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE},
|
||||
hardened_unpack::MAX_GENESIS_ARCHIVE_UNPACKED_SIZE,
|
||||
snapshot_utils::{get_highest_snapshot_archive_path, DEFAULT_MAX_SNAPSHOTS_TO_RETAIN},
|
||||
},
|
||||
solana_sdk::{
|
||||
clock::{Slot, DEFAULT_S_PER_SLOT},
|
||||
commitment_config::CommitmentConfig,
|
||||
genesis_config::GenesisConfig,
|
||||
hash::Hash,
|
||||
pubkey::Pubkey,
|
||||
signature::{Keypair, Signer},
|
||||
@ -648,74 +648,6 @@ fn validators_set(
|
||||
}
|
||||
}
|
||||
|
||||
fn check_genesis_hash(
|
||||
genesis_config: &GenesisConfig,
|
||||
expected_genesis_hash: Option<Hash>,
|
||||
) -> Result<(), String> {
|
||||
let genesis_hash = genesis_config.hash();
|
||||
|
||||
if let Some(expected_genesis_hash) = expected_genesis_hash {
|
||||
if expected_genesis_hash != genesis_hash {
|
||||
return Err(format!(
|
||||
"Genesis hash mismatch: expected {} but downloaded genesis hash is {}",
|
||||
expected_genesis_hash, genesis_hash,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn load_local_genesis(
|
||||
ledger_path: &std::path::Path,
|
||||
expected_genesis_hash: Option<Hash>,
|
||||
) -> Result<GenesisConfig, String> {
|
||||
let existing_genesis = GenesisConfig::load(&ledger_path)
|
||||
.map_err(|err| format!("Failed to load genesis config: {}", err))?;
|
||||
check_genesis_hash(&existing_genesis, expected_genesis_hash)?;
|
||||
|
||||
Ok(existing_genesis)
|
||||
}
|
||||
|
||||
fn download_then_check_genesis_hash(
|
||||
rpc_addr: &SocketAddr,
|
||||
ledger_path: &std::path::Path,
|
||||
expected_genesis_hash: Option<Hash>,
|
||||
max_genesis_archive_unpacked_size: u64,
|
||||
no_genesis_fetch: bool,
|
||||
use_progress_bar: bool,
|
||||
) -> Result<Hash, String> {
|
||||
if no_genesis_fetch {
|
||||
let genesis_config = load_local_genesis(ledger_path, expected_genesis_hash)?;
|
||||
return Ok(genesis_config.hash());
|
||||
}
|
||||
|
||||
let genesis_package = ledger_path.join("genesis.tar.bz2");
|
||||
let genesis_config = if let Ok(tmp_genesis_package) =
|
||||
download_genesis_if_missing(rpc_addr, &genesis_package, use_progress_bar)
|
||||
{
|
||||
unpack_genesis_archive(
|
||||
&tmp_genesis_package,
|
||||
&ledger_path,
|
||||
max_genesis_archive_unpacked_size,
|
||||
)
|
||||
.map_err(|err| format!("Failed to unpack downloaded genesis config: {}", err))?;
|
||||
|
||||
let downloaded_genesis = GenesisConfig::load(&ledger_path)
|
||||
.map_err(|err| format!("Failed to load downloaded genesis config: {}", err))?;
|
||||
|
||||
check_genesis_hash(&downloaded_genesis, expected_genesis_hash)?;
|
||||
std::fs::rename(tmp_genesis_package, genesis_package)
|
||||
.map_err(|err| format!("Unable to rename: {:?}", err))?;
|
||||
|
||||
downloaded_genesis
|
||||
} else {
|
||||
load_local_genesis(ledger_path, expected_genesis_hash)?
|
||||
};
|
||||
|
||||
Ok(genesis_config.hash())
|
||||
}
|
||||
|
||||
fn verify_reachable_ports(
|
||||
node: &Node,
|
||||
cluster_entrypoint: &ContactInfo,
|
||||
@ -872,7 +804,7 @@ fn rpc_bootstrap(
|
||||
Err(err) => Err(format!("Failed to get RPC node version: {}", err)),
|
||||
}
|
||||
.and_then(|_| {
|
||||
let genesis_hash = download_then_check_genesis_hash(
|
||||
let genesis_config = download_then_check_genesis_hash(
|
||||
&rpc_contact_info.rpc,
|
||||
&ledger_path,
|
||||
validator_config.expected_genesis_hash,
|
||||
@ -881,7 +813,8 @@ fn rpc_bootstrap(
|
||||
use_progress_bar,
|
||||
);
|
||||
|
||||
if let Ok(genesis_hash) = genesis_hash {
|
||||
if let Ok(genesis_config) = genesis_config {
|
||||
let genesis_hash = genesis_config.hash();
|
||||
if validator_config.expected_genesis_hash.is_none() {
|
||||
info!("Expected genesis hash set to {}", genesis_hash);
|
||||
validator_config.expected_genesis_hash = Some(genesis_hash);
|
||||
|
Reference in New Issue
Block a user