Move SnapshotArchiveInfo and friends into its own module (#19114)

This commit is contained in:
Brooks Prumo
2021-08-08 07:57:06 -05:00
committed by GitHub
parent aa688e4549
commit fd937548a0
14 changed files with 182 additions and 167 deletions

View File

@ -9,8 +9,8 @@ use rayon::ThreadPool;
use solana_gossip::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES}; use solana_gossip::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES};
use solana_runtime::{ use solana_runtime::{
accounts_db, accounts_db,
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_package::{AccountsPackage, AccountsPackagePre, AccountsPackageReceiver}, snapshot_package::{AccountsPackage, AccountsPackagePre, AccountsPackageReceiver},
snapshot_utils::SnapshotArchiveInfoGetter,
}; };
use solana_sdk::{clock::Slot, hash::Hash, pubkey::Pubkey}; use solana_sdk::{clock::Slot, hash::Hash, pubkey::Pubkey};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};

View File

@ -1,7 +1,7 @@
use solana_gossip::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES}; use solana_gossip::cluster_info::{ClusterInfo, MAX_SNAPSHOT_HASHES};
use solana_runtime::{ use solana_runtime::{
snapshot_package::AccountsPackage, snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_package::AccountsPackage,
snapshot_utils::{self, SnapshotArchiveInfoGetter}, snapshot_utils,
}; };
use solana_sdk::{clock::Slot, hash::Hash}; use solana_sdk::{clock::Slot, hash::Hash};
use std::{ use std::{

View File

@ -60,8 +60,9 @@ use solana_runtime::{
bank_forks::BankForks, bank_forks::BankForks,
commitment::BlockCommitmentCache, commitment::BlockCommitmentCache,
hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE}, hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE},
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_utils::{self, SnapshotArchiveInfoGetter}, snapshot_utils,
}; };
use solana_sdk::{ use solana_sdk::{
clock::Slot, clock::Slot,

View File

@ -54,6 +54,7 @@ mod tests {
bank::{Bank, BankSlotDelta}, bank::{Bank, BankSlotDelta},
bank_forks::BankForks, bank_forks::BankForks,
genesis_utils::{create_genesis_config, GenesisConfigInfo}, genesis_utils::{create_genesis_config, GenesisConfigInfo},
snapshot_archive_info::FullSnapshotArchiveInfo,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_package::AccountsPackagePre, snapshot_package::AccountsPackagePre,
snapshot_utils::{ snapshot_utils::{
@ -168,8 +169,7 @@ mod tests {
ArchiveFormat::TarBzip2, ArchiveFormat::TarBzip2,
); );
let full_snapshot_archive_info = let full_snapshot_archive_info =
snapshot_utils::FullSnapshotArchiveInfo::new_from_path(full_snapshot_archive_path) FullSnapshotArchiveInfo::new_from_path(full_snapshot_archive_path).unwrap();
.unwrap();
let (deserialized_bank, _timing) = snapshot_utils::bank_from_snapshot_archives( let (deserialized_bank, _timing) = snapshot_utils::bank_from_snapshot_archives(
account_paths, account_paths,

View File

@ -29,10 +29,10 @@ use solana_runtime::{
bank::{Bank, RewardCalculationEvent}, bank::{Bank, RewardCalculationEvent},
bank_forks::BankForks, bank_forks::BankForks,
hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE}, hardened_unpack::{open_genesis_config, MAX_GENESIS_ARCHIVE_UNPACKED_SIZE},
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_utils::{ snapshot_utils::{
self, ArchiveFormat, SnapshotArchiveInfoGetter, SnapshotVersion, self, ArchiveFormat, SnapshotVersion, DEFAULT_MAX_FULL_SNAPSHOT_ARCHIVES_TO_RETAIN,
DEFAULT_MAX_FULL_SNAPSHOT_ARCHIVES_TO_RETAIN,
}, },
}; };
use solana_sdk::{ use solana_sdk::{

View File

@ -41,8 +41,9 @@ use {
validator_configs::*, validator_configs::*,
}, },
solana_runtime::{ solana_runtime::{
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_utils::{self, ArchiveFormat, SnapshotArchiveInfoGetter}, snapshot_utils::{self, ArchiveFormat},
}, },
solana_sdk::{ solana_sdk::{
account::AccountSharedData, account::AccountSharedData,

View File

@ -6,7 +6,7 @@ use {
contact_info::ContactInfo, contact_info::ContactInfo,
gossip_service::GossipService, gossip_service::GossipService,
}, },
solana_runtime::snapshot_utils::{self, SnapshotArchiveInfoGetter}, solana_runtime::{snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_utils},
solana_sdk::{ solana_sdk::{
clock::Slot, clock::Slot,
hash::Hash, hash::Hash,

View File

@ -16,8 +16,9 @@ use {
solana_rpc::{rpc::JsonRpcConfig, rpc_pubsub_service::PubSubConfig}, solana_rpc::{rpc::JsonRpcConfig, rpc_pubsub_service::PubSubConfig},
solana_runtime::{ solana_runtime::{
accounts_index::AccountSecondaryIndexes, accounts_index::AccountSecondaryIndexes,
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_utils::{self, ArchiveFormat, SnapshotArchiveInfoGetter}, snapshot_utils::{self, ArchiveFormat},
}, },
solana_sdk::{ solana_sdk::{
client::SyncClient, client::SyncClient,

View File

@ -26,10 +26,9 @@ use {
solana_metrics::inc_new_counter_info, solana_metrics::inc_new_counter_info,
solana_poh::poh_recorder::PohRecorder, solana_poh::poh_recorder::PohRecorder,
solana_runtime::{ solana_runtime::{
bank_forks::BankForks, bank_forks::BankForks, commitment::BlockCommitmentCache,
commitment::BlockCommitmentCache, snapshot_archive_info::SnapshotArchiveInfoGetter, snapshot_config::SnapshotConfig,
snapshot_config::SnapshotConfig, snapshot_utils,
snapshot_utils::{self, SnapshotArchiveInfoGetter},
}, },
solana_sdk::{ solana_sdk::{
exit::Exit, genesis_config::DEFAULT_GENESIS_DOWNLOAD_PATH, hash::Hash, exit::Exit, genesis_config::DEFAULT_GENESIS_DOWNLOAD_PATH, hash::Hash,

View File

@ -34,6 +34,7 @@ pub mod rent_collector;
pub mod secondary_index; pub mod secondary_index;
pub mod serde_snapshot; pub mod serde_snapshot;
mod shared_buffer_reader; mod shared_buffer_reader;
pub mod snapshot_archive_info;
pub mod snapshot_config; pub mod snapshot_config;
pub mod snapshot_package; pub mod snapshot_package;
pub mod snapshot_runtime_info; pub mod snapshot_runtime_info;

View File

@ -0,0 +1,149 @@
//! Information about snapshot archives
use crate::snapshot_utils::{self, ArchiveFormat, Result};
use solana_sdk::{clock::Slot, hash::Hash};
use std::{cmp::Ordering, path::PathBuf};
/// Trait to query the snapshot archive information
pub trait SnapshotArchiveInfoGetter {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo;
fn path(&self) -> &PathBuf {
&self.snapshot_archive_info().path
}
fn slot(&self) -> Slot {
self.snapshot_archive_info().slot
}
fn hash(&self) -> &Hash {
&self.snapshot_archive_info().hash
}
fn archive_format(&self) -> ArchiveFormat {
self.snapshot_archive_info().archive_format
}
}
/// Common information about a snapshot archive
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct SnapshotArchiveInfo {
/// Path to the snapshot archive file
pub path: PathBuf,
/// Slot that the snapshot was made
pub slot: Slot,
/// Hash of the accounts at this slot
pub hash: Hash,
/// Archive format for the snapshot file
pub archive_format: ArchiveFormat,
}
/// Information about a full snapshot archive: its path, slot, hash, and archive format
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct FullSnapshotArchiveInfo(SnapshotArchiveInfo);
impl FullSnapshotArchiveInfo {
/// Parse the path to a full snapshot archive and return a new `FullSnapshotArchiveInfo`
pub fn new_from_path(path: PathBuf) -> Result<Self> {
let filename = snapshot_utils::path_to_file_name_str(path.as_path())?;
let (slot, hash, archive_format) =
snapshot_utils::parse_full_snapshot_archive_filename(filename)?;
Ok(Self::new(SnapshotArchiveInfo {
path,
slot,
hash,
archive_format,
}))
}
pub(crate) fn new(snapshot_archive_info: SnapshotArchiveInfo) -> Self {
Self(snapshot_archive_info)
}
}
impl SnapshotArchiveInfoGetter for FullSnapshotArchiveInfo {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo {
&self.0
}
}
impl PartialOrd for FullSnapshotArchiveInfo {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
// Order `FullSnapshotArchiveInfo` by slot (ascending), which practially is sorting chronologically
impl Ord for FullSnapshotArchiveInfo {
fn cmp(&self, other: &Self) -> Ordering {
self.slot().cmp(&other.slot())
}
}
/// Information about an incremental snapshot archive: its path, slot, base slot, hash, and archive format
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct IncrementalSnapshotArchiveInfo {
/// The slot that the incremental snapshot was based from. This is the same as the full
/// snapshot slot used when making the incremental snapshot.
base_slot: Slot,
/// Use the `SnapshotArchiveInfo` struct for the common fields: path, slot, hash, and
/// archive_format, but as they pertain to the incremental snapshot.
inner: SnapshotArchiveInfo,
}
impl IncrementalSnapshotArchiveInfo {
/// Parse the path to an incremental snapshot archive and return a new `IncrementalSnapshotArchiveInfo`
pub fn new_from_path(path: PathBuf) -> Result<Self> {
let filename = snapshot_utils::path_to_file_name_str(path.as_path())?;
let (base_slot, slot, hash, archive_format) =
snapshot_utils::parse_incremental_snapshot_archive_filename(filename)?;
Ok(Self::new(
base_slot,
SnapshotArchiveInfo {
path,
slot,
hash,
archive_format,
},
))
}
pub(crate) fn new(base_slot: Slot, snapshot_archive_info: SnapshotArchiveInfo) -> Self {
Self {
base_slot,
inner: snapshot_archive_info,
}
}
pub fn base_slot(&self) -> Slot {
self.base_slot
}
}
impl SnapshotArchiveInfoGetter for IncrementalSnapshotArchiveInfo {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo {
&self.inner
}
}
impl PartialOrd for IncrementalSnapshotArchiveInfo {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
// Order `IncrementalSnapshotArchiveInfo` by base slot (ascending), then slot (ascending), which
// practially is sorting chronologically
impl Ord for IncrementalSnapshotArchiveInfo {
fn cmp(&self, other: &Self) -> Ordering {
self.base_slot()
.cmp(&other.base_slot())
.then(self.slot().cmp(&other.slot()))
}
}

View File

@ -1,11 +1,14 @@
use crate::snapshot_utils::{
ArchiveFormat, BankSnapshotInfo, Result, SnapshotArchiveInfo, SnapshotArchiveInfoGetter,
SnapshotVersion, TMP_FULL_SNAPSHOT_PREFIX, TMP_INCREMENTAL_SNAPSHOT_PREFIX,
};
use crate::{ use crate::{
accounts_db::SnapshotStorages, accounts_db::SnapshotStorages,
bank::{Bank, BankSlotDelta}, bank::{Bank, BankSlotDelta},
}; };
use crate::{
snapshot_archive_info::{SnapshotArchiveInfo, SnapshotArchiveInfoGetter},
snapshot_utils::{
ArchiveFormat, BankSnapshotInfo, Result, SnapshotVersion, TMP_FULL_SNAPSHOT_PREFIX,
TMP_INCREMENTAL_SNAPSHOT_PREFIX,
},
};
use log::*; use log::*;
use solana_sdk::clock::Slot; use solana_sdk::clock::Slot;
use solana_sdk::genesis_config::ClusterType; use solana_sdk::genesis_config::ClusterType;

View File

@ -9,6 +9,9 @@ use {
SnapshotStreams, SnapshotStreams,
}, },
shared_buffer_reader::{SharedBuffer, SharedBufferReader}, shared_buffer_reader::{SharedBuffer, SharedBufferReader},
snapshot_archive_info::{
FullSnapshotArchiveInfo, IncrementalSnapshotArchiveInfo, SnapshotArchiveInfoGetter,
},
snapshot_package::{ snapshot_package::{
AccountsPackage, AccountsPackagePre, AccountsPackageSendError, AccountsPackageSender, AccountsPackage, AccountsPackagePre, AccountsPackageSendError, AccountsPackageSender,
}, },
@ -39,149 +42,6 @@ use {
thiserror::Error, thiserror::Error,
}; };
/// Trait to query the snapshot archive information
pub trait SnapshotArchiveInfoGetter {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo;
fn path(&self) -> &PathBuf {
&self.snapshot_archive_info().path
}
fn slot(&self) -> Slot {
self.snapshot_archive_info().slot
}
fn hash(&self) -> &Hash {
&self.snapshot_archive_info().hash
}
fn archive_format(&self) -> ArchiveFormat {
self.snapshot_archive_info().archive_format
}
}
/// Common information about a snapshot archive
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct SnapshotArchiveInfo {
/// Path to the snapshot archive file
pub path: PathBuf,
/// Slot that the snapshot was made
pub slot: Slot,
/// Hash of the accounts at this slot
pub hash: Hash,
/// Archive format for the snapshot file
pub archive_format: ArchiveFormat,
}
/// Information about a full snapshot archive: its path, slot, hash, and archive format
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct FullSnapshotArchiveInfo(SnapshotArchiveInfo);
impl FullSnapshotArchiveInfo {
/// Parse the path to a full snapshot archive and return a new `FullSnapshotArchiveInfo`
pub fn new_from_path(path: PathBuf) -> Result<Self> {
let filename = path_to_file_name_str(path.as_path())?;
let (slot, hash, archive_format) = parse_full_snapshot_archive_filename(filename)?;
Ok(Self::new(SnapshotArchiveInfo {
path,
slot,
hash,
archive_format,
}))
}
fn new(snapshot_archive_info: SnapshotArchiveInfo) -> Self {
Self(snapshot_archive_info)
}
}
impl SnapshotArchiveInfoGetter for FullSnapshotArchiveInfo {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo {
&self.0
}
}
impl PartialOrd for FullSnapshotArchiveInfo {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
// Order `FullSnapshotArchiveInfo` by slot (ascending), which practially is sorting chronologically
impl Ord for FullSnapshotArchiveInfo {
fn cmp(&self, other: &Self) -> Ordering {
self.slot().cmp(&other.slot())
}
}
/// Information about an incremental snapshot archive: its path, slot, base slot, hash, and archive format
#[derive(PartialEq, Eq, Debug, Clone)]
pub struct IncrementalSnapshotArchiveInfo {
/// The slot that the incremental snapshot was based from. This is the same as the full
/// snapshot slot used when making the incremental snapshot.
base_slot: Slot,
/// Use the `SnapshotArchiveInfo` struct for the common fields: path, slot, hash, and
/// archive_format, but as they pertain to the incremental snapshot.
inner: SnapshotArchiveInfo,
}
impl IncrementalSnapshotArchiveInfo {
/// Parse the path to an incremental snapshot archive and return a new `IncrementalSnapshotArchiveInfo`
pub fn new_from_path(path: PathBuf) -> Result<Self> {
let filename = path_to_file_name_str(path.as_path())?;
let (base_slot, slot, hash, archive_format) =
parse_incremental_snapshot_archive_filename(filename)?;
Ok(Self::new(
base_slot,
SnapshotArchiveInfo {
path,
slot,
hash,
archive_format,
},
))
}
fn new(base_slot: Slot, snapshot_archive_info: SnapshotArchiveInfo) -> Self {
Self {
base_slot,
inner: snapshot_archive_info,
}
}
pub fn base_slot(&self) -> Slot {
self.base_slot
}
}
impl SnapshotArchiveInfoGetter for IncrementalSnapshotArchiveInfo {
fn snapshot_archive_info(&self) -> &SnapshotArchiveInfo {
&self.inner
}
}
impl PartialOrd for IncrementalSnapshotArchiveInfo {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
// Order `IncrementalSnapshotArchiveInfo` by base slot (ascending), then slot (ascending), which
// practially is sorting chronologically
impl Ord for IncrementalSnapshotArchiveInfo {
fn cmp(&self, other: &Self) -> Ordering {
self.base_slot()
.cmp(&other.base_slot())
.then(self.slot().cmp(&other.slot()))
}
}
pub const SNAPSHOT_STATUS_CACHE_FILE_NAME: &str = "status_cache"; pub const SNAPSHOT_STATUS_CACHE_FILE_NAME: &str = "status_cache";
pub const MAX_BANK_SNAPSHOTS: usize = 8; // Save some snapshots but not too many pub const MAX_BANK_SNAPSHOTS: usize = 8; // Save some snapshots but not too many
@ -1119,7 +979,7 @@ fn check_are_snapshots_compatible(
} }
/// Get the `&str` from a `&Path` /// Get the `&str` from a `&Path`
fn path_to_file_name_str(path: &Path) -> Result<&str> { pub fn path_to_file_name_str(path: &Path) -> Result<&str> {
path.file_name() path.file_name()
.ok_or_else(|| SnapshotError::PathToFileNameError(path.to_path_buf()))? .ok_or_else(|| SnapshotError::PathToFileNameError(path.to_path_buf()))?
.to_str() .to_str()
@ -1172,7 +1032,7 @@ fn archive_format_from_str(archive_format: &str) -> Option<ArchiveFormat> {
} }
/// Parse a full snapshot archive filename into its Slot, Hash, and Archive Format /// Parse a full snapshot archive filename into its Slot, Hash, and Archive Format
fn parse_full_snapshot_archive_filename( pub fn parse_full_snapshot_archive_filename(
archive_filename: &str, archive_filename: &str,
) -> Result<(Slot, Hash, ArchiveFormat)> { ) -> Result<(Slot, Hash, ArchiveFormat)> {
lazy_static! { lazy_static! {
@ -1203,7 +1063,7 @@ fn parse_full_snapshot_archive_filename(
} }
/// Parse an incremental snapshot archive filename into its base Slot, actual Slot, Hash, and Archive Format /// Parse an incremental snapshot archive filename into its base Slot, actual Slot, Hash, and Archive Format
fn parse_incremental_snapshot_archive_filename( pub fn parse_incremental_snapshot_archive_filename(
archive_filename: &str, archive_filename: &str,
) -> Result<(Slot, Slot, Hash, ArchiveFormat)> { ) -> Result<(Slot, Slot, Hash, ArchiveFormat)> {
lazy_static! { lazy_static! {

View File

@ -47,10 +47,10 @@ use {
AccountIndex, AccountSecondaryIndexes, AccountSecondaryIndexesIncludeExclude, AccountIndex, AccountSecondaryIndexes, AccountSecondaryIndexesIncludeExclude,
}, },
hardened_unpack::MAX_GENESIS_ARCHIVE_UNPACKED_SIZE, hardened_unpack::MAX_GENESIS_ARCHIVE_UNPACKED_SIZE,
snapshot_archive_info::SnapshotArchiveInfoGetter,
snapshot_config::SnapshotConfig, snapshot_config::SnapshotConfig,
snapshot_utils::{ snapshot_utils::{
self, ArchiveFormat, SnapshotArchiveInfoGetter, SnapshotVersion, self, ArchiveFormat, SnapshotVersion, DEFAULT_MAX_FULL_SNAPSHOT_ARCHIVES_TO_RETAIN,
DEFAULT_MAX_FULL_SNAPSHOT_ARCHIVES_TO_RETAIN,
}, },
}, },
solana_sdk::{ solana_sdk::{