test_add_instruction_processor_for_existing_unrelated_accounts works with write cache (#29031)

This commit is contained in:
Jeff Washington (jwash) 2022-12-02 10:04:34 -06:00 committed by GitHub
parent 0475c2f0af
commit 911a8d2a4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 78 additions and 63 deletions

View File

@ -12888,75 +12888,90 @@ pub(crate) mod tests {
#[test] #[test]
fn test_add_instruction_processor_for_existing_unrelated_accounts() { fn test_add_instruction_processor_for_existing_unrelated_accounts() {
let mut bank = create_simple_test_bank(500); for pass in 0..5 {
let mut bank = create_simple_test_bank(500);
fn mock_ix_processor( fn mock_ix_processor(
_first_instruction_account: IndexOfAccount, _first_instruction_account: IndexOfAccount,
_invoke_context: &mut InvokeContext, _invoke_context: &mut InvokeContext,
) -> std::result::Result<(), InstructionError> { ) -> std::result::Result<(), InstructionError> {
Err(InstructionError::Custom(42)) Err(InstructionError::Custom(42))
} }
// Non-builtin loader accounts can not be used for instruction processing // Non-builtin loader accounts can not be used for instruction processing
{ {
let stakes = bank.stakes_cache.stakes(); let stakes = bank.stakes_cache.stakes();
assert!(stakes.vote_accounts().as_ref().is_empty()); assert!(stakes.vote_accounts().as_ref().is_empty());
} }
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty()); assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
assert_eq!(bank.calculate_capitalization(true), bank.capitalization()); if pass == 0 {
add_root_and_flush_write_cache(&bank);
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
continue;
}
let ((vote_id, vote_account), (stake_id, stake_account)) = let ((vote_id, vote_account), (stake_id, stake_account)) =
crate::stakes::tests::create_staked_node_accounts(1_0000); crate::stakes::tests::create_staked_node_accounts(1_0000);
bank.capitalization bank.capitalization
.fetch_add(vote_account.lamports() + stake_account.lamports(), Relaxed); .fetch_add(vote_account.lamports() + stake_account.lamports(), Relaxed);
bank.store_account(&vote_id, &vote_account); bank.store_account(&vote_id, &vote_account);
bank.store_account(&stake_id, &stake_account); bank.store_account(&stake_id, &stake_account);
{ {
let stakes = bank.stakes_cache.stakes(); let stakes = bank.stakes_cache.stakes();
assert!(!stakes.vote_accounts().as_ref().is_empty()); assert!(!stakes.vote_accounts().as_ref().is_empty());
} }
assert!(!bank.stakes_cache.stakes().stake_delegations().is_empty()); assert!(!bank.stakes_cache.stakes().stake_delegations().is_empty());
assert_eq!(bank.calculate_capitalization(true), bank.capitalization()); if pass == 1 {
add_root_and_flush_write_cache(&bank);
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
continue;
}
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor); bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor); bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
{ {
let stakes = bank.stakes_cache.stakes(); let stakes = bank.stakes_cache.stakes();
assert!(stakes.vote_accounts().as_ref().is_empty()); assert!(stakes.vote_accounts().as_ref().is_empty());
} }
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty()); assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
assert_eq!(bank.calculate_capitalization(true), bank.capitalization()); if pass == 2 {
assert_eq!( add_root_and_flush_write_cache(&bank);
"mock_program1", assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data()) continue;
); }
assert_eq!( assert_eq!(
"mock_program2", "mock_program1",
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data()) String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
); );
assert_eq!(
"mock_program2",
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
);
// Re-adding builtin programs should be no-op // Re-adding builtin programs should be no-op
bank.update_accounts_hash_for_tests(); bank.update_accounts_hash_for_tests();
let old_hash = bank.get_accounts_hash(); let old_hash = bank.get_accounts_hash();
bank.add_builtin("mock_program1", &vote_id, mock_ix_processor); bank.add_builtin("mock_program1", &vote_id, mock_ix_processor);
bank.add_builtin("mock_program2", &stake_id, mock_ix_processor); bank.add_builtin("mock_program2", &stake_id, mock_ix_processor);
bank.update_accounts_hash_for_tests(); add_root_and_flush_write_cache(&bank);
let new_hash = bank.get_accounts_hash(); bank.update_accounts_hash_for_tests();
assert_eq!(old_hash, new_hash); let new_hash = bank.get_accounts_hash();
{ assert_eq!(old_hash, new_hash);
let stakes = bank.stakes_cache.stakes(); {
assert!(stakes.vote_accounts().as_ref().is_empty()); let stakes = bank.stakes_cache.stakes();
assert!(stakes.vote_accounts().as_ref().is_empty());
}
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
assert_eq!(
"mock_program1",
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
);
assert_eq!(
"mock_program2",
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
);
} }
assert!(bank.stakes_cache.stakes().stake_delegations().is_empty());
assert_eq!(bank.calculate_capitalization(true), bank.capitalization());
assert_eq!(
"mock_program1",
String::from_utf8_lossy(bank.get_account(&vote_id).unwrap_or_default().data())
);
assert_eq!(
"mock_program2",
String::from_utf8_lossy(bank.get_account(&stake_id).unwrap_or_default().data())
);
} }
#[allow(deprecated)] #[allow(deprecated)]