Add root to bank forks (#4206)

This commit is contained in:
carllin 2019-05-07 23:34:10 -07:00 committed by GitHub
parent f690c64375
commit 791ee411a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 5 deletions

View File

@ -11,6 +11,7 @@ use std::time::Instant;
pub struct BankForks { pub struct BankForks {
banks: HashMap<u64, Arc<Bank>>, banks: HashMap<u64, Arc<Bank>>,
working_bank: Arc<Bank>, working_bank: Arc<Bank>,
root: u64,
} }
impl Index<u64> for BankForks { impl Index<u64> for BankForks {
@ -28,6 +29,7 @@ impl BankForks {
Self { Self {
banks, banks,
working_bank, working_bank,
root: 0,
} }
} }
@ -79,13 +81,14 @@ impl BankForks {
self.banks.get(&bank_slot) self.banks.get(&bank_slot)
} }
pub fn new_from_banks(initial_banks: &[Arc<Bank>]) -> Self { pub fn new_from_banks(initial_banks: &[Arc<Bank>], root: u64) -> Self {
let mut banks = HashMap::new(); let mut banks = HashMap::new();
let working_bank = initial_banks[0].clone(); let working_bank = initial_banks[0].clone();
for bank in initial_banks { for bank in initial_banks {
banks.insert(bank.slot(), bank.clone()); banks.insert(bank.slot(), bank.clone());
} }
Self { Self {
root,
banks, banks,
working_bank, working_bank,
} }
@ -105,6 +108,7 @@ impl BankForks {
} }
pub fn set_root(&mut self, root: u64) { pub fn set_root(&mut self, root: u64) {
self.root = root;
let set_root_start = Instant::now(); let set_root_start = Instant::now();
let root_bank = self let root_bank = self
.banks .banks
@ -112,12 +116,17 @@ impl BankForks {
.expect("root bank didn't exist in bank_forks"); .expect("root bank didn't exist in bank_forks");
root_bank.squash(); root_bank.squash();
self.prune_non_root(root); self.prune_non_root(root);
inc_new_counter_info!( inc_new_counter_info!(
"bank-forks_set_root_ms", "bank-forks_set_root_ms",
timing::duration_as_ms(&set_root_start.elapsed()) as usize timing::duration_as_ms(&set_root_start.elapsed()) as usize
); );
} }
pub fn root(&self) -> u64 {
self.root
}
fn prune_non_root(&mut self, root: u64) { fn prune_non_root(&mut self, root: u64) {
let descendants = self.descendants(); let descendants = self.descendants();
self.banks self.banks

View File

@ -157,6 +157,7 @@ pub fn process_blocktree(
let mut fork_info = vec![]; let mut fork_info = vec![];
let mut last_status_report = Instant::now(); let mut last_status_report = Instant::now();
let mut root = 0;
while !pending_slots.is_empty() { while !pending_slots.is_empty() {
let (slot, meta, bank, mut entry_height, mut last_entry_hash) = let (slot, meta, bank, mut entry_height, mut last_entry_hash) =
pending_slots.pop().unwrap(); pending_slots.pop().unwrap();
@ -210,6 +211,7 @@ pub fn process_blocktree(
bank.freeze(); // all banks handled by this routine are created from complete slots bank.freeze(); // all banks handled by this routine are created from complete slots
if blocktree.is_root(slot) { if blocktree.is_root(slot) {
root = slot;
leader_schedule_cache.set_root(slot); leader_schedule_cache.set_root(slot);
bank.squash(); bank.squash();
pending_slots.clear(); pending_slots.clear();
@ -270,7 +272,7 @@ pub fn process_blocktree(
} }
let (banks, bank_forks_info): (Vec<_>, Vec<_>) = fork_info.into_iter().unzip(); let (banks, bank_forks_info): (Vec<_>, Vec<_>) = fork_info.into_iter().unzip();
let bank_forks = BankForks::new_from_banks(&banks); let bank_forks = BankForks::new_from_banks(&banks, root);
info!( info!(
"processing ledger...complete in {}ms, forks={}...", "processing ledger...complete in {}ms, forks={}...",
duration_as_ms(&now.elapsed()), duration_as_ms(&now.elapsed()),
@ -437,6 +439,8 @@ mod tests {
assert_eq!(bank_forks[info.bank_slot].slot(), info.bank_slot); assert_eq!(bank_forks[info.bank_slot].slot(), info.bank_slot);
assert!(bank_forks[info.bank_slot].is_frozen()); assert!(bank_forks[info.bank_slot].is_frozen());
} }
assert_eq!(bank_forks.root(), 4);
} }
#[test] #[test]
@ -521,6 +525,8 @@ mod tests {
&[1] &[1]
); );
assert_eq!(bank_forks.root(), 1);
// Ensure bank_forks holds the right banks // Ensure bank_forks holds the right banks
for info in bank_forks_info { for info in bank_forks_info {
assert_eq!(bank_forks[info.bank_slot].slot(), info.bank_slot); assert_eq!(bank_forks[info.bank_slot].slot(), info.bank_slot);
@ -643,6 +649,7 @@ mod tests {
process_blocktree(&genesis_block, &blocktree, None).unwrap(); process_blocktree(&genesis_block, &blocktree, None).unwrap();
assert_eq!(bank_forks_info.len(), 1); assert_eq!(bank_forks_info.len(), 1);
assert_eq!(bank_forks.root(), 0);
assert_eq!( assert_eq!(
bank_forks_info[0], bank_forks_info[0],
BankForksInfo { BankForksInfo {

View File

@ -480,7 +480,7 @@ mod tests {
let cluster_info = test_cluster_info(&keypair.pubkey()); let cluster_info = test_cluster_info(&keypair.pubkey());
let (genesis_block, _mint_keypair) = create_genesis_block(1000); let (genesis_block, _mint_keypair) = create_genesis_block(1000);
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank]))); let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank], 0)));
let (_slot_sender, slot_receiver) = channel(); let (_slot_sender, slot_receiver) = channel();
let storage_state = StorageState::new(); let storage_state = StorageState::new();
let storage_stage = StorageStage::new( let storage_stage = StorageStage::new(
@ -519,7 +519,7 @@ mod tests {
let blocktree = Arc::new(Blocktree::open(&ledger_path).unwrap()); let blocktree = Arc::new(Blocktree::open(&ledger_path).unwrap());
let slot = 1; let slot = 1;
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank]))); let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank], 0)));
blocktree blocktree
.write_entries(slot, 0, 0, ticks_per_slot, &entries) .write_entries(slot, 0, 0, ticks_per_slot, &entries)
.unwrap(); .unwrap();
@ -594,7 +594,7 @@ mod tests {
.write_entries(1, 0, 0, ticks_per_slot, &entries) .write_entries(1, 0, 0, ticks_per_slot, &entries)
.unwrap(); .unwrap();
let bank = Arc::new(Bank::new(&genesis_block)); let bank = Arc::new(Bank::new(&genesis_block));
let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank]))); let bank_forks = Arc::new(RwLock::new(BankForks::new_from_banks(&[bank], 0)));
let cluster_info = test_cluster_info(&keypair.pubkey()); let cluster_info = test_cluster_info(&keypair.pubkey());
let (slot_sender, slot_receiver) = channel(); let (slot_sender, slot_receiver) = channel();