2019-02-16 19:58:07 -08:00
|
|
|
//! The `bank_forks` module implments BankForks a DAG of checkpointed Banks
|
|
|
|
|
2019-02-18 22:26:22 -08:00
|
|
|
use solana_runtime::bank::Bank;
|
2019-02-16 19:58:07 -08:00
|
|
|
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 {
|
2019-02-16 19:58:07 -08:00
|
|
|
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-26 09:18:24 -08:00
|
|
|
// TODO: use the bank's own ID instead of receiving a parameter
|
2019-02-18 14:35:02 -08:00
|
|
|
pub fn insert(&mut self, bank_id: u64, bank: Bank) {
|
2019-02-26 09:18:24 -08:00
|
|
|
let mut bank = Arc::new(bank);
|
|
|
|
self.banks.insert(bank_id, bank.clone());
|
|
|
|
|
|
|
|
// TODO: this really only needs to look at the first
|
|
|
|
// parent if we're always calling insert()
|
|
|
|
// when we construct a child bank
|
|
|
|
while let Some(parent) = bank.parent() {
|
|
|
|
self.banks.remove(&parent.id());
|
|
|
|
bank = parent;
|
|
|
|
}
|
2019-02-16 19:58:07 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
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();
|
2019-02-18 14:35:02 -08:00
|
|
|
let bank_forks = BankForks::new(0, bank);
|
2019-02-26 09:18:24 -08:00
|
|
|
assert_eq!(bank_forks.working_bank().tick_height(), 0);
|
2019-02-16 19:58:07 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#[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);
|
2019-02-24 20:17:47 -08:00
|
|
|
let child_bank = Bank::new_from_parent(&bank_forks.working_bank());
|
2019-02-16 19:58:07 -08:00
|
|
|
child_bank.register_tick(&Hash::default());
|
2019-02-26 09:18:24 -08:00
|
|
|
bank_forks.insert(1, child_bank);
|
|
|
|
bank_forks.set_working_bank_id(1);
|
|
|
|
assert_eq!(bank_forks.working_bank().tick_height(), 1);
|
2019-02-16 19:58:07 -08:00
|
|
|
}
|
|
|
|
}
|