From 560ec08d5e7e97b2179857b3f2cc0ec66b1c38d2 Mon Sep 17 00:00:00 2001 From: Brooks Date: Mon, 13 Mar 2023 17:44:34 -0400 Subject: [PATCH] AccountsHashVerifier writes BankIncrementalSnapshotPersistence (#30587) --- core/src/accounts_hash_verifier.rs | 28 +++++++++++++++++++++++++++- runtime/src/serde_snapshot.rs | 5 ++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/src/accounts_hash_verifier.rs b/core/src/accounts_hash_verifier.rs index 22c5b027d1..d75e0fd2ee 100644 --- a/core/src/accounts_hash_verifier.rs +++ b/core/src/accounts_hash_verifier.rs @@ -10,6 +10,8 @@ use { solana_measure::{measure::Measure, measure_us}, solana_runtime::{ accounts_hash::{AccountsHashEnum, CalcAccountsHashConfig, HashStats}, + bank::BankIncrementalSnapshotPersistence, + serde_snapshot::SerdeIncrementalAccountsHash, snapshot_config::SnapshotConfig, snapshot_package::{ self, retain_max_n_elements, AccountsPackage, AccountsPackageType, SnapshotPackage, @@ -303,12 +305,36 @@ impl AccountsHashVerifier { ); measure_hash.stop(); + + let bank_incremental_snapshot_persistence = if let AccountsPackageType::Snapshot( + SnapshotType::IncrementalSnapshot(base_slot), + ) = accounts_package.package_type + { + let (full_accounts_hash, full_capitalization) = accounts_package + .accounts + .accounts_db + .get_accounts_hash(base_slot) + .expect("incremental snapshot requires accounts hash and capitalization from its full snapshot"); + Some(BankIncrementalSnapshotPersistence { + full_slot: base_slot, + full_hash: full_accounts_hash.into(), + full_capitalization, + // NOTE: The value for the incremental accounts hash is actually a *full* accounts + // hash here. Once an incremental accounts hash is calculated for incremental + // snapshots, this value will be corrected. + incremental_hash: SerdeIncrementalAccountsHash(accounts_hash.0), + incremental_capitalization: lamports, + }) + } else { + None + }; + if let Some(snapshot_info) = &accounts_package.snapshot_info { solana_runtime::serde_snapshot::reserialize_bank_with_new_accounts_hash( snapshot_info.snapshot_links.path(), accounts_package.slot, &accounts_hash, - None, + bank_incremental_snapshot_persistence.as_ref(), ); } diff --git a/runtime/src/serde_snapshot.rs b/runtime/src/serde_snapshot.rs index c7191b09fe..215f899f99 100644 --- a/runtime/src/serde_snapshot.rs +++ b/runtime/src/serde_snapshot.rs @@ -60,9 +60,12 @@ mod utils; // a number of test cases in accounts_db use this #[cfg(test)] pub(crate) use tests::reconstruct_accounts_db_via_serialization; +// NOTE: AHV currently needs `SerdeIncrmentalAccountsHash`, which is why this `use` is not +// `pub(crate)`. Once AHV calculates incremental accounts hashes, this can be reverted. +pub use types::SerdeIncrementalAccountsHash; pub(crate) use { storage::SerializedAppendVecId, - types::{SerdeAccountsDeltaHash, SerdeAccountsHash, SerdeIncrementalAccountsHash}, + types::{SerdeAccountsDeltaHash, SerdeAccountsHash}, }; #[derive(Copy, Clone, Eq, PartialEq)]