solana_genesis_utils/
open.rs

1use {
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; // 10 MiB
9
10#[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}