solana_genesis_utils/
open.rs1use {
2 agave_snapshots::{hardened_unpack::UnpackError, unpack_genesis_archive},
3 solana_genesis_config::{GenesisConfig, DEFAULT_GENESIS_ARCHIVE},
4 std::path::Path,
5 thiserror::Error,
6};
7
8pub const MAX_GENESIS_ARCHIVE_UNPACKED_SIZE: u64 = 10 * 1024 * 1024; #[derive(Error, Debug)]
11pub enum OpenGenesisConfigError {
12 #[error("unpack error: {0}")]
13 Unpack(#[from] UnpackError),
14 #[error("Genesis load error: {0}")]
15 Load(#[from] std::io::Error),
16}
17
18pub fn open_genesis_config(
19 ledger_path: &Path,
20 max_genesis_archive_unpacked_size: u64,
21) -> Result<GenesisConfig, OpenGenesisConfigError> {
22 match GenesisConfig::load(ledger_path) {
23 Ok(genesis_config) => Ok(genesis_config),
24 Err(load_err) => {
25 log::warn!(
26 "Failed to load genesis_config at {ledger_path:?}: {load_err}. Will attempt to \
27 unpack genesis archive and then retry loading."
28 );
29
30 let genesis_package = ledger_path.join(DEFAULT_GENESIS_ARCHIVE);
31 unpack_genesis_archive(
32 &genesis_package,
33 ledger_path,
34 max_genesis_archive_unpacked_size,
35 )?;
36 GenesisConfig::load(ledger_path).map_err(OpenGenesisConfigError::Load)
37 }
38 }
39}