#[cfg(feature = "dev-context-only-utils")]
use solana_hash::Hash;
use {
crate::bank::{Bank, BankFieldsToSerialize, BankHashStats, BankSlotDelta},
agave_snapshots::{SnapshotArchiveKind, SnapshotKind, snapshot_hash::SnapshotHash},
solana_accounts_db::account_storage_entry::AccountStorageEntry,
solana_clock::Slot,
std::{sync::Arc, time::Instant},
};
mod compare;
pub use compare::*;
pub struct SnapshotPackage {
pub snapshot_kind: SnapshotKind,
pub slot: Slot,
pub hash: SnapshotHash,
pub snapshot_storages: Vec<Arc<AccountStorageEntry>>,
pub bank_snapshot_package: BankSnapshotPackage,
pub enqueued: Instant,
}
impl SnapshotPackage {
pub fn new(
snapshot_kind: SnapshotKind,
bank: &Bank,
snapshot_storages: Vec<Arc<AccountStorageEntry>>,
status_cache_slot_deltas: Vec<BankSlotDelta>,
) -> Self {
let slot = bank.slot();
if let SnapshotKind::Archive(SnapshotArchiveKind::Incremental(
incremental_snapshot_base_slot,
)) = snapshot_kind
{
assert!(
slot > incremental_snapshot_base_slot,
"Incremental snapshot base slot must be less than the bank being snapshotted!"
);
}
let bank_fields_to_serialize = bank.get_fields_to_serialize();
let hash = SnapshotHash::new(bank_fields_to_serialize.accounts_lt_hash.0.checksum());
let bank_snapshot_package = BankSnapshotPackage {
bank_fields: bank_fields_to_serialize,
bank_hash_stats: bank.get_bank_hash_stats(),
status_cache_slot_deltas,
};
Self {
snapshot_kind,
slot,
hash,
bank_snapshot_package,
snapshot_storages,
enqueued: Instant::now(),
}
}
}
#[cfg(feature = "dev-context-only-utils")]
impl SnapshotPackage {
pub fn default_for_tests() -> Self {
let bank_snapshot_package = BankSnapshotPackage {
bank_fields: BankFieldsToSerialize::default_for_tests(),
bank_hash_stats: BankHashStats::default(),
status_cache_slot_deltas: Vec::default(),
};
Self {
snapshot_kind: SnapshotKind::Archive(SnapshotArchiveKind::Full),
slot: Slot::default(),
hash: SnapshotHash(Hash::default()),
snapshot_storages: Vec::default(),
bank_snapshot_package,
enqueued: Instant::now(),
}
}
}
impl std::fmt::Debug for SnapshotPackage {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SnapshotPackage")
.field("kind", &self.snapshot_kind)
.field("slot", &self.slot)
.finish_non_exhaustive()
}
}
pub struct BankSnapshotPackage {
pub bank_fields: BankFieldsToSerialize,
pub bank_hash_stats: BankHashStats,
pub status_cache_slot_deltas: Vec<BankSlotDelta>,
}