Remove unnecessary construction of descendants (#5742)

This commit is contained in:
carllin 2019-09-04 01:49:42 -07:00 committed by GitHub
parent 3b0d48e3b8
commit dfa6238342
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 26 deletions

View File

@ -259,22 +259,26 @@ impl Tower {
false false
} }
pub fn is_locked_out(&self, slot: u64, descendants: &HashMap<u64, HashSet<u64>>) -> bool { pub fn is_locked_out(&self, slot: u64, ancestors: &HashMap<u64, HashSet<u64>>) -> bool {
assert!(ancestors.contains_key(&slot));
let mut lockouts = self.lockouts.clone(); let mut lockouts = self.lockouts.clone();
lockouts.process_slot_vote_unchecked(slot); lockouts.process_slot_vote_unchecked(slot);
for vote in &lockouts.votes { for vote in &lockouts.votes {
if vote.slot == slot { if vote.slot == slot {
continue; continue;
} }
if !descendants[&vote.slot].contains(&slot) { if !ancestors[&slot].contains(&vote.slot) {
return true; return true;
} }
} }
if let Some(root) = lockouts.root_slot { if let Some(root) = lockouts.root_slot {
!descendants[&root].contains(&slot) // This case should never happen because bank forks purges all
} else { // non-descendants of the root every time root is set
false assert!(ancestors[&slot].contains(&root));
} }
false
} }
pub fn check_vote_stake_threshold( pub fn check_vote_stake_threshold(
@ -605,28 +609,29 @@ mod test {
#[test] #[test]
fn test_is_locked_out_empty() { fn test_is_locked_out_empty() {
let tower = Tower::new_for_tests(0, 0.67); let tower = Tower::new_for_tests(0, 0.67);
let descendants = HashMap::new(); let ancestors = vec![(0, HashSet::new())].into_iter().collect();
assert!(!tower.is_locked_out(0, &descendants)); assert!(!tower.is_locked_out(0, &ancestors));
} }
#[test] #[test]
fn test_is_locked_out_root_slot_child_pass() { fn test_is_locked_out_root_slot_child_pass() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![(0, vec![1].into_iter().collect())] let ancestors = vec![(1, vec![0].into_iter().collect())]
.into_iter() .into_iter()
.collect(); .collect();
tower.lockouts.root_slot = Some(0); tower.lockouts.root_slot = Some(0);
assert!(!tower.is_locked_out(1, &descendants)); assert!(!tower.is_locked_out(1, &ancestors));
} }
#[test] #[test]
fn test_is_locked_out_root_slot_sibling_fail() { fn test_is_locked_out_root_slot_sibling_fail() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![(0, vec![1].into_iter().collect())] let ancestors = vec![(2, vec![0].into_iter().collect())]
.into_iter() .into_iter()
.collect(); .collect();
tower.lockouts.root_slot = Some(0); tower.lockouts.root_slot = Some(0);
assert!(tower.is_locked_out(2, &descendants)); tower.record_vote(1, Hash::default());
assert!(tower.is_locked_out(2, &ancestors));
} }
#[test] #[test]
@ -640,48 +645,52 @@ mod test {
#[test] #[test]
fn test_is_locked_out_double_vote() { fn test_is_locked_out_double_vote() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![(0, vec![1].into_iter().collect()), (1, HashSet::new())] let ancestors = vec![(1, vec![0].into_iter().collect()), (0, HashSet::new())]
.into_iter() .into_iter()
.collect(); .collect();
tower.record_vote(0, Hash::default()); tower.record_vote(0, Hash::default());
tower.record_vote(1, Hash::default()); tower.record_vote(1, Hash::default());
assert!(tower.is_locked_out(0, &descendants)); assert!(tower.is_locked_out(0, &ancestors));
} }
#[test] #[test]
fn test_is_locked_out_child() { fn test_is_locked_out_child() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![(0, vec![1].into_iter().collect())] let ancestors = vec![(1, vec![0].into_iter().collect())]
.into_iter() .into_iter()
.collect(); .collect();
tower.record_vote(0, Hash::default()); tower.record_vote(0, Hash::default());
assert!(!tower.is_locked_out(1, &descendants)); assert!(!tower.is_locked_out(1, &ancestors));
} }
#[test] #[test]
fn test_is_locked_out_sibling() { fn test_is_locked_out_sibling() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![ let ancestors = vec![
(0, vec![1, 2].into_iter().collect()), (0, HashSet::new()),
(1, HashSet::new()), (1, vec![0].into_iter().collect()),
(2, HashSet::new()), (2, vec![0].into_iter().collect()),
] ]
.into_iter() .into_iter()
.collect(); .collect();
tower.record_vote(0, Hash::default()); tower.record_vote(0, Hash::default());
tower.record_vote(1, Hash::default()); tower.record_vote(1, Hash::default());
assert!(tower.is_locked_out(2, &descendants)); assert!(tower.is_locked_out(2, &ancestors));
} }
#[test] #[test]
fn test_is_locked_out_last_vote_expired() { fn test_is_locked_out_last_vote_expired() {
let mut tower = Tower::new_for_tests(0, 0.67); let mut tower = Tower::new_for_tests(0, 0.67);
let descendants = vec![(0, vec![1, 4].into_iter().collect()), (1, HashSet::new())] let ancestors = vec![
.into_iter() (0, HashSet::new()),
.collect(); (1, vec![0].into_iter().collect()),
(4, vec![0].into_iter().collect()),
]
.into_iter()
.collect();
tower.record_vote(0, Hash::default()); tower.record_vote(0, Hash::default());
tower.record_vote(1, Hash::default()); tower.record_vote(1, Hash::default());
assert!(!tower.is_locked_out(4, &descendants)); assert!(!tower.is_locked_out(4, &ancestors));
tower.record_vote(4, Hash::default()); tower.record_vote(4, Hash::default());
assert_eq!(tower.lockouts.votes[0].slot, 0); assert_eq!(tower.lockouts.votes[0].slot, 0);
assert_eq!(tower.lockouts.votes[0].confirmation_count, 2); assert_eq!(tower.lockouts.votes[0].confirmation_count, 2);

View File

@ -573,7 +573,6 @@ impl ReplayStage {
) -> Vec<(u128, Arc<Bank>, HashMap<u64, StakeLockout>, u64)> { ) -> Vec<(u128, Arc<Bank>, HashMap<u64, StakeLockout>, u64)> {
let tower_start = Instant::now(); let tower_start = Instant::now();
// Tower voting // Tower voting
let descendants = bank_forks.read().unwrap().descendants();
let ancestors = bank_forks.read().unwrap().ancestors(); let ancestors = bank_forks.read().unwrap().ancestors();
let frozen_banks = bank_forks.read().unwrap().frozen_banks(); let frozen_banks = bank_forks.read().unwrap().frozen_banks();
@ -591,7 +590,7 @@ impl ReplayStage {
!has_voted !has_voted
}) })
.filter(|b| { .filter(|b| {
let is_locked_out = tower.is_locked_out(b.slot(), &descendants); let is_locked_out = tower.is_locked_out(b.slot(), &ancestors);
trace!("bank is is_locked_out: {} {}", b.slot(), is_locked_out); trace!("bank is is_locked_out: {} {}", b.slot(), is_locked_out);
!is_locked_out !is_locked_out
}) })