Update all BankForks methods to return owned values (#24801)
This commit is contained in:
parent
b22a14ca68
commit
4e58b3870c
|
@ -125,7 +125,7 @@ fn test_account_subscription() {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bob = Keypair::new();
|
let bob = Keypair::new();
|
||||||
|
@ -331,7 +331,7 @@ fn test_program_subscription() {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bob = Keypair::new();
|
let bob = Keypair::new();
|
||||||
|
@ -418,7 +418,7 @@ fn test_root_subscription() {
|
||||||
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000);
|
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000);
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
||||||
|
|
|
@ -70,12 +70,7 @@ fn bench_generate_ancestors_descendants(bench: &mut Bencher) {
|
||||||
bench.iter(move || {
|
bench.iter(move || {
|
||||||
for _ in 0..num_banks {
|
for _ in 0..num_banks {
|
||||||
let _ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let _ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let _descendants = vote_simulator
|
let _descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1442,7 +1442,7 @@ mod test {
|
||||||
ReplayStage::dump_then_repair_correct_slots(
|
ReplayStage::dump_then_repair_correct_slots(
|
||||||
&mut duplicate_slots_to_repair,
|
&mut duplicate_slots_to_repair,
|
||||||
&mut bank_forks.read().unwrap().ancestors(),
|
&mut bank_forks.read().unwrap().ancestors(),
|
||||||
&mut bank_forks.read().unwrap().descendants().clone(),
|
&mut bank_forks.read().unwrap().descendants(),
|
||||||
&mut progress,
|
&mut progress,
|
||||||
&bank_forks,
|
&bank_forks,
|
||||||
&requester_blockstore,
|
&requester_blockstore,
|
||||||
|
|
|
@ -1362,7 +1362,7 @@ mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let vote_tracker = VoteTracker::default();
|
let vote_tracker = VoteTracker::default();
|
||||||
let optimistically_confirmed_bank =
|
let optimistically_confirmed_bank =
|
||||||
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks);
|
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks);
|
||||||
|
@ -1473,7 +1473,7 @@ mod tests {
|
||||||
let vote_tracker = VoteTracker::default();
|
let vote_tracker = VoteTracker::default();
|
||||||
let exit = Arc::new(AtomicBool::new(false));
|
let exit = Arc::new(AtomicBool::new(false));
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let optimistically_confirmed_bank =
|
let optimistically_confirmed_bank =
|
||||||
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks);
|
OptimisticallyConfirmedBank::locked_from_bank_forks_root(&bank_forks);
|
||||||
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
||||||
|
|
|
@ -1336,14 +1336,7 @@ mod test {
|
||||||
// Create simple fork 0 -> 1 -> 2 -> 3
|
// Create simple fork 0 -> 1 -> 2 -> 3
|
||||||
let forks = tr(0) / (tr(1) / (tr(2) / tr(3)));
|
let forks = tr(0) / (tr(1) / (tr(2) / tr(3)));
|
||||||
let (vote_simulator, blockstore) = setup_forks_from_tree(forks, 1, None);
|
let (vote_simulator, blockstore) = setup_forks_from_tree(forks, 1, None);
|
||||||
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
let descendants = vote_simulator
|
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
|
|
||||||
InitialState {
|
InitialState {
|
||||||
heaviest_subtree_fork_choice: vote_simulator.heaviest_subtree_fork_choice,
|
heaviest_subtree_fork_choice: vote_simulator.heaviest_subtree_fork_choice,
|
||||||
progress: vote_simulator.progress,
|
progress: vote_simulator.progress,
|
||||||
|
|
|
@ -516,7 +516,7 @@ mod tests {
|
||||||
// Create enough banks such that vote account will root slots 0 and 1
|
// Create enough banks such that vote account will root slots 0 and 1
|
||||||
for x in 0..33 {
|
for x in 0..33 {
|
||||||
let previous_bank = bank_forks.get(x).unwrap();
|
let previous_bank = bank_forks.get(x).unwrap();
|
||||||
let bank = Bank::new_from_parent(previous_bank, &Pubkey::default(), x + 1);
|
let bank = Bank::new_from_parent(&previous_bank, &Pubkey::default(), x + 1);
|
||||||
let vote = vote_transaction::new_vote_transaction(
|
let vote = vote_transaction::new_vote_transaction(
|
||||||
vec![x],
|
vec![x],
|
||||||
previous_bank.hash(),
|
previous_bank.hash(),
|
||||||
|
@ -541,7 +541,7 @@ mod tests {
|
||||||
|
|
||||||
// Add an additional bank/vote that will root slot 2
|
// Add an additional bank/vote that will root slot 2
|
||||||
let bank33 = bank_forks.get(33).unwrap();
|
let bank33 = bank_forks.get(33).unwrap();
|
||||||
let bank34 = Bank::new_from_parent(bank33, &Pubkey::default(), 34);
|
let bank34 = Bank::new_from_parent(&bank33, &Pubkey::default(), 34);
|
||||||
let vote33 = vote_transaction::new_vote_transaction(
|
let vote33 = vote_transaction::new_vote_transaction(
|
||||||
vec![33],
|
vec![33],
|
||||||
bank33.hash(),
|
bank33.hash(),
|
||||||
|
@ -584,7 +584,7 @@ mod tests {
|
||||||
// Add a forked bank. Because the vote for bank 33 landed in the non-ancestor, the vote
|
// Add a forked bank. Because the vote for bank 33 landed in the non-ancestor, the vote
|
||||||
// account's root (and thus the highest_confirmed_root) rolls back to slot 1
|
// account's root (and thus the highest_confirmed_root) rolls back to slot 1
|
||||||
let bank33 = bank_forks.get(33).unwrap();
|
let bank33 = bank_forks.get(33).unwrap();
|
||||||
let bank35 = Bank::new_from_parent(bank33, &Pubkey::default(), 35);
|
let bank35 = Bank::new_from_parent(&bank33, &Pubkey::default(), 35);
|
||||||
bank_forks.insert(bank35);
|
bank_forks.insert(bank35);
|
||||||
|
|
||||||
let working_bank = bank_forks.working_bank();
|
let working_bank = bank_forks.working_bank();
|
||||||
|
@ -609,7 +609,7 @@ mod tests {
|
||||||
// continues normally
|
// continues normally
|
||||||
for x in 35..=37 {
|
for x in 35..=37 {
|
||||||
let previous_bank = bank_forks.get(x).unwrap();
|
let previous_bank = bank_forks.get(x).unwrap();
|
||||||
let bank = Bank::new_from_parent(previous_bank, &Pubkey::default(), x + 1);
|
let bank = Bank::new_from_parent(&previous_bank, &Pubkey::default(), x + 1);
|
||||||
let vote = vote_transaction::new_vote_transaction(
|
let vote = vote_transaction::new_vote_transaction(
|
||||||
vec![x],
|
vec![x],
|
||||||
previous_bank.hash(),
|
previous_bank.hash(),
|
||||||
|
|
|
@ -244,8 +244,7 @@ impl Tower {
|
||||||
.get_with_checked_hash((best_slot, best_hash))
|
.get_with_checked_hash((best_slot, best_hash))
|
||||||
.expect(
|
.expect(
|
||||||
"The best overall slot must be one of `frozen_banks` which all exist in bank_forks",
|
"The best overall slot must be one of `frozen_banks` which all exist in bank_forks",
|
||||||
)
|
);
|
||||||
.clone();
|
|
||||||
|
|
||||||
Self::new(node_pubkey, vote_account, root, &heaviest_bank)
|
Self::new(node_pubkey, vote_account, root, &heaviest_bank)
|
||||||
}
|
}
|
||||||
|
@ -1522,13 +1521,7 @@ pub mod test {
|
||||||
// Init state
|
// Init state
|
||||||
assert!(num_accounts > 1);
|
assert!(num_accounts > 1);
|
||||||
let mut vote_simulator = VoteSimulator::new(num_accounts);
|
let mut vote_simulator = VoteSimulator::new(num_accounts);
|
||||||
let bank0 = vote_simulator
|
let bank0 = vote_simulator.bank_forks.read().unwrap().get(0).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(0)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
let total_stake = bank0.total_epoch_stake();
|
let total_stake = bank0.total_epoch_stake();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
total_stake,
|
total_stake,
|
||||||
|
@ -1560,12 +1553,7 @@ pub mod test {
|
||||||
fn run_test_switch_threshold_duplicate_rollback(should_panic: bool) {
|
fn run_test_switch_threshold_duplicate_rollback(should_panic: bool) {
|
||||||
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
let mut tower = Tower::default();
|
let mut tower = Tower::default();
|
||||||
|
|
||||||
// Last vote is 47
|
// Last vote is 47
|
||||||
|
@ -1666,12 +1654,7 @@ pub mod test {
|
||||||
fn test_switch_threshold() {
|
fn test_switch_threshold() {
|
||||||
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let mut descendants = vote_simulator
|
let mut descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
let mut tower = Tower::default();
|
let mut tower = Tower::default();
|
||||||
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
||||||
|
|
||||||
|
@ -1819,12 +1802,7 @@ pub mod test {
|
||||||
tower.vote_state.root_slot = Some(43);
|
tower.vote_state.root_slot = Some(43);
|
||||||
// Refresh ancestors and descendants for new root.
|
// Refresh ancestors and descendants for new root.
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
tower.check_switch_threshold(
|
tower.check_switch_threshold(
|
||||||
|
@ -1846,12 +1824,7 @@ pub mod test {
|
||||||
let num_validators = 2;
|
let num_validators = 2;
|
||||||
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
let (bank0, mut vote_simulator, total_stake) = setup_switch_test(2);
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
let mut tower = Tower::default();
|
let mut tower = Tower::default();
|
||||||
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
||||||
|
|
||||||
|
@ -1927,12 +1900,7 @@ pub mod test {
|
||||||
// included in the switching proof
|
// included in the switching proof
|
||||||
vote_simulator.set_root(44);
|
vote_simulator.set_root(44);
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
tower.check_switch_threshold(
|
tower.check_switch_threshold(
|
||||||
110,
|
110,
|
||||||
|
@ -2574,13 +2542,7 @@ pub mod test {
|
||||||
// Init state
|
// Init state
|
||||||
let mut vote_simulator = VoteSimulator::new(2);
|
let mut vote_simulator = VoteSimulator::new(2);
|
||||||
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
||||||
let bank0 = vote_simulator
|
let bank0 = vote_simulator.bank_forks.read().unwrap().get(0).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(0)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
let total_stake = bank0.total_epoch_stake();
|
let total_stake = bank0.total_epoch_stake();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
total_stake,
|
total_stake,
|
||||||
|
@ -2605,12 +2567,7 @@ pub mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
let mut tower = Tower::default();
|
let mut tower = Tower::default();
|
||||||
|
|
||||||
tower.record_vote(43, Hash::default());
|
tower.record_vote(43, Hash::default());
|
||||||
|
@ -2679,13 +2636,7 @@ pub mod test {
|
||||||
// Prepare simulated validator restart!
|
// Prepare simulated validator restart!
|
||||||
let mut vote_simulator = VoteSimulator::new(2);
|
let mut vote_simulator = VoteSimulator::new(2);
|
||||||
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
let other_vote_account = vote_simulator.vote_pubkeys[1];
|
||||||
let bank0 = vote_simulator
|
let bank0 = vote_simulator.bank_forks.read().unwrap().get(0).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(0)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
let total_stake = bank0.total_epoch_stake();
|
let total_stake = bank0.total_epoch_stake();
|
||||||
let forks = tr(0)
|
let forks = tr(0)
|
||||||
/ (tr(1)
|
/ (tr(1)
|
||||||
|
@ -2708,12 +2659,7 @@ pub mod test {
|
||||||
let mut slot_history = SlotHistory::default();
|
let mut slot_history = SlotHistory::default();
|
||||||
vote_simulator.set_root(replayed_root_slot);
|
vote_simulator.set_root(replayed_root_slot);
|
||||||
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = vote_simulator
|
let descendants = vote_simulator.bank_forks.read().unwrap().descendants();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.descendants()
|
|
||||||
.clone();
|
|
||||||
for slot in &[0, 1, 2, 43, replayed_root_slot] {
|
for slot in &[0, 1, 2, 43, replayed_root_slot] {
|
||||||
slot_history.add(*slot);
|
slot_history.add(*slot);
|
||||||
}
|
}
|
||||||
|
|
|
@ -969,15 +969,11 @@ impl ForkChoice for HeaviestSubtreeForkChoice {
|
||||||
(
|
(
|
||||||
r_bank_forks
|
r_bank_forks
|
||||||
.get_with_checked_hash(self.best_overall_slot())
|
.get_with_checked_hash(self.best_overall_slot())
|
||||||
.unwrap()
|
.unwrap(),
|
||||||
.clone(),
|
|
||||||
self.heaviest_slot_on_same_voted_fork(tower)
|
self.heaviest_slot_on_same_voted_fork(tower)
|
||||||
.map(|slot_hash| {
|
.map(|slot_hash| {
|
||||||
// BankForks should only contain one valid version of this slot
|
// BankForks should only contain one valid version of this slot
|
||||||
r_bank_forks
|
r_bank_forks.get_with_checked_hash(slot_hash).unwrap()
|
||||||
.get_with_checked_hash(slot_hash)
|
|
||||||
.unwrap()
|
|
||||||
.clone()
|
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,13 +177,7 @@ mod test {
|
||||||
let optimistic_slots = vec![(1, bad_bank_hash), (3, Hash::default())];
|
let optimistic_slots = vec![(1, bad_bank_hash), (3, Hash::default())];
|
||||||
optimistic_confirmation_verifier.add_new_optimistic_confirmed_slots(optimistic_slots);
|
optimistic_confirmation_verifier.add_new_optimistic_confirmed_slots(optimistic_slots);
|
||||||
let vote_simulator = setup_forks();
|
let vote_simulator = setup_forks();
|
||||||
let bank1 = vote_simulator
|
let bank1 = vote_simulator.bank_forks.read().unwrap().get(1).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(1)
|
|
||||||
.cloned()
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
optimistic_confirmation_verifier
|
optimistic_confirmation_verifier
|
||||||
.verify_for_unrooted_optimistic_slots(&bank1, &blockstore),
|
.verify_for_unrooted_optimistic_slots(&bank1, &blockstore),
|
||||||
|
@ -225,13 +219,7 @@ mod test {
|
||||||
// If root is on same fork, nothing should be returned
|
// If root is on same fork, nothing should be returned
|
||||||
optimistic_confirmation_verifier
|
optimistic_confirmation_verifier
|
||||||
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
||||||
let bank5 = vote_simulator
|
let bank5 = vote_simulator.bank_forks.read().unwrap().get(5).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(5)
|
|
||||||
.cloned()
|
|
||||||
.unwrap();
|
|
||||||
assert!(optimistic_confirmation_verifier
|
assert!(optimistic_confirmation_verifier
|
||||||
.verify_for_unrooted_optimistic_slots(&bank5, &blockstore)
|
.verify_for_unrooted_optimistic_slots(&bank5, &blockstore)
|
||||||
.is_empty());
|
.is_empty());
|
||||||
|
@ -241,13 +229,7 @@ mod test {
|
||||||
// If root is on same fork, nothing should be returned
|
// If root is on same fork, nothing should be returned
|
||||||
optimistic_confirmation_verifier
|
optimistic_confirmation_verifier
|
||||||
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
||||||
let bank3 = vote_simulator
|
let bank3 = vote_simulator.bank_forks.read().unwrap().get(3).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(3)
|
|
||||||
.cloned()
|
|
||||||
.unwrap();
|
|
||||||
assert!(optimistic_confirmation_verifier
|
assert!(optimistic_confirmation_verifier
|
||||||
.verify_for_unrooted_optimistic_slots(&bank3, &blockstore)
|
.verify_for_unrooted_optimistic_slots(&bank3, &blockstore)
|
||||||
.is_empty());
|
.is_empty());
|
||||||
|
@ -261,13 +243,7 @@ mod test {
|
||||||
// be returned
|
// be returned
|
||||||
optimistic_confirmation_verifier
|
optimistic_confirmation_verifier
|
||||||
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
.add_new_optimistic_confirmed_slots(optimistic_slots.clone());
|
||||||
let bank4 = vote_simulator
|
let bank4 = vote_simulator.bank_forks.read().unwrap().get(4).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(4)
|
|
||||||
.cloned()
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
optimistic_confirmation_verifier
|
optimistic_confirmation_verifier
|
||||||
.verify_for_unrooted_optimistic_slots(&bank4, &blockstore),
|
.verify_for_unrooted_optimistic_slots(&bank4, &blockstore),
|
||||||
|
@ -283,25 +259,13 @@ mod test {
|
||||||
vote_simulator.set_root(5);
|
vote_simulator.set_root(5);
|
||||||
|
|
||||||
// Add a new bank 7 that descends from 6
|
// Add a new bank 7 that descends from 6
|
||||||
let bank6 = vote_simulator
|
let bank6 = vote_simulator.bank_forks.read().unwrap().get(6).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(6)
|
|
||||||
.cloned()
|
|
||||||
.unwrap();
|
|
||||||
vote_simulator
|
vote_simulator
|
||||||
.bank_forks
|
.bank_forks
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.insert(Bank::new_from_parent(&bank6, &Pubkey::default(), 7));
|
.insert(Bank::new_from_parent(&bank6, &Pubkey::default(), 7));
|
||||||
let bank7 = vote_simulator
|
let bank7 = vote_simulator.bank_forks.read().unwrap().get(7).unwrap();
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(7)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
assert!(!bank7.ancestors.contains_key(&3));
|
assert!(!bank7.ancestors.contains_key(&3));
|
||||||
|
|
||||||
// Should return slots 1, 3 as part of the rooted fork because there's no
|
// Should return slots 1, 3 as part of the rooted fork because there's no
|
||||||
|
|
|
@ -463,7 +463,7 @@ impl ReplayStage {
|
||||||
|
|
||||||
let mut replay_active_banks_time = Measure::start("replay_active_banks_time");
|
let mut replay_active_banks_time = Measure::start("replay_active_banks_time");
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let did_complete_bank = Self::replay_active_banks(
|
let did_complete_bank = Self::replay_active_banks(
|
||||||
&blockstore,
|
&blockstore,
|
||||||
&bank_forks,
|
&bank_forks,
|
||||||
|
@ -1519,8 +1519,7 @@ impl ReplayStage {
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get(parent_slot)
|
.get(parent_slot)
|
||||||
.expect("parent_slot doesn't exist in bank forks")
|
.expect("parent_slot doesn't exist in bank forks");
|
||||||
.clone();
|
|
||||||
|
|
||||||
assert!(parent.is_frozen());
|
assert!(parent.is_frozen());
|
||||||
|
|
||||||
|
@ -1768,8 +1767,7 @@ impl ReplayStage {
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get(new_root)
|
.get(new_root)
|
||||||
.expect("Root bank doesn't exist")
|
.expect("Root bank doesn't exist");
|
||||||
.clone();
|
|
||||||
let mut rooted_banks = root_bank.parents();
|
let mut rooted_banks = root_bank.parents();
|
||||||
rooted_banks.push(root_bank.clone());
|
rooted_banks.push(root_bank.clone());
|
||||||
let rooted_slots: Vec<_> = rooted_banks.iter().map(|bank| bank.slot()).collect();
|
let rooted_slots: Vec<_> = rooted_banks.iter().map(|bank| bank.slot()).collect();
|
||||||
|
@ -2155,7 +2153,7 @@ impl ReplayStage {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let bank = bank_forks.read().unwrap().get(*bank_slot).unwrap().clone();
|
let bank = bank_forks.read().unwrap().get(*bank_slot).unwrap();
|
||||||
let parent_slot = bank.parent_slot();
|
let parent_slot = bank.parent_slot();
|
||||||
let prev_leader_slot = progress.get_bank_prev_leader_slot(&bank);
|
let prev_leader_slot = progress.get_bank_prev_leader_slot(&bank);
|
||||||
let (num_blocks_on_fork, num_dropped_blocks_on_fork) = {
|
let (num_blocks_on_fork, num_dropped_blocks_on_fork) = {
|
||||||
|
@ -3322,7 +3320,7 @@ pub mod tests {
|
||||||
// Insert a non-root bank so that the propagation logic will update this
|
// Insert a non-root bank so that the propagation logic will update this
|
||||||
// bank
|
// bank
|
||||||
let bank1 = Bank::new_from_parent(
|
let bank1 = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(0).unwrap(),
|
&bank_forks.read().unwrap().get(0).unwrap(),
|
||||||
&leader_schedule_cache.slot_leader_at(1, None).unwrap(),
|
&leader_schedule_cache.slot_leader_at(1, None).unwrap(),
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
@ -3422,7 +3420,7 @@ pub mod tests {
|
||||||
|
|
||||||
let root = 3;
|
let root = 3;
|
||||||
let root_bank = Bank::new_from_parent(
|
let root_bank = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(0).unwrap(),
|
&bank_forks.read().unwrap().get(0).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
root,
|
root,
|
||||||
);
|
);
|
||||||
|
@ -3511,20 +3509,20 @@ pub mod tests {
|
||||||
let confirmed_root = 1;
|
let confirmed_root = 1;
|
||||||
let fork = 2;
|
let fork = 2;
|
||||||
let bank1 = Bank::new_from_parent(
|
let bank1 = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(0).unwrap(),
|
&bank_forks.read().unwrap().get(0).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
confirmed_root,
|
confirmed_root,
|
||||||
);
|
);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank2 = Bank::new_from_parent(
|
let bank2 = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(confirmed_root).unwrap(),
|
&bank_forks.read().unwrap().get(confirmed_root).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
fork,
|
fork,
|
||||||
);
|
);
|
||||||
bank_forks.write().unwrap().insert(bank2);
|
bank_forks.write().unwrap().insert(bank2);
|
||||||
let root = 3;
|
let root = 3;
|
||||||
let root_bank = Bank::new_from_parent(
|
let root_bank = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(confirmed_root).unwrap(),
|
&bank_forks.read().unwrap().get(confirmed_root).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
root,
|
root,
|
||||||
);
|
);
|
||||||
|
@ -3789,12 +3787,12 @@ pub mod tests {
|
||||||
..
|
..
|
||||||
} = vote_simulator;
|
} = vote_simulator;
|
||||||
|
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).cloned().unwrap();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
assert!(bank0.is_frozen());
|
assert!(bank0.is_frozen());
|
||||||
assert_eq!(bank0.tick_height(), bank0.max_tick_height());
|
assert_eq!(bank0.tick_height(), bank0.max_tick_height());
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).cloned().unwrap();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
let bank1_progress = progress
|
let bank1_progress = progress
|
||||||
.entry(bank1.slot())
|
.entry(bank1.slot())
|
||||||
.or_insert_with(|| ForkProgress::new(bank1.last_blockhash(), None, None, 0, 0));
|
.or_insert_with(|| ForkProgress::new(bank1.last_blockhash(), None, None, 0, 0));
|
||||||
|
@ -3910,7 +3908,7 @@ pub mod tests {
|
||||||
.is_none());
|
.is_none());
|
||||||
|
|
||||||
for i in 1..=3 {
|
for i in 1..=3 {
|
||||||
let prev_bank = bank_forks.read().unwrap().get(i - 1).unwrap().clone();
|
let prev_bank = bank_forks.read().unwrap().get(i - 1).unwrap();
|
||||||
let bank = Bank::new_from_parent(&prev_bank, &Pubkey::default(), prev_bank.slot() + 1);
|
let bank = Bank::new_from_parent(&prev_bank, &Pubkey::default(), prev_bank.slot() + 1);
|
||||||
let _res = bank.transfer(
|
let _res = bank.transfer(
|
||||||
10,
|
10,
|
||||||
|
@ -3921,7 +3919,7 @@ pub mod tests {
|
||||||
bank.register_tick(&Hash::default());
|
bank.register_tick(&Hash::default());
|
||||||
}
|
}
|
||||||
bank_forks.write().unwrap().insert(bank);
|
bank_forks.write().unwrap().insert(bank);
|
||||||
let arc_bank = bank_forks.read().unwrap().get(i).unwrap().clone();
|
let arc_bank = bank_forks.read().unwrap().get(i).unwrap();
|
||||||
leader_vote(i - 1, &arc_bank, &leader_voting_pubkey);
|
leader_vote(i - 1, &arc_bank, &leader_voting_pubkey);
|
||||||
ReplayStage::update_commitment_cache(
|
ReplayStage::update_commitment_cache(
|
||||||
arc_bank.clone(),
|
arc_bank.clone(),
|
||||||
|
@ -4056,7 +4054,7 @@ pub mod tests {
|
||||||
vote_simulator::initialize_state(&keypairs, 10_000);
|
vote_simulator::initialize_state(&keypairs, 10_000);
|
||||||
let mut latest_validator_votes_for_frozen_banks =
|
let mut latest_validator_votes_for_frozen_banks =
|
||||||
LatestValidatorVotesForFrozenBanks::default();
|
LatestValidatorVotesForFrozenBanks::default();
|
||||||
let bank0 = bank_forks.get(0).unwrap().clone();
|
let bank0 = bank_forks.get(0).unwrap();
|
||||||
let my_keypairs = keypairs.get(&my_node_pubkey).unwrap();
|
let my_keypairs = keypairs.get(&my_node_pubkey).unwrap();
|
||||||
let vote_tx = vote_transaction::new_vote_transaction(
|
let vote_tx = vote_transaction::new_vote_transaction(
|
||||||
vec![0],
|
vec![0],
|
||||||
|
@ -4215,20 +4213,8 @@ pub mod tests {
|
||||||
&mut latest_validator_votes_for_frozen_banks,
|
&mut latest_validator_votes_for_frozen_banks,
|
||||||
);
|
);
|
||||||
|
|
||||||
let bank1 = vote_simulator
|
let bank1 = vote_simulator.bank_forks.read().unwrap().get(1).unwrap();
|
||||||
.bank_forks
|
let bank2 = vote_simulator.bank_forks.read().unwrap().get(2).unwrap();
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(1)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
let bank2 = vote_simulator
|
|
||||||
.bank_forks
|
|
||||||
.read()
|
|
||||||
.unwrap()
|
|
||||||
.get(2)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
heaviest_subtree_fork_choice
|
heaviest_subtree_fork_choice
|
||||||
.stake_voted_subtree(&(1, bank1.hash()))
|
.stake_voted_subtree(&(1, bank1.hash()))
|
||||||
|
@ -4530,9 +4516,9 @@ pub mod tests {
|
||||||
let (mut bank_forks, mut progress_map, _) =
|
let (mut bank_forks, mut progress_map, _) =
|
||||||
vote_simulator::initialize_state(&keypairs, stake);
|
vote_simulator::initialize_state(&keypairs, stake);
|
||||||
|
|
||||||
let bank0 = bank_forks.get(0).unwrap().clone();
|
let bank0 = bank_forks.get(0).unwrap();
|
||||||
bank_forks.insert(Bank::new_from_parent(&bank0, &Pubkey::default(), 9));
|
bank_forks.insert(Bank::new_from_parent(&bank0, &Pubkey::default(), 9));
|
||||||
let bank9 = bank_forks.get(9).unwrap().clone();
|
let bank9 = bank_forks.get(9).unwrap();
|
||||||
bank_forks.insert(Bank::new_from_parent(&bank9, &Pubkey::default(), 10));
|
bank_forks.insert(Bank::new_from_parent(&bank9, &Pubkey::default(), 10));
|
||||||
bank_forks.set_root(9, &AbsRequestSender::default(), None);
|
bank_forks.set_root(9, &AbsRequestSender::default(), None);
|
||||||
let total_epoch_stake = bank0.total_epoch_stake();
|
let total_epoch_stake = bank0.total_epoch_stake();
|
||||||
|
@ -4859,7 +4845,7 @@ pub mod tests {
|
||||||
Bank::new_from_parent(&Arc::new(bank0), &Pubkey::default(), parent_slot);
|
Bank::new_from_parent(&Arc::new(bank0), &Pubkey::default(), parent_slot);
|
||||||
let mut bank_forks = BankForks::new(parent_slot_bank);
|
let mut bank_forks = BankForks::new(parent_slot_bank);
|
||||||
let bank5 =
|
let bank5 =
|
||||||
Bank::new_from_parent(bank_forks.get(parent_slot).unwrap(), &Pubkey::default(), 5);
|
Bank::new_from_parent(&bank_forks.get(parent_slot).unwrap(), &Pubkey::default(), 5);
|
||||||
bank_forks.insert(bank5);
|
bank_forks.insert(bank5);
|
||||||
|
|
||||||
// Should purge only `previous_leader_slot` from the progress map
|
// Should purge only `previous_leader_slot` from the progress map
|
||||||
|
@ -4970,14 +4956,14 @@ pub mod tests {
|
||||||
// Create bank 7
|
// Create bank 7
|
||||||
let root_bank = bank_forks.read().unwrap().root_bank();
|
let root_bank = bank_forks.read().unwrap().root_bank();
|
||||||
let bank7 = Bank::new_from_parent(
|
let bank7 = Bank::new_from_parent(
|
||||||
&bank_forks.read().unwrap().get(6).unwrap().clone(),
|
&bank_forks.read().unwrap().get(6).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
7,
|
7,
|
||||||
);
|
);
|
||||||
bank_forks.write().unwrap().insert(bank7);
|
bank_forks.write().unwrap().insert(bank7);
|
||||||
blockstore.add_tree(tr(6) / tr(7), false, false, 3, Hash::default());
|
blockstore.add_tree(tr(6) / tr(7), false, false, 3, Hash::default());
|
||||||
let bank7 = bank_forks.read().unwrap().get(7).unwrap().clone();
|
let bank7 = bank_forks.read().unwrap().get(7).unwrap();
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
|
|
||||||
// Process a transfer on bank 7
|
// Process a transfer on bank 7
|
||||||
|
@ -4995,7 +4981,7 @@ pub mod tests {
|
||||||
|
|
||||||
// Process a vote for slot 0 in bank 5
|
// Process a vote for slot 0 in bank 5
|
||||||
let validator0_keypairs = &validator_keypairs.get(&sender).unwrap();
|
let validator0_keypairs = &validator_keypairs.get(&sender).unwrap();
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let vote_tx = vote_transaction::new_vote_transaction(
|
let vote_tx = vote_transaction::new_vote_transaction(
|
||||||
vec![0],
|
vec![0],
|
||||||
bank0.hash(),
|
bank0.hash(),
|
||||||
|
@ -5053,7 +5039,7 @@ pub mod tests {
|
||||||
assert_eq!(bank7.get_balance(&sender), old_balance);
|
assert_eq!(bank7.get_balance(&sender), old_balance);
|
||||||
|
|
||||||
// Purging slot 4 should purge only slot 4
|
// Purging slot 4 should purge only slot 4
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
ReplayStage::purge_unconfirmed_duplicate_slot(
|
ReplayStage::purge_unconfirmed_duplicate_slot(
|
||||||
4,
|
4,
|
||||||
|
@ -5076,7 +5062,7 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Purging slot 1 should purge both forks 2 and 3
|
// Purging slot 1 should purge both forks 2 and 3
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
ReplayStage::purge_unconfirmed_duplicate_slot(
|
ReplayStage::purge_unconfirmed_duplicate_slot(
|
||||||
1,
|
1,
|
||||||
|
@ -5101,7 +5087,7 @@ pub mod tests {
|
||||||
let (VoteSimulator { bank_forks, .. }, _) = setup_default_forks(1, None::<GenerateVotes>);
|
let (VoteSimulator { bank_forks, .. }, _) = setup_default_forks(1, None::<GenerateVotes>);
|
||||||
|
|
||||||
// Purge branch rooted at slot 2
|
// Purge branch rooted at slot 2
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let slot_2_descendants = descendants.get(&2).unwrap().clone();
|
let slot_2_descendants = descendants.get(&2).unwrap().clone();
|
||||||
ReplayStage::purge_ancestors_descendants(
|
ReplayStage::purge_ancestors_descendants(
|
||||||
|
@ -5123,7 +5109,7 @@ pub mod tests {
|
||||||
));
|
));
|
||||||
assert!(check_map_eq(
|
assert!(check_map_eq(
|
||||||
&descendants,
|
&descendants,
|
||||||
bank_forks.read().unwrap().descendants()
|
&bank_forks.read().unwrap().descendants()
|
||||||
));
|
));
|
||||||
|
|
||||||
// Try to purge the root
|
// Try to purge the root
|
||||||
|
@ -5131,7 +5117,7 @@ pub mod tests {
|
||||||
.write()
|
.write()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.set_root(3, &AbsRequestSender::default(), None);
|
.set_root(3, &AbsRequestSender::default(), None);
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let slot_3_descendants = descendants.get(&3).unwrap().clone();
|
let slot_3_descendants = descendants.get(&3).unwrap().clone();
|
||||||
ReplayStage::purge_ancestors_descendants(
|
ReplayStage::purge_ancestors_descendants(
|
||||||
|
@ -5275,7 +5261,7 @@ pub mod tests {
|
||||||
|
|
||||||
// Record the vote for 4
|
// Record the vote for 4
|
||||||
tower.record_bank_vote(
|
tower.record_bank_vote(
|
||||||
bank_forks.read().unwrap().get(4).unwrap(),
|
&bank_forks.read().unwrap().get(4).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -5411,7 +5397,7 @@ pub mod tests {
|
||||||
|
|
||||||
let (mut ancestors, mut descendants) = {
|
let (mut ancestors, mut descendants) = {
|
||||||
let r_bank_forks = bank_forks.read().unwrap();
|
let r_bank_forks = bank_forks.read().unwrap();
|
||||||
(r_bank_forks.ancestors(), r_bank_forks.descendants().clone())
|
(r_bank_forks.ancestors(), r_bank_forks.descendants())
|
||||||
};
|
};
|
||||||
|
|
||||||
// Insert different versions of both 1 and 2. Both slots 1 and 2 should
|
// Insert different versions of both 1 and 2. Both slots 1 and 2 should
|
||||||
|
@ -5490,7 +5476,7 @@ pub mod tests {
|
||||||
} = vote_simulator;
|
} = vote_simulator;
|
||||||
|
|
||||||
tower.record_bank_vote(
|
tower.record_bank_vote(
|
||||||
bank_forks.read().unwrap().get(first_vote).unwrap(),
|
&bank_forks.read().unwrap().get(first_vote).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -5528,7 +5514,7 @@ pub mod tests {
|
||||||
duplicate_confirmed_bank2_hash
|
duplicate_confirmed_bank2_hash
|
||||||
);
|
);
|
||||||
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
let mut ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let mut descendants = bank_forks.read().unwrap().descendants().clone();
|
let mut descendants = bank_forks.read().unwrap().descendants();
|
||||||
let old_descendants_of_2 = descendants.get(&2).unwrap().clone();
|
let old_descendants_of_2 = descendants.get(&2).unwrap().clone();
|
||||||
|
|
||||||
ReplayStage::dump_then_repair_correct_slots(
|
ReplayStage::dump_then_repair_correct_slots(
|
||||||
|
@ -5584,7 +5570,7 @@ pub mod tests {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let ancestors = bank_forks.read().unwrap().ancestors();
|
let ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = bank_forks.read().unwrap().descendants().clone();
|
let descendants = bank_forks.read().unwrap().descendants();
|
||||||
|
|
||||||
ReplayStage::compute_bank_stats(
|
ReplayStage::compute_bank_stats(
|
||||||
&Pubkey::new_unique(),
|
&Pubkey::new_unique(),
|
||||||
|
@ -5711,7 +5697,7 @@ pub mod tests {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let ancestors = bank_forks.read().unwrap().ancestors();
|
let ancestors = bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = bank_forks.read().unwrap().descendants().clone();
|
let descendants = bank_forks.read().unwrap().descendants();
|
||||||
|
|
||||||
ReplayStage::compute_bank_stats(
|
ReplayStage::compute_bank_stats(
|
||||||
&Pubkey::new_unique(),
|
&Pubkey::new_unique(),
|
||||||
|
@ -5821,7 +5807,7 @@ pub mod tests {
|
||||||
|
|
||||||
// Cast a vote for slot 3 on one fork
|
// Cast a vote for slot 3 on one fork
|
||||||
let vote_slot = 3;
|
let vote_slot = 3;
|
||||||
let vote_bank = bank_forks.read().unwrap().get(vote_slot).unwrap().clone();
|
let vote_bank = bank_forks.read().unwrap().get(vote_slot).unwrap();
|
||||||
gossip_verified_vote_hash_sender
|
gossip_verified_vote_hash_sender
|
||||||
.send((vote_pubkey, vote_slot, vote_bank.hash()))
|
.send((vote_pubkey, vote_slot, vote_bank.hash()))
|
||||||
.expect("Send should succeed");
|
.expect("Send should succeed");
|
||||||
|
@ -5873,7 +5859,7 @@ pub mod tests {
|
||||||
validator_keypairs.remove(&my_pubkey).unwrap().vote_keypair,
|
validator_keypairs.remove(&my_pubkey).unwrap().vote_keypair,
|
||||||
)];
|
)];
|
||||||
let my_vote_pubkey = my_vote_keypair[0].pubkey();
|
let my_vote_pubkey = my_vote_keypair[0].pubkey();
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
|
|
||||||
let (voting_sender, voting_receiver) = unbounded();
|
let (voting_sender, voting_receiver) = unbounded();
|
||||||
|
|
||||||
|
@ -6139,7 +6125,7 @@ pub mod tests {
|
||||||
let (retransmit_slots_sender, retransmit_slots_receiver) = unbounded();
|
let (retransmit_slots_sender, retransmit_slots_receiver) = unbounded();
|
||||||
|
|
||||||
let bank1 = Bank::new_from_parent(
|
let bank1 = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(0).unwrap(),
|
&bank_forks.read().unwrap().get(0).unwrap(),
|
||||||
&leader_schedule_cache.slot_leader_at(1, None).unwrap(),
|
&leader_schedule_cache.slot_leader_at(1, None).unwrap(),
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
@ -6310,7 +6296,7 @@ pub mod tests {
|
||||||
let mut prev_index = 0;
|
let mut prev_index = 0;
|
||||||
for i in (1..10).chain(11..15) {
|
for i in (1..10).chain(11..15) {
|
||||||
let bank = Bank::new_from_parent(
|
let bank = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(prev_index).unwrap(),
|
&bank_forks.read().unwrap().get(prev_index).unwrap(),
|
||||||
&leader_schedule_cache.slot_leader_at(i, None).unwrap(),
|
&leader_schedule_cache.slot_leader_at(i, None).unwrap(),
|
||||||
i,
|
i,
|
||||||
);
|
);
|
||||||
|
@ -6382,7 +6368,7 @@ pub mod tests {
|
||||||
.cloned()
|
.cloned()
|
||||||
.collect();
|
.collect();
|
||||||
let ancestors = &bank_forks.read().unwrap().ancestors();
|
let ancestors = &bank_forks.read().unwrap().ancestors();
|
||||||
let descendants = &bank_forks.read().unwrap().descendants().clone();
|
let descendants = &bank_forks.read().unwrap().descendants();
|
||||||
ReplayStage::compute_bank_stats(
|
ReplayStage::compute_bank_stats(
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
&bank_forks.read().unwrap().ancestors(),
|
&bank_forks.read().unwrap().ancestors(),
|
||||||
|
|
|
@ -79,7 +79,7 @@ impl VoteSimulator {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
let parent = *walk.get_parent().unwrap().data();
|
let parent = *walk.get_parent().unwrap().data();
|
||||||
let parent_bank = self.bank_forks.read().unwrap().get(parent).unwrap().clone();
|
let parent_bank = self.bank_forks.read().unwrap().get(parent).unwrap();
|
||||||
let new_bank = Bank::new_from_parent(&parent_bank, &Pubkey::default(), slot);
|
let new_bank = Bank::new_from_parent(&parent_bank, &Pubkey::default(), slot);
|
||||||
self.progress
|
self.progress
|
||||||
.entry(slot)
|
.entry(slot)
|
||||||
|
@ -171,11 +171,10 @@ impl VoteSimulator {
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get(vote_slot)
|
.get(vote_slot)
|
||||||
.expect("Bank must have been created before vote simulation")
|
.expect("Bank must have been created before vote simulation");
|
||||||
.clone();
|
|
||||||
|
|
||||||
// Try to vote on the given slot
|
// Try to vote on the given slot
|
||||||
let descendants = self.bank_forks.read().unwrap().descendants().clone();
|
let descendants = self.bank_forks.read().unwrap().descendants();
|
||||||
let SelectVoteAndResetForkResult {
|
let SelectVoteAndResetForkResult {
|
||||||
heaviest_fork_failures,
|
heaviest_fork_failures,
|
||||||
..
|
..
|
||||||
|
|
|
@ -216,11 +216,8 @@ mod tests {
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let bank = old_bank_forks
|
let bank = old_bank_forks.get(deserialized_bank.slot()).unwrap();
|
||||||
.get(deserialized_bank.slot())
|
assert_eq!(bank.as_ref(), &deserialized_bank);
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
assert_eq!(*bank, deserialized_bank);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// creates banks up to "last_slot" and runs the input function `f` on each bank created
|
// creates banks up to "last_slot" and runs the input function `f` on each bank created
|
||||||
|
@ -279,7 +276,7 @@ mod tests {
|
||||||
snapshot_utils::get_highest_bank_snapshot_pre(bank_snapshots_dir)
|
snapshot_utils::get_highest_bank_snapshot_pre(bank_snapshots_dir)
|
||||||
.expect("no bank snapshots found in path");
|
.expect("no bank snapshots found in path");
|
||||||
let accounts_package = AccountsPackage::new(
|
let accounts_package = AccountsPackage::new(
|
||||||
last_bank,
|
&last_bank,
|
||||||
&last_bank_snapshot_info,
|
&last_bank_snapshot_info,
|
||||||
bank_snapshots_dir,
|
bank_snapshots_dir,
|
||||||
last_bank.src.slot_deltas(&last_bank.src.roots()),
|
last_bank.src.slot_deltas(&last_bank.src.roots()),
|
||||||
|
@ -370,7 +367,7 @@ mod tests {
|
||||||
// Take snapshot of zeroth bank
|
// Take snapshot of zeroth bank
|
||||||
let bank0 = bank_forks.get(0).unwrap();
|
let bank0 = bank_forks.get(0).unwrap();
|
||||||
let storages = bank0.get_snapshot_storages(None);
|
let storages = bank0.get_snapshot_storages(None);
|
||||||
snapshot_utils::add_bank_snapshot(bank_snapshots_dir, bank0, &storages, snapshot_version)
|
snapshot_utils::add_bank_snapshot(bank_snapshots_dir, &bank0, &storages, snapshot_version)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
// Set up snapshotting channels
|
// Set up snapshotting channels
|
||||||
|
@ -972,7 +969,7 @@ mod tests {
|
||||||
// Make a new bank and perform some transactions
|
// Make a new bank and perform some transactions
|
||||||
let bank = {
|
let bank = {
|
||||||
let bank = Bank::new_from_parent(
|
let bank = Bank::new_from_parent(
|
||||||
bank_forks.read().unwrap().get(slot - 1).unwrap(),
|
&bank_forks.read().unwrap().get(slot - 1).unwrap(),
|
||||||
&Pubkey::default(),
|
&Pubkey::default(),
|
||||||
slot,
|
slot,
|
||||||
);
|
);
|
||||||
|
@ -1035,14 +1032,15 @@ mod tests {
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(deserialized_bank.slot(), LAST_SLOT,);
|
assert_eq!(deserialized_bank.slot(), LAST_SLOT);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
deserialized_bank,
|
&deserialized_bank,
|
||||||
**bank_forks
|
bank_forks
|
||||||
.read()
|
.read()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.get(deserialized_bank.slot())
|
.get(deserialized_bank.slot())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
.as_ref()
|
||||||
);
|
);
|
||||||
|
|
||||||
// Stop the background services
|
// Stop the background services
|
||||||
|
|
|
@ -2315,8 +2315,7 @@ fn main() {
|
||||||
.unwrap_or_else(|| {
|
.unwrap_or_else(|| {
|
||||||
eprintln!("Error: Slot {} is not available", snapshot_slot);
|
eprintln!("Error: Slot {} is not available", snapshot_slot);
|
||||||
exit(1);
|
exit(1);
|
||||||
})
|
});
|
||||||
.clone();
|
|
||||||
|
|
||||||
let child_bank_required = rent_burn_percentage.is_ok()
|
let child_bank_required = rent_burn_percentage.is_ok()
|
||||||
|| hashes_per_tick.is_some()
|
|| hashes_per_tick.is_some()
|
||||||
|
@ -2913,7 +2912,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let warped_bank = Bank::new_from_parent_with_tracer(
|
let warped_bank = Bank::new_from_parent_with_tracer(
|
||||||
base_bank,
|
&base_bank,
|
||||||
base_bank.collector_id(),
|
base_bank.collector_id(),
|
||||||
next_epoch,
|
next_epoch,
|
||||||
tracer,
|
tracer,
|
||||||
|
@ -2930,7 +2929,7 @@ fn main() {
|
||||||
|
|
||||||
println!("Slot: {} => {}", base_bank.slot(), warped_bank.slot());
|
println!("Slot: {} => {}", base_bank.slot(), warped_bank.slot());
|
||||||
println!("Epoch: {} => {}", base_bank.epoch(), warped_bank.epoch());
|
println!("Epoch: {} => {}", base_bank.epoch(), warped_bank.epoch());
|
||||||
assert_capitalization(base_bank);
|
assert_capitalization(&base_bank);
|
||||||
assert_capitalization(&warped_bank);
|
assert_capitalization(&warped_bank);
|
||||||
let interest_per_epoch = ((warped_bank.capitalization() as f64)
|
let interest_per_epoch = ((warped_bank.capitalization() as f64)
|
||||||
/ (base_bank.capitalization() as f64)
|
/ (base_bank.capitalization() as f64)
|
||||||
|
@ -3177,7 +3176,7 @@ fn main() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_capitalization(bank);
|
assert_capitalization(&bank);
|
||||||
println!("Inflation: {:?}", bank.inflation());
|
println!("Inflation: {:?}", bank.inflation());
|
||||||
println!("RentCollector: {:?}", bank.rent_collector());
|
println!("RentCollector: {:?}", bank.rent_collector());
|
||||||
println!("Capitalization: {}", Sol(bank.capitalization()));
|
println!("Capitalization: {}", Sol(bank.capitalization()));
|
||||||
|
|
|
@ -733,7 +733,7 @@ pub fn process_blockstore_from_root(
|
||||||
info!("ledger processing timing: {:?}", timing);
|
info!("ledger processing timing: {:?}", timing);
|
||||||
{
|
{
|
||||||
let bank_forks = bank_forks.read().unwrap();
|
let bank_forks = bank_forks.read().unwrap();
|
||||||
let mut bank_slots = bank_forks.banks().keys().collect::<Vec<_>>();
|
let mut bank_slots = bank_forks.banks().keys().copied().collect::<Vec<_>>();
|
||||||
bank_slots.sort_unstable();
|
bank_slots.sort_unstable();
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
|
@ -1165,7 +1165,7 @@ fn load_frozen_forks(
|
||||||
);
|
);
|
||||||
|
|
||||||
process_next_slots(
|
process_next_slots(
|
||||||
bank_forks.read().unwrap().get(start_slot).unwrap(),
|
&bank_forks.read().unwrap().get(start_slot).unwrap(),
|
||||||
start_slot_meta,
|
start_slot_meta,
|
||||||
blockstore,
|
blockstore,
|
||||||
leader_schedule_cache,
|
leader_schedule_cache,
|
||||||
|
@ -3118,7 +3118,7 @@ pub mod tests {
|
||||||
|
|
||||||
// Set up bank1
|
// Set up bank1
|
||||||
let mut bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config));
|
let mut bank_forks = BankForks::new(Bank::new_for_tests(&genesis_config));
|
||||||
let bank0 = bank_forks.get(0).unwrap().clone();
|
let bank0 = bank_forks.get(0).unwrap();
|
||||||
let opts = ProcessOptions {
|
let opts = ProcessOptions {
|
||||||
poh_verify: true,
|
poh_verify: true,
|
||||||
accounts_db_test_hash_calculation: true,
|
accounts_db_test_hash_calculation: true,
|
||||||
|
|
|
@ -217,7 +217,7 @@ impl OptimisticallyConfirmedBankTracker {
|
||||||
Self::notify_or_defer_confirmed_banks(
|
Self::notify_or_defer_confirmed_banks(
|
||||||
subscriptions,
|
subscriptions,
|
||||||
bank_forks,
|
bank_forks,
|
||||||
bank,
|
&bank,
|
||||||
*highest_confirmed_slot,
|
*highest_confirmed_slot,
|
||||||
last_notified_confirmed_slot,
|
last_notified_confirmed_slot,
|
||||||
pending_optimistically_confirmed_banks,
|
pending_optimistically_confirmed_banks,
|
||||||
|
@ -330,13 +330,13 @@ mod tests {
|
||||||
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100);
|
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(100);
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
let bank2 = Bank::new_from_parent(&bank1, &Pubkey::default(), 2);
|
let bank2 = Bank::new_from_parent(&bank1, &Pubkey::default(), 2);
|
||||||
bank_forks.write().unwrap().insert(bank2);
|
bank_forks.write().unwrap().insert(bank2);
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
let bank3 = Bank::new_from_parent(&bank2, &Pubkey::default(), 3);
|
let bank3 = Bank::new_from_parent(&bank2, &Pubkey::default(), 3);
|
||||||
bank_forks.write().unwrap().insert(bank3);
|
bank_forks.write().unwrap().insert(bank3);
|
||||||
|
|
||||||
|
@ -402,7 +402,7 @@ mod tests {
|
||||||
assert_eq!(highest_confirmed_slot, 3);
|
assert_eq!(highest_confirmed_slot, 3);
|
||||||
|
|
||||||
// Test bank will only be cached when frozen
|
// Test bank will only be cached when frozen
|
||||||
let bank3 = bank_forks.read().unwrap().get(3).unwrap().clone();
|
let bank3 = bank_forks.read().unwrap().get(3).unwrap();
|
||||||
bank3.freeze();
|
bank3.freeze();
|
||||||
|
|
||||||
OptimisticallyConfirmedBankTracker::process_notification(
|
OptimisticallyConfirmedBankTracker::process_notification(
|
||||||
|
@ -420,7 +420,7 @@ mod tests {
|
||||||
assert_eq!(pending_optimistically_confirmed_banks.len(), 0);
|
assert_eq!(pending_optimistically_confirmed_banks.len(), 0);
|
||||||
|
|
||||||
// Test higher root will be cached and clear pending_optimistically_confirmed_banks
|
// Test higher root will be cached and clear pending_optimistically_confirmed_banks
|
||||||
let bank3 = bank_forks.read().unwrap().get(3).unwrap().clone();
|
let bank3 = bank_forks.read().unwrap().get(3).unwrap();
|
||||||
let bank4 = Bank::new_from_parent(&bank3, &Pubkey::default(), 4);
|
let bank4 = Bank::new_from_parent(&bank3, &Pubkey::default(), 4);
|
||||||
bank_forks.write().unwrap().insert(bank4);
|
bank_forks.write().unwrap().insert(bank4);
|
||||||
OptimisticallyConfirmedBankTracker::process_notification(
|
OptimisticallyConfirmedBankTracker::process_notification(
|
||||||
|
@ -438,10 +438,10 @@ mod tests {
|
||||||
assert!(pending_optimistically_confirmed_banks.contains(&4));
|
assert!(pending_optimistically_confirmed_banks.contains(&4));
|
||||||
assert_eq!(highest_confirmed_slot, 4);
|
assert_eq!(highest_confirmed_slot, 4);
|
||||||
|
|
||||||
let bank4 = bank_forks.read().unwrap().get(4).unwrap().clone();
|
let bank4 = bank_forks.read().unwrap().get(4).unwrap();
|
||||||
let bank5 = Bank::new_from_parent(&bank4, &Pubkey::default(), 5);
|
let bank5 = Bank::new_from_parent(&bank4, &Pubkey::default(), 5);
|
||||||
bank_forks.write().unwrap().insert(bank5);
|
bank_forks.write().unwrap().insert(bank5);
|
||||||
let bank5 = bank_forks.read().unwrap().get(5).unwrap().clone();
|
let bank5 = bank_forks.read().unwrap().get(5).unwrap();
|
||||||
OptimisticallyConfirmedBankTracker::process_notification(
|
OptimisticallyConfirmedBankTracker::process_notification(
|
||||||
BankNotification::Root(bank5),
|
BankNotification::Root(bank5),
|
||||||
&bank_forks,
|
&bank_forks,
|
||||||
|
@ -458,10 +458,10 @@ mod tests {
|
||||||
assert_eq!(highest_confirmed_slot, 4);
|
assert_eq!(highest_confirmed_slot, 4);
|
||||||
|
|
||||||
// Banks <= root do not get added to pending list, even if not frozen
|
// Banks <= root do not get added to pending list, even if not frozen
|
||||||
let bank5 = bank_forks.read().unwrap().get(5).unwrap().clone();
|
let bank5 = bank_forks.read().unwrap().get(5).unwrap();
|
||||||
let bank6 = Bank::new_from_parent(&bank5, &Pubkey::default(), 6);
|
let bank6 = Bank::new_from_parent(&bank5, &Pubkey::default(), 6);
|
||||||
bank_forks.write().unwrap().insert(bank6);
|
bank_forks.write().unwrap().insert(bank6);
|
||||||
let bank5 = bank_forks.read().unwrap().get(5).unwrap().clone();
|
let bank5 = bank_forks.read().unwrap().get(5).unwrap();
|
||||||
let bank7 = Bank::new_from_parent(&bank5, &Pubkey::default(), 7);
|
let bank7 = Bank::new_from_parent(&bank5, &Pubkey::default(), 7);
|
||||||
bank_forks.write().unwrap().insert(bank7);
|
bank_forks.write().unwrap().insert(bank7);
|
||||||
bank_forks
|
bank_forks
|
||||||
|
|
|
@ -250,7 +250,7 @@ impl JsonRpcRequestProcessor {
|
||||||
CommitmentLevel::SingleGossip | CommitmentLevel::Confirmed => unreachable!(), // SingleGossip variant is deprecated
|
CommitmentLevel::SingleGossip | CommitmentLevel::Confirmed => unreachable!(), // SingleGossip variant is deprecated
|
||||||
};
|
};
|
||||||
|
|
||||||
r_bank_forks.get(slot).cloned().unwrap_or_else(|| {
|
r_bank_forks.get(slot).unwrap_or_else(|| {
|
||||||
// We log a warning instead of returning an error, because all known error cases
|
// We log a warning instead of returning an error, because all known error cases
|
||||||
// are due to known bugs that should be fixed instead.
|
// are due to known bugs that should be fixed instead.
|
||||||
//
|
//
|
||||||
|
@ -1066,8 +1066,7 @@ impl JsonRpcRequestProcessor {
|
||||||
|| confirmed_block.block_height.is_none()
|
|| confirmed_block.block_height.is_none()
|
||||||
{
|
{
|
||||||
let r_bank_forks = self.bank_forks.read().unwrap();
|
let r_bank_forks = self.bank_forks.read().unwrap();
|
||||||
let bank = r_bank_forks.get(slot).cloned();
|
if let Some(bank) = r_bank_forks.get(slot) {
|
||||||
if let Some(bank) = bank {
|
|
||||||
if confirmed_block.block_time.is_none() {
|
if confirmed_block.block_time.is_none() {
|
||||||
confirmed_block.block_time =
|
confirmed_block.block_time =
|
||||||
Some(bank.clock().unix_timestamp);
|
Some(bank.clock().unix_timestamp);
|
||||||
|
@ -7643,13 +7642,13 @@ pub mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
let bank2 = Bank::new_from_parent(&bank1, &Pubkey::default(), 2);
|
let bank2 = Bank::new_from_parent(&bank1, &Pubkey::default(), 2);
|
||||||
bank_forks.write().unwrap().insert(bank2);
|
bank_forks.write().unwrap().insert(bank2);
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
let bank3 = Bank::new_from_parent(&bank2, &Pubkey::default(), 3);
|
let bank3 = Bank::new_from_parent(&bank2, &Pubkey::default(), 3);
|
||||||
bank_forks.write().unwrap().insert(bank3);
|
bank_forks.write().unwrap().insert(bank3);
|
||||||
|
|
||||||
|
@ -7750,7 +7749,7 @@ pub mod tests {
|
||||||
assert_eq!(slot, 2);
|
assert_eq!(slot, 2);
|
||||||
|
|
||||||
// Test freezing an optimistically confirmed bank will update cache
|
// Test freezing an optimistically confirmed bank will update cache
|
||||||
let bank3 = bank_forks.read().unwrap().get(3).unwrap().clone();
|
let bank3 = bank_forks.read().unwrap().get(3).unwrap();
|
||||||
OptimisticallyConfirmedBankTracker::process_notification(
|
OptimisticallyConfirmedBankTracker::process_notification(
|
||||||
BankNotification::Frozen(bank3),
|
BankNotification::Frozen(bank3),
|
||||||
&bank_forks,
|
&bank_forks,
|
||||||
|
|
|
@ -838,7 +838,7 @@ mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
||||||
|
@ -964,7 +964,7 @@ mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
let max_complete_transaction_status_slot = Arc::new(AtomicU64::default());
|
||||||
|
@ -1152,7 +1152,7 @@ mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bob = Keypair::new();
|
let bob = Keypair::new();
|
||||||
|
|
|
@ -145,7 +145,7 @@ where
|
||||||
X: Clone + Default,
|
X: Clone + Default,
|
||||||
{
|
{
|
||||||
let mut notified = false;
|
let mut notified = false;
|
||||||
if let Some(bank) = bank_forks.read().unwrap().get(slot).cloned() {
|
if let Some(bank) = bank_forks.read().unwrap().get(slot) {
|
||||||
let results = bank_method(&bank, params);
|
let results = bank_method(&bank, params);
|
||||||
let mut w_last_notified_slot = subscription.last_notified_slot.write().unwrap();
|
let mut w_last_notified_slot = subscription.last_notified_slot.write().unwrap();
|
||||||
let (filter_results, result_slot) =
|
let (filter_results, result_slot) =
|
||||||
|
@ -1262,7 +1262,7 @@ pub(crate) mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let alice = Keypair::new();
|
let alice = Keypair::new();
|
||||||
|
@ -1839,10 +1839,10 @@ pub(crate) mod tests {
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
|
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
|
|
||||||
// add account for alice and process the transaction at bank1
|
// add account for alice and process the transaction at bank1
|
||||||
let alice = Keypair::new();
|
let alice = Keypair::new();
|
||||||
|
@ -1870,7 +1870,7 @@ pub(crate) mod tests {
|
||||||
16,
|
16,
|
||||||
&stake::program::id(),
|
&stake::program::id(),
|
||||||
);
|
);
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
|
|
||||||
bank2.process_transaction(&tx).unwrap();
|
bank2.process_transaction(&tx).unwrap();
|
||||||
|
|
||||||
|
@ -1887,7 +1887,7 @@ pub(crate) mod tests {
|
||||||
16,
|
16,
|
||||||
&stake::program::id(),
|
&stake::program::id(),
|
||||||
);
|
);
|
||||||
let bank3 = bank_forks.read().unwrap().get(3).unwrap().clone();
|
let bank3 = bank_forks.read().unwrap().get(3).unwrap();
|
||||||
|
|
||||||
bank3.process_transaction(&tx).unwrap();
|
bank3.process_transaction(&tx).unwrap();
|
||||||
|
|
||||||
|
@ -2026,10 +2026,10 @@ pub(crate) mod tests {
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
|
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
|
|
||||||
// add account for alice and process the transaction at bank1
|
// add account for alice and process the transaction at bank1
|
||||||
let alice = Keypair::new();
|
let alice = Keypair::new();
|
||||||
|
@ -2057,7 +2057,7 @@ pub(crate) mod tests {
|
||||||
16,
|
16,
|
||||||
&stake::program::id(),
|
&stake::program::id(),
|
||||||
);
|
);
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
|
|
||||||
bank2.process_transaction(&tx).unwrap();
|
bank2.process_transaction(&tx).unwrap();
|
||||||
|
|
||||||
|
@ -2137,10 +2137,10 @@ pub(crate) mod tests {
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
|
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank1 = bank_forks.read().unwrap().get(1).unwrap().clone();
|
let bank1 = bank_forks.read().unwrap().get(1).unwrap();
|
||||||
|
|
||||||
// add account for alice and process the transaction at bank1
|
// add account for alice and process the transaction at bank1
|
||||||
let alice = Keypair::new();
|
let alice = Keypair::new();
|
||||||
|
@ -2168,7 +2168,7 @@ pub(crate) mod tests {
|
||||||
16,
|
16,
|
||||||
&stake::program::id(),
|
&stake::program::id(),
|
||||||
);
|
);
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
|
|
||||||
bank2.process_transaction(&tx).unwrap();
|
bank2.process_transaction(&tx).unwrap();
|
||||||
|
|
||||||
|
@ -2265,7 +2265,7 @@ pub(crate) mod tests {
|
||||||
16,
|
16,
|
||||||
&stake::program::id(),
|
&stake::program::id(),
|
||||||
);
|
);
|
||||||
let bank3 = bank_forks.read().unwrap().get(3).unwrap().clone();
|
let bank3 = bank_forks.read().unwrap().get(3).unwrap();
|
||||||
|
|
||||||
bank3.process_transaction(&tx).unwrap();
|
bank3.process_transaction(&tx).unwrap();
|
||||||
bank3.freeze();
|
bank3.freeze();
|
||||||
|
@ -2330,7 +2330,7 @@ pub(crate) mod tests {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let next_bank = Bank::new_from_parent(
|
let next_bank = Bank::new_from_parent(
|
||||||
&bank_forks.get(0).unwrap().clone(),
|
&bank_forks.get(0).unwrap(),
|
||||||
&solana_sdk::pubkey::new_rand(),
|
&solana_sdk::pubkey::new_rand(),
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
@ -2630,7 +2630,7 @@ pub(crate) mod tests {
|
||||||
let bank = Bank::new_for_tests(&genesis_config);
|
let bank = Bank::new_for_tests(&genesis_config);
|
||||||
let blockhash = bank.last_blockhash();
|
let blockhash = bank.last_blockhash();
|
||||||
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
||||||
let bank0 = bank_forks.read().unwrap().get(0).unwrap().clone();
|
let bank0 = bank_forks.read().unwrap().get(0).unwrap();
|
||||||
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
let bank1 = Bank::new_from_parent(&bank0, &Pubkey::default(), 1);
|
||||||
bank_forks.write().unwrap().insert(bank1);
|
bank_forks.write().unwrap().insert(bank1);
|
||||||
let bank2 = Bank::new_from_parent(&bank0, &Pubkey::default(), 2);
|
let bank2 = Bank::new_from_parent(&bank0, &Pubkey::default(), 2);
|
||||||
|
@ -2677,7 +2677,7 @@ pub(crate) mod tests {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add the transaction to the 1st bank and then freeze the bank
|
// Add the transaction to the 1st bank and then freeze the bank
|
||||||
let bank1 = bank_forks.write().unwrap().get(1).cloned().unwrap();
|
let bank1 = bank_forks.write().unwrap().get(1).unwrap();
|
||||||
bank1.process_transaction(&tx).unwrap();
|
bank1.process_transaction(&tx).unwrap();
|
||||||
bank1.freeze();
|
bank1.freeze();
|
||||||
|
|
||||||
|
@ -2752,7 +2752,7 @@ pub(crate) mod tests {
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let bank2 = bank_forks.read().unwrap().get(2).unwrap().clone();
|
let bank2 = bank_forks.read().unwrap().get(2).unwrap();
|
||||||
bank2.freeze();
|
bank2.freeze();
|
||||||
highest_confirmed_slot = 0;
|
highest_confirmed_slot = 0;
|
||||||
OptimisticallyConfirmedBankTracker::process_notification(
|
OptimisticallyConfirmedBankTracker::process_notification(
|
||||||
|
|
|
@ -63,8 +63,8 @@ impl BankForks {
|
||||||
Self::new_from_banks(&[Arc::new(bank)], root)
|
Self::new_from_banks(&[Arc::new(bank)], root)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn banks(&self) -> &HashMap<Slot, Arc<Bank>> {
|
pub fn banks(&self) -> HashMap<Slot, Arc<Bank>> {
|
||||||
&self.banks
|
self.banks.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a map of bank slot id to the set of ancestors for the bank slot.
|
/// Create a map of bank slot id to the set of ancestors for the bank slot.
|
||||||
|
@ -80,8 +80,8 @@ impl BankForks {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a map of bank slot id to the set of all of its descendants
|
/// Create a map of bank slot id to the set of all of its descendants
|
||||||
pub fn descendants(&self) -> &HashMap<Slot, HashSet<Slot>> {
|
pub fn descendants(&self) -> HashMap<Slot, HashSet<Slot>> {
|
||||||
&self.descendants
|
self.descendants.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn frozen_banks(&self) -> HashMap<Slot, Arc<Bank>> {
|
pub fn frozen_banks(&self) -> HashMap<Slot, Arc<Bank>> {
|
||||||
|
@ -100,16 +100,16 @@ impl BankForks {
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get(&self, bank_slot: Slot) -> Option<&Arc<Bank>> {
|
pub fn get(&self, bank_slot: Slot) -> Option<Arc<Bank>> {
|
||||||
self.banks.get(&bank_slot)
|
self.banks.get(&bank_slot).cloned()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_with_checked_hash(
|
pub fn get_with_checked_hash(
|
||||||
&self,
|
&self,
|
||||||
(bank_slot, expected_hash): (Slot, Hash),
|
(bank_slot, expected_hash): (Slot, Hash),
|
||||||
) -> Option<&Arc<Bank>> {
|
) -> Option<Arc<Bank>> {
|
||||||
let maybe_bank = self.banks.get(&bank_slot);
|
let maybe_bank = self.get(bank_slot);
|
||||||
if let Some(bank) = maybe_bank {
|
if let Some(bank) = &maybe_bank {
|
||||||
assert_eq!(bank.hash(), expected_hash);
|
assert_eq!(bank.hash(), expected_hash);
|
||||||
}
|
}
|
||||||
maybe_bank
|
maybe_bank
|
||||||
|
@ -506,10 +506,6 @@ impl BankForks {
|
||||||
self.snapshot_config = snapshot_config;
|
self.snapshot_config = snapshot_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn snapshot_config(&self) -> &Option<SnapshotConfig> {
|
|
||||||
&self.snapshot_config
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn set_accounts_hash_interval_slots(&mut self, accounts_interval_slots: u64) {
|
pub fn set_accounts_hash_interval_slots(&mut self, accounts_interval_slots: u64) {
|
||||||
self.accounts_hash_interval_slots = accounts_interval_slots;
|
self.accounts_hash_interval_slots = accounts_interval_slots;
|
||||||
}
|
}
|
||||||
|
@ -707,7 +703,7 @@ mod tests {
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![
|
make_hash_map(vec![
|
||||||
(0, vec![1, 2, 3, 4]),
|
(0, vec![1, 2, 3, 4]),
|
||||||
(1, vec![2]),
|
(1, vec![2]),
|
||||||
|
@ -724,7 +720,7 @@ mod tests {
|
||||||
banks[2].squash();
|
banks[2].squash();
|
||||||
assert_eq!(bank_forks.ancestors(), make_hash_map(vec![(2, vec![]),]));
|
assert_eq!(bank_forks.ancestors(), make_hash_map(vec![(2, vec![]),]));
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![(0, vec![2]), (1, vec![2]), (2, vec![]),])
|
make_hash_map(vec![(0, vec![2]), (1, vec![2]), (2, vec![]),])
|
||||||
);
|
);
|
||||||
banks.push(bank_forks.insert(Bank::new_from_parent(&banks[2], &Pubkey::default(), 5)));
|
banks.push(bank_forks.insert(Bank::new_from_parent(&banks[2], &Pubkey::default(), 5)));
|
||||||
|
@ -734,7 +730,7 @@ mod tests {
|
||||||
make_hash_map(vec![(2, vec![]), (5, vec![2]), (6, vec![2, 5])])
|
make_hash_map(vec![(2, vec![]), (5, vec![2]), (6, vec![2, 5])])
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![
|
make_hash_map(vec![
|
||||||
(0, vec![2]),
|
(0, vec![2]),
|
||||||
(1, vec![2]),
|
(1, vec![2]),
|
||||||
|
@ -766,7 +762,7 @@ mod tests {
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![
|
make_hash_map(vec![
|
||||||
(0, vec![1, 2, 3, 4]),
|
(0, vec![1, 2, 3, 4]),
|
||||||
(1, vec![2]),
|
(1, vec![2]),
|
||||||
|
@ -786,7 +782,7 @@ mod tests {
|
||||||
make_hash_map(vec![(1, vec![]), (2, vec![]),])
|
make_hash_map(vec![(1, vec![]), (2, vec![]),])
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![(0, vec![1, 2]), (1, vec![2]), (2, vec![]),])
|
make_hash_map(vec![(0, vec![1, 2]), (1, vec![2]), (2, vec![]),])
|
||||||
);
|
);
|
||||||
banks.push(bank_forks.insert(Bank::new_from_parent(&banks[2], &Pubkey::default(), 5)));
|
banks.push(bank_forks.insert(Bank::new_from_parent(&banks[2], &Pubkey::default(), 5)));
|
||||||
|
@ -801,7 +797,7 @@ mod tests {
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
*bank_forks.descendants(),
|
bank_forks.descendants(),
|
||||||
make_hash_map(vec![
|
make_hash_map(vec![
|
||||||
(0, vec![1, 2]),
|
(0, vec![1, 2]),
|
||||||
(1, vec![2]),
|
(1, vec![2]),
|
||||||
|
|
Loading…
Reference in New Issue