solana/src/bank_forks.rs

62 lines
1.7 KiB
Rust
Raw Normal View History

//! The `bank_forks` module implments BankForks a DAG of checkpointed Banks
use solana_runtime::bank::Bank;
use std::collections::HashMap;
use std::sync::Arc;
pub struct BankForks {
working_bank_id: u64,
banks: HashMap<u64, Arc<Bank>>,
}
impl BankForks {
2019-02-18 14:35:02 -08:00
pub fn new(working_bank_id: u64, bank: Bank) -> Self {
let mut banks = HashMap::new();
banks.insert(working_bank_id, Arc::new(bank));
Self {
working_bank_id,
banks,
}
}
pub fn working_bank(&self) -> Arc<Bank> {
self.banks[&self.working_bank_id].clone()
}
2019-02-18 14:35:02 -08:00
pub fn insert(&mut self, bank_id: u64, bank: Bank) {
self.banks.insert(bank_id, Arc::new(bank));
}
pub fn set_working_bank_id(&mut self, bank_id: u64) {
if self.banks.contains_key(&bank_id) {
self.working_bank_id = bank_id;
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use solana_sdk::hash::Hash;
#[test]
fn test_bank_forks_root() {
let bank = Bank::default();
let tick_height = bank.tick_height();
2019-02-18 14:35:02 -08:00
let bank_forks = BankForks::new(0, bank);
assert_eq!(bank_forks.working_bank().tick_height(), tick_height);
}
#[test]
fn test_bank_forks_parent() {
let bank = Bank::default();
2019-02-18 14:35:02 -08:00
let mut bank_forks = BankForks::new(0, bank);
let child_bank = Bank::new_from_parent(&bank_forks.working_bank());
child_bank.register_tick(&Hash::default());
2019-02-18 14:35:02 -08:00
let child_bank_id = 1;
bank_forks.insert(child_bank_id, child_bank);
bank_forks.set_working_bank_id(child_bank_id);
assert_eq!(bank_forks.working_bank().tick_height(), child_bank_id);
}
}