2020-06-11 12:16:04 -07:00
|
|
|
use crate::{
|
|
|
|
consensus::{ComputedBankState, SwitchForkDecision, Tower},
|
|
|
|
progress_map::ProgressMap,
|
|
|
|
replay_stage::HeaviestForkFailures,
|
|
|
|
};
|
2020-06-17 08:27:03 -07:00
|
|
|
use solana_runtime::{bank::Bank, bank_forks::BankForks};
|
2020-06-11 12:16:04 -07:00
|
|
|
use std::{
|
|
|
|
collections::{HashMap, HashSet},
|
|
|
|
sync::{Arc, RwLock},
|
|
|
|
};
|
|
|
|
|
|
|
|
pub(crate) struct SelectVoteAndResetForkResult {
|
|
|
|
pub vote_bank: Option<(Arc<Bank>, SwitchForkDecision)>,
|
|
|
|
pub reset_bank: Option<Arc<Bank>>,
|
|
|
|
pub heaviest_fork_failures: Vec<HeaviestForkFailures>,
|
|
|
|
}
|
|
|
|
|
|
|
|
pub(crate) trait ForkChoice {
|
|
|
|
fn compute_bank_stats(
|
|
|
|
&mut self,
|
|
|
|
bank: &Bank,
|
|
|
|
tower: &Tower,
|
|
|
|
progress: &mut ProgressMap,
|
2020-06-17 20:59:08 -07:00
|
|
|
computed_bank_state: &ComputedBankState,
|
2020-06-11 12:16:04 -07:00
|
|
|
);
|
|
|
|
|
|
|
|
// Returns:
|
2020-06-17 20:59:08 -07:00
|
|
|
// 1) The heaviest overall bank
|
|
|
|
// 2) The heaviest bank on the same fork as the last vote (doesn't require a
|
2020-06-11 12:16:04 -07:00
|
|
|
// switching proof to vote for)
|
|
|
|
fn select_forks(
|
|
|
|
&self,
|
|
|
|
frozen_banks: &[Arc<Bank>],
|
|
|
|
tower: &Tower,
|
|
|
|
progress: &ProgressMap,
|
|
|
|
ancestors: &HashMap<u64, HashSet<u64>>,
|
|
|
|
bank_forks: &RwLock<BankForks>,
|
|
|
|
) -> (Arc<Bank>, Option<Arc<Bank>>);
|
|
|
|
}
|