Remove slot field, add test (#9444)
Co-authored-by: Carl <carl@solana.com>
This commit is contained in:
parent
31ebdbc77f
commit
3037eb8d4f
|
@ -182,7 +182,6 @@ pub(crate) struct ForkStats {
|
||||||
pub(crate) weight: u128,
|
pub(crate) weight: u128,
|
||||||
pub(crate) fork_weight: u128,
|
pub(crate) fork_weight: u128,
|
||||||
pub(crate) total_staked: u64,
|
pub(crate) total_staked: u64,
|
||||||
pub(crate) slot: Slot,
|
|
||||||
pub(crate) block_height: u64,
|
pub(crate) block_height: u64,
|
||||||
pub(crate) has_voted: bool,
|
pub(crate) has_voted: bool,
|
||||||
pub(crate) is_recent: bool,
|
pub(crate) is_recent: bool,
|
||||||
|
|
|
@ -990,14 +990,12 @@ impl ReplayStage {
|
||||||
.and_then(|b| progress.get(&b.slot()))
|
.and_then(|b| progress.get(&b.slot()))
|
||||||
.map(|x| x.fork_stats.fork_weight)
|
.map(|x| x.fork_stats.fork_weight)
|
||||||
.unwrap_or(0);
|
.unwrap_or(0);
|
||||||
|
|
||||||
{
|
{
|
||||||
let stats = progress
|
let stats = progress
|
||||||
.get_fork_stats_mut(bank_slot)
|
.get_fork_stats_mut(bank_slot)
|
||||||
.expect("All frozen banks must exist in the Progress map");
|
.expect("All frozen banks must exist in the Progress map");
|
||||||
|
|
||||||
if !stats.computed {
|
if !stats.computed {
|
||||||
stats.slot = bank_slot;
|
|
||||||
let (stake_lockouts, total_staked, bank_weight) = tower.collect_vote_lockouts(
|
let (stake_lockouts, total_staked, bank_weight) = tower.collect_vote_lockouts(
|
||||||
bank_slot,
|
bank_slot,
|
||||||
bank.vote_accounts().into_iter(),
|
bank.vote_accounts().into_iter(),
|
||||||
|
@ -1016,7 +1014,7 @@ impl ReplayStage {
|
||||||
info!(
|
info!(
|
||||||
"{} slot_weight: {} {} {} {}",
|
"{} slot_weight: {} {} {} {}",
|
||||||
my_pubkey,
|
my_pubkey,
|
||||||
stats.slot,
|
bank_slot,
|
||||||
stats.weight,
|
stats.weight,
|
||||||
stats.fork_weight,
|
stats.fork_weight,
|
||||||
bank.parent().map(|b| b.slot()).unwrap_or(0)
|
bank.parent().map(|b| b.slot()).unwrap_or(0)
|
||||||
|
@ -1024,7 +1022,7 @@ impl ReplayStage {
|
||||||
stats.stake_lockouts = stake_lockouts;
|
stats.stake_lockouts = stake_lockouts;
|
||||||
stats.block_height = bank.block_height();
|
stats.block_height = bank.block_height();
|
||||||
stats.computed = true;
|
stats.computed = true;
|
||||||
new_stats.push(stats.slot);
|
new_stats.push(bank_slot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1182,12 +1180,12 @@ impl ReplayStage {
|
||||||
let mut candidates: Vec<_> = frozen_banks.iter().zip(stats.iter()).collect();
|
let mut candidates: Vec<_> = frozen_banks.iter().zip(stats.iter()).collect();
|
||||||
|
|
||||||
//highest weight, lowest slot first
|
//highest weight, lowest slot first
|
||||||
candidates.sort_by_key(|b| (b.1.fork_weight, 0i64 - b.1.slot as i64));
|
candidates.sort_by_key(|b| (b.1.fork_weight, 0i64 - b.0.slot() as i64));
|
||||||
let rv = candidates.last();
|
let rv = candidates.last();
|
||||||
let ms = timing::duration_as_ms(&tower_start.elapsed());
|
let ms = timing::duration_as_ms(&tower_start.elapsed());
|
||||||
let weights: Vec<(u128, u64, u64)> = candidates
|
let weights: Vec<(u128, u64, u64)> = candidates
|
||||||
.iter()
|
.iter()
|
||||||
.map(|x| (x.1.weight, x.1.slot, x.1.block_height))
|
.map(|x| (x.1.weight, x.0.slot(), x.1.block_height))
|
||||||
.collect();
|
.collect();
|
||||||
debug!(
|
debug!(
|
||||||
"@{:?} tower duration: {:?} len: {}/{} weights: {:?} voting: {}",
|
"@{:?} tower duration: {:?} len: {}/{} weights: {:?} voting: {}",
|
||||||
|
@ -1873,7 +1871,7 @@ pub(crate) mod tests {
|
||||||
let bank = heaviest_bank.unwrap();
|
let bank = heaviest_bank.unwrap();
|
||||||
let stats = &fork_progresses[i].get_fork_stats(bank.slot()).unwrap();
|
let stats = &fork_progresses[i].get_fork_stats(bank.slot()).unwrap();
|
||||||
Some(ForkSelectionResponse {
|
Some(ForkSelectionResponse {
|
||||||
slot: stats.slot,
|
slot: bank.slot(),
|
||||||
is_locked_out: stats.is_locked_out,
|
is_locked_out: stats.is_locked_out,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -2721,6 +2719,57 @@ pub(crate) mod tests {
|
||||||
assert!(newly_computed.is_empty());
|
assert!(newly_computed.is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_same_weight_select_lower_slot() {
|
||||||
|
// Init state
|
||||||
|
let mut vote_simulator = VoteSimulator::new(1);
|
||||||
|
let node_pubkey = vote_simulator.node_pubkeys[0];
|
||||||
|
let tower = Tower::new_with_key(&node_pubkey);
|
||||||
|
|
||||||
|
// Create the tree of banks in a BankForks object
|
||||||
|
let forks = tr(0) / (tr(1)) / (tr(2));
|
||||||
|
vote_simulator.fill_bank_forks(forks, &HashMap::new());
|
||||||
|
let mut frozen_banks: Vec<_> = vote_simulator
|
||||||
|
.bank_forks
|
||||||
|
.read()
|
||||||
|
.unwrap()
|
||||||
|
.frozen_banks()
|
||||||
|
.values()
|
||||||
|
.cloned()
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let ancestors = vote_simulator.bank_forks.read().unwrap().ancestors();
|
||||||
|
ReplayStage::compute_bank_stats(
|
||||||
|
&Pubkey::default(),
|
||||||
|
&ancestors,
|
||||||
|
&mut frozen_banks,
|
||||||
|
&tower,
|
||||||
|
&mut vote_simulator.progress,
|
||||||
|
&VoteTracker::default(),
|
||||||
|
&ClusterSlots::default(),
|
||||||
|
&vote_simulator.bank_forks,
|
||||||
|
&mut HashSet::new(),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
vote_simulator
|
||||||
|
.progress
|
||||||
|
.get_fork_stats(1)
|
||||||
|
.unwrap()
|
||||||
|
.fork_weight,
|
||||||
|
vote_simulator
|
||||||
|
.progress
|
||||||
|
.get_fork_stats(2)
|
||||||
|
.unwrap()
|
||||||
|
.fork_weight,
|
||||||
|
);
|
||||||
|
let (heaviest_bank, _) =
|
||||||
|
ReplayStage::select_forks(&frozen_banks, &tower, &vote_simulator.progress, &ancestors);
|
||||||
|
|
||||||
|
// Should pick the lower of the two equally weighted banks
|
||||||
|
assert_eq!(heaviest_bank.unwrap().slot(), 1);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_child_bank_heavier() {
|
fn test_child_bank_heavier() {
|
||||||
// Init state
|
// Init state
|
||||||
|
|
Loading…
Reference in New Issue