From 41f30a2383ef58b76b2938a8914c908f62d8c180 Mon Sep 17 00:00:00 2001 From: "Jeff Washington (jwash)" Date: Mon, 23 May 2022 08:43:25 -0500 Subject: [PATCH] stop logging misleading bank hash mismatch (#25427) --- ledger/src/blockstore_processor.rs | 2 +- runtime/benches/accounts.rs | 3 ++- runtime/src/accounts.rs | 2 ++ runtime/src/accounts_db.rs | 30 ++++++++++++++++++------------ runtime/src/bank.rs | 24 +++++++++++++----------- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/ledger/src/blockstore_processor.rs b/ledger/src/blockstore_processor.rs index 8812fff24..3560de200 100644 --- a/ledger/src/blockstore_processor.rs +++ b/ledger/src/blockstore_processor.rs @@ -1346,7 +1346,7 @@ fn load_frozen_forks( if slot >= halt_at_slot { bank.force_flush_accounts_cache(); let can_cached_slot_be_unflushed = true; - let _ = bank.verify_bank_hash(false, can_cached_slot_be_unflushed); + let _ = bank.verify_bank_hash(false, can_cached_slot_be_unflushed, true); break; } } diff --git a/runtime/benches/accounts.rs b/runtime/benches/accounts.rs index 6166185f0..71c84e33b 100644 --- a/runtime/benches/accounts.rs +++ b/runtime/benches/accounts.rs @@ -124,7 +124,8 @@ fn test_accounts_hash_bank_hash(bencher: &mut Bencher) { test_hash_calculation, &EpochSchedule::default(), &RentCollector::default(), - false + false, + false, )) }); } diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index 9b2c317d8..26fda8e9b 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -796,6 +796,7 @@ impl Accounts { epoch_schedule: &EpochSchedule, rent_collector: &RentCollector, can_cached_slot_be_unflushed: bool, + ignore_mismatch: bool, ) -> bool { if let Err(err) = self.accounts_db.verify_bank_hash_and_lamports_new( slot, @@ -805,6 +806,7 @@ impl Accounts { epoch_schedule, rent_collector, can_cached_slot_be_unflushed, + ignore_mismatch, ) { warn!("verify_bank_hash failed: {:?}", err); false diff --git a/runtime/src/accounts_db.rs b/runtime/src/accounts_db.rs index e3c79af21..dac1b444e 100644 --- a/runtime/src/accounts_db.rs +++ b/runtime/src/accounts_db.rs @@ -6372,6 +6372,7 @@ impl AccountsDb { epoch_schedule, rent_collector, can_cached_slot_be_unflushed, + false, ) } @@ -6385,6 +6386,7 @@ impl AccountsDb { epoch_schedule: &EpochSchedule, rent_collector: &RentCollector, can_cached_slot_be_unflushed: bool, + ignore_mismatch: bool, ) -> Result<(), BankHashVerificationError> { use BankHashVerificationError::*; @@ -6415,19 +6417,23 @@ impl AccountsDb { return Err(MismatchedTotalLamports(calculated_lamports, total_lamports)); } - let bank_hashes = self.bank_hashes.read().unwrap(); - if let Some(found_hash_info) = bank_hashes.get(&slot) { - if calculated_hash == found_hash_info.snapshot_hash { - Ok(()) - } else { - warn!( - "mismatched bank hash for slot {}: {} (calculated) != {} (expected)", - slot, calculated_hash, found_hash_info.snapshot_hash - ); - Err(MismatchedBankHash) - } + if ignore_mismatch { + Ok(()) } else { - Err(MissingBankHash) + let bank_hashes = self.bank_hashes.read().unwrap(); + if let Some(found_hash_info) = bank_hashes.get(&slot) { + if calculated_hash == found_hash_info.snapshot_hash { + Ok(()) + } else { + warn!( + "mismatched bank hash for slot {}: {} (calculated) != {} (expected)", + slot, calculated_hash, found_hash_info.snapshot_hash + ); + Err(MismatchedBankHash) + } + } else { + Err(MissingBankHash) + } } } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index d4c0d09cc..437b51bd3 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -6330,6 +6330,7 @@ impl Bank { &self, test_hash_calculation: bool, can_cached_slot_be_unflushed: bool, + ignore_mismatch: bool, ) -> bool { self.rc.accounts.verify_bank_hash_and_lamports( self.slot(), @@ -6339,6 +6340,7 @@ impl Bank { self.epoch_schedule(), &self.rent_collector, can_cached_slot_be_unflushed, + ignore_mismatch, ) } @@ -6540,7 +6542,7 @@ impl Bank { let (mut verify, verify_time_us) = if !self.rc.accounts.accounts_db.skip_initial_hash_calc { info!("verify_bank_hash.."); let mut verify_time = Measure::start("verify_bank_hash"); - let verify = self.verify_bank_hash(test_hash_calculation, false); + let verify = self.verify_bank_hash(test_hash_calculation, false, false); verify_time.stop(); (verify, verify_time.as_us()) } else { @@ -9641,17 +9643,17 @@ pub(crate) mod tests { assert_eq!(bank0.get_account(&keypair.pubkey()).unwrap().lamports(), 10); assert_eq!(bank1.get_account(&keypair.pubkey()), None); - assert!(bank0.verify_bank_hash(true, false)); + assert!(bank0.verify_bank_hash(true, false, false)); // Squash and then verify hash_internal value bank0.freeze(); bank0.squash(); - assert!(bank0.verify_bank_hash(true, false)); + assert!(bank0.verify_bank_hash(true, false, false)); bank1.freeze(); bank1.squash(); bank1.update_accounts_hash(); - assert!(bank1.verify_bank_hash(true, false)); + assert!(bank1.verify_bank_hash(true, false, false)); // keypair should have 0 tokens on both forks assert_eq!(bank0.get_account(&keypair.pubkey()), None); @@ -9659,7 +9661,7 @@ pub(crate) mod tests { bank1.force_flush_accounts_cache(); bank1.clean_accounts(false, false, None); - assert!(bank1.verify_bank_hash(true, false)); + assert!(bank1.verify_bank_hash(true, false, false)); } #[test] @@ -10721,7 +10723,7 @@ pub(crate) mod tests { info!("transfer 2 {}", pubkey2); bank2.transfer(10, &mint_keypair, &pubkey2).unwrap(); bank2.update_accounts_hash(); - assert!(bank2.verify_bank_hash(true, false)); + assert!(bank2.verify_bank_hash(true, false, false)); } #[test] @@ -10745,19 +10747,19 @@ pub(crate) mod tests { // Checkpointing should never modify the checkpoint's state once frozen let bank0_state = bank0.hash_internal_state(); bank2.update_accounts_hash(); - assert!(bank2.verify_bank_hash(true, false)); + assert!(bank2.verify_bank_hash(true, false, false)); let bank3 = Bank::new_from_parent(&bank0, &solana_sdk::pubkey::new_rand(), 2); assert_eq!(bank0_state, bank0.hash_internal_state()); - assert!(bank2.verify_bank_hash(true, false)); + assert!(bank2.verify_bank_hash(true, false, false)); bank3.update_accounts_hash(); - assert!(bank3.verify_bank_hash(true, false)); + assert!(bank3.verify_bank_hash(true, false, false)); let pubkey2 = solana_sdk::pubkey::new_rand(); info!("transfer 2 {}", pubkey2); bank2.transfer(10, &mint_keypair, &pubkey2).unwrap(); bank2.update_accounts_hash(); - assert!(bank2.verify_bank_hash(true, false)); - assert!(bank3.verify_bank_hash(true, false)); + assert!(bank2.verify_bank_hash(true, false, false)); + assert!(bank3.verify_bank_hash(true, false, false)); } #[test]