Use BankForks on tests - Part 2 (#34234)

* Use BankForks on tests - Part 2

Signed-off-by: Lucas Steuernagel <lucas.tnagel@gmail.com>
This commit is contained in:
Lucas Steuernagel 2023-11-29 14:28:31 -03:00 committed by GitHub
parent e1165aaf00
commit aeb4a348fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 366 additions and 199 deletions

View File

@ -966,7 +966,7 @@ pub(super) enum RewardInterval {
}
impl Bank {
fn wrap_with_bank_forks_for_tests(self) -> (Arc<Self>, Arc<RwLock<BankForks>>) {
pub(super) fn wrap_with_bank_forks_for_tests(self) -> (Arc<Self>, Arc<RwLock<BankForks>>) {
let bank_fork = BankForks::new_rw_arc(self);
let bank_arc = bank_fork.read().unwrap().root_bank();
bank_arc

File diff suppressed because it is too large Load Diff

View File

@ -361,8 +361,8 @@ mod tests {
let jane_doe_keypair = Keypair::new();
let jane_pubkey = jane_doe_keypair.pubkey();
let doe_keypairs = vec![&john_doe_keypair, &jane_doe_keypair];
let bank = Bank::new_for_tests(&genesis_config);
let bank_client = BankClient::new(bank);
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let bank_client = BankClient::new_shared(bank);
let amount = genesis_config.rent.minimum_balance(0);
// Create 2-2 Multisig Transfer instruction.

View File

@ -1249,6 +1249,7 @@ mod tests {
use {
super::*,
crate::{
bank_forks::BankForks,
genesis_utils,
snapshot_utils::{
clean_orphaned_account_snapshot_dirs, create_all_accounts_run_and_snapshot_dirs,
@ -1272,9 +1273,23 @@ mod tests {
system_transaction,
transaction::SanitizedTransaction,
},
std::sync::{atomic::Ordering, Arc},
std::sync::{atomic::Ordering, Arc, RwLock},
};
fn new_bank_from_parent_with_bank_forks(
bank_forks: &RwLock<BankForks>,
parent: Arc<Bank>,
collector_id: &Pubkey,
slot: Slot,
) -> Arc<Bank> {
let bank = Bank::new_from_parent(parent, collector_id, slot);
bank_forks
.write()
.unwrap()
.insert(bank)
.clone_without_scheduler()
}
/// Test roundtrip of bank to a full snapshot, then back again. This test creates the simplest
/// bank possible, so the contents of the snapshot archive will be quite minimal.
#[test]
@ -1342,7 +1357,7 @@ mod tests {
let key5 = Keypair::new();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
bank0
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1357,7 +1372,8 @@ mod tests {
}
let slot = 1;
let bank1 = Arc::new(Bank::new_from_parent(bank0, &collector, slot));
let bank1 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
bank1
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
.unwrap();
@ -1372,7 +1388,8 @@ mod tests {
}
let slot = slot + 1;
let bank2 = Arc::new(Bank::new_from_parent(bank1, &collector, slot));
let bank2 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank1, &collector, slot);
bank2
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1381,7 +1398,8 @@ mod tests {
}
let slot = slot + 1;
let bank3 = Arc::new(Bank::new_from_parent(bank2, &collector, slot));
let bank3 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank2, &collector, slot);
bank3
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1390,7 +1408,8 @@ mod tests {
}
let slot = slot + 1;
let bank4 = Arc::new(Bank::new_from_parent(bank3, &collector, slot));
let bank4 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank3, &collector, slot);
bank4
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1460,7 +1479,7 @@ mod tests {
let key5 = Keypair::new();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
bank0
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1475,7 +1494,8 @@ mod tests {
}
let slot = 1;
let bank1 = Arc::new(Bank::new_from_parent(bank0, &collector, slot));
let bank1 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
bank1
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
.unwrap();
@ -1509,7 +1529,8 @@ mod tests {
.unwrap();
let slot = slot + 1;
let bank2 = Arc::new(Bank::new_from_parent(bank1, &collector, slot));
let bank2 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank1, &collector, slot);
bank2
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1518,7 +1539,8 @@ mod tests {
}
let slot = slot + 1;
let bank3 = Arc::new(Bank::new_from_parent(bank2, &collector, slot));
let bank3 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank2, &collector, slot);
bank3
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1527,7 +1549,8 @@ mod tests {
}
let slot = slot + 1;
let bank4 = Arc::new(Bank::new_from_parent(bank3, &collector, slot));
let bank4 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank3, &collector, slot);
bank4
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1582,7 +1605,7 @@ mod tests {
let key3 = Keypair::new();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
bank0
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1597,7 +1620,8 @@ mod tests {
}
let slot = 1;
let bank1 = Arc::new(Bank::new_from_parent(bank0, &collector, slot));
let bank1 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
bank1
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1631,7 +1655,8 @@ mod tests {
.unwrap();
let slot = slot + 1;
let bank2 = Arc::new(Bank::new_from_parent(bank1, &collector, slot));
let bank2 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank1, &collector, slot);
bank2
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -1640,7 +1665,8 @@ mod tests {
}
let slot = slot + 1;
let bank3 = Arc::new(Bank::new_from_parent(bank2, &collector, slot));
let bank3 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank2, &collector, slot);
bank3
.transfer(sol_to_lamports(2.), &mint_keypair, &key2.pubkey())
.unwrap();
@ -1649,7 +1675,8 @@ mod tests {
}
let slot = slot + 1;
let bank4 = Arc::new(Bank::new_from_parent(bank3, &collector, slot));
let bank4 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank3, &collector, slot);
bank4
.transfer(sol_to_lamports(3.), &mint_keypair, &key3.pubkey())
.unwrap();
@ -1732,13 +1759,14 @@ mod tests {
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
let lamports_to_transfer = sol_to_lamports(123_456.);
let bank0 = Arc::new(Bank::new_with_paths_for_tests(
let (bank0, bank_forks) = Bank::new_with_paths_for_tests(
&genesis_config,
Arc::<RuntimeConfig>::default(),
vec![accounts_dir.clone()],
AccountSecondaryIndexes::default(),
AccountShrinkThreshold::default(),
));
)
.wrap_with_bank_forks_for_tests();
bank0
.transfer(lamports_to_transfer, &mint_keypair, &key2.pubkey())
.unwrap();
@ -1747,7 +1775,8 @@ mod tests {
}
let slot = 1;
let bank1 = Arc::new(Bank::new_from_parent(bank0, &collector, slot));
let bank1 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
bank1
.transfer(lamports_to_transfer, &key2, &key1.pubkey())
.unwrap();
@ -1769,7 +1798,8 @@ mod tests {
.unwrap();
let slot = slot + 1;
let bank2 = Arc::new(Bank::new_from_parent(bank1, &collector, slot));
let bank2 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank1, &collector, slot);
let blockhash = bank2.last_blockhash();
let tx = SanitizedTransaction::from_transaction_for_tests(system_transaction::transfer(
&key1,
@ -1836,7 +1866,8 @@ mod tests {
);
let slot = slot + 1;
let bank3 = Arc::new(Bank::new_from_parent(bank2, &collector, slot));
let bank3 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank2, &collector, slot);
// Update Account2 so that it no longer holds a reference to slot2
bank3
.transfer(lamports_to_transfer, &mint_keypair, &key2.pubkey())
@ -1846,7 +1877,8 @@ mod tests {
}
let slot = slot + 1;
let bank4 = Arc::new(Bank::new_from_parent(bank3, &collector, slot));
let bank4 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank3, &collector, slot);
while !bank4.is_complete() {
bank4.register_unique_tick();
}
@ -1914,13 +1946,14 @@ mod tests {
let key1 = Keypair::new();
let (genesis_config, mint_keypair) = create_genesis_config(sol_to_lamports(1_000_000.));
let bank0 = Arc::new(Bank::new_for_tests(&genesis_config));
let (bank0, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
while !bank0.is_complete() {
bank0.register_unique_tick();
}
let slot = 1;
let bank1 = Arc::new(Bank::new_from_parent(bank0, &collector, slot));
let bank1 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank0, &collector, slot);
while !bank1.is_complete() {
bank1.register_unique_tick();
}
@ -1942,7 +1975,8 @@ mod tests {
.unwrap();
let slot = slot + 1;
let bank2 = Arc::new(Bank::new_from_parent(bank1, &collector, slot));
let bank2 =
new_bank_from_parent_with_bank_forks(bank_forks.as_ref(), bank1, &collector, slot);
bank2
.transfer(sol_to_lamports(1.), &mint_keypair, &key1.pubkey())
.unwrap();
@ -2181,12 +2215,18 @@ mod tests {
bank.fill_bank_with_ticks_for_tests();
};
let mut bank = Arc::new(Bank::new_for_tests(&genesis_config_info.genesis_config));
let (mut bank, bank_forks) =
Bank::new_with_bank_forks_for_tests(&genesis_config_info.genesis_config);
// make some banks, do some transactions, ensure there's some zero-lamport accounts
for _ in 0..5 {
let slot = bank.slot() + 1;
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::new_unique(), slot));
bank = new_bank_from_parent_with_bank_forks(
bank_forks.as_ref(),
bank,
&Pubkey::new_unique(),
slot,
);
do_transfers(&bank);
}
@ -2212,7 +2252,12 @@ mod tests {
// make more banks, do more transactions, ensure there's more zero-lamport accounts
for _ in 0..5 {
let slot = bank.slot() + 1;
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::new_unique(), slot));
bank = new_bank_from_parent_with_bank_forks(
bank_forks.as_ref(),
bank,
&Pubkey::new_unique(),
slot,
);
do_transfers(&bank);
}

View File

@ -5,12 +5,14 @@ use {
solana_runtime::{
bank::Bank,
bank_client::BankClient,
bank_forks::BankForks,
genesis_utils::{create_genesis_config_with_leader, GenesisConfigInfo},
},
solana_sdk::{
account::from_account,
account_utils::StateMut,
client::SyncClient,
clock::Slot,
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
hash::Hash,
message::Message,
@ -28,19 +30,37 @@ use {
vote_instruction,
vote_state::{Vote, VoteInit, VoteState, VoteStateVersions},
},
std::sync::Arc,
std::sync::{Arc, RwLock},
};
fn new_bank_from_parent_with_bank_forks(
bank_forks: &RwLock<BankForks>,
parent: Arc<Bank>,
collector_id: &Pubkey,
slot: Slot,
) -> Arc<Bank> {
let bank = Bank::new_from_parent(parent, collector_id, slot);
bank_forks
.write()
.unwrap()
.insert(bank)
.clone_without_scheduler()
}
/// get bank at next epoch + `n` slots
fn next_epoch_and_n_slots(bank: Arc<Bank>, mut n: usize) -> Arc<Bank> {
fn next_epoch_and_n_slots(
bank: Arc<Bank>,
bank_forks: &RwLock<BankForks>,
mut n: usize,
) -> Arc<Bank> {
bank.squash();
let slot = bank.get_slots_in_epoch(bank.epoch()) + bank.slot();
let mut bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
let mut bank = new_bank_from_parent_with_bank_forks(bank_forks, bank, &Pubkey::default(), slot);
while n > 0 {
bank.squash();
let slot = bank.slot() + 1;
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
bank = new_bank_from_parent_with_bank_forks(bank_forks, bank, &Pubkey::default(), slot);
n -= 1;
}
@ -49,6 +69,7 @@ fn next_epoch_and_n_slots(bank: Arc<Bank>, mut n: usize) -> Arc<Bank> {
fn fill_epoch_with_votes(
mut bank: Arc<Bank>,
bank_forks: &RwLock<BankForks>,
vote_keypair: &Keypair,
mint_keypair: &Keypair,
) -> Arc<Bank> {
@ -58,7 +79,7 @@ fn fill_epoch_with_votes(
while bank.epoch() != old_epoch + 1 {
bank.squash();
let slot = bank.slot() + 1;
bank = Arc::new(Bank::new_from_parent(bank, &Pubkey::default(), slot));
bank = new_bank_from_parent_with_bank_forks(bank_forks, bank, &Pubkey::default(), slot);
let bank_client = BankClient::new_shared(bank.clone());
let parent = bank.parent().unwrap();
@ -125,7 +146,7 @@ fn test_stake_create_and_split_single_signature() {
let staker_pubkey = staker_keypair.pubkey();
let bank = Arc::new(Bank::new_for_tests(&genesis_config));
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let bank_client = BankClient::new_shared(bank.clone());
let stake_address =
@ -201,7 +222,7 @@ fn test_stake_create_and_split_to_existing_system_account() {
let staker_pubkey = staker_keypair.pubkey();
let bank = Arc::new(Bank::new_for_tests(&genesis_config));
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let bank_client = BankClient::new_shared(bank.clone());
let stake_address =
@ -288,9 +309,8 @@ fn test_stake_account_lifetime() {
);
genesis_config.epoch_schedule = EpochSchedule::new(MINIMUM_SLOTS_PER_EPOCH);
genesis_config.rent = Rent::default();
let bank = Bank::new_for_tests(&genesis_config);
let (mut bank, bank_forks) = Bank::new_with_bank_forks_for_tests(&genesis_config);
let mint_pubkey = mint_keypair.pubkey();
let mut bank = Arc::new(bank);
// Need to set the EAH to Valid so that `Bank::new_from_parent()` doesn't panic during freeze
// when parent is in the EAH calculation window.
bank.rc
@ -392,12 +412,12 @@ fn test_stake_account_lifetime() {
break;
}
// Cycle thru banks until we're fully warmed up
bank = next_epoch_and_n_slots(bank, 0);
bank = next_epoch_and_n_slots(bank, bank_forks.as_ref(), 0);
}
// Reward redemption
// Submit enough votes to generate rewards
bank = fill_epoch_with_votes(bank, &vote_keypair, &mint_keypair);
bank = fill_epoch_with_votes(bank, bank_forks.as_ref(), &vote_keypair, &mint_keypair);
// Test that votes and credits are there
let account = bank.get_account(&vote_pubkey).expect("account not found");
@ -410,13 +430,13 @@ fn test_stake_account_lifetime() {
// one vote per slot, might be more slots than 32 in the epoch
assert!(vote_state.credits() >= 1);
bank = fill_epoch_with_votes(bank, &vote_keypair, &mint_keypair);
bank = fill_epoch_with_votes(bank, bank_forks.as_ref(), &vote_keypair, &mint_keypair);
let pre_staked = get_staked(&bank, &stake_pubkey);
let pre_balance = bank.get_balance(&stake_pubkey);
// next epoch bank plus one additional slot should pay rewards
bank = next_epoch_and_n_slots(bank, 1);
bank = next_epoch_and_n_slots(bank, bank_forks.as_ref(), 1);
// Test that balance increased, and that the balance got staked
let staked = get_staked(&bank, &stake_pubkey);
@ -490,7 +510,7 @@ fn test_stake_account_lifetime() {
.send_and_confirm_message(&[&mint_keypair, &stake_keypair], message)
.is_err());
let mut bank = next_epoch_and_n_slots(bank, 1);
let mut bank = next_epoch_and_n_slots(bank, bank_forks.as_ref(), 1);
let bank_client = BankClient::new_shared(bank.clone());
@ -536,7 +556,7 @@ fn test_stake_account_lifetime() {
if get_staked(&bank, &split_stake_pubkey) == 0 {
break;
}
bank = next_epoch_and_n_slots(bank, 1);
bank = next_epoch_and_n_slots(bank, bank_forks.as_ref(), 1);
}
let bank_client = BankClient::new_shared(bank.clone());
@ -577,9 +597,8 @@ fn test_create_stake_account_from_seed() {
&solana_sdk::pubkey::new_rand(),
1_000_000,
);
let bank = Bank::new_for_tests(&genesis_config);
let bank = Bank::new_with_bank_forks_for_tests(&genesis_config).0;
let mint_pubkey = mint_keypair.pubkey();
let bank = Arc::new(bank);
let bank_client = BankClient::new_shared(bank.clone());
let seed = "test-string";