Allow existence of vote on root in saved tower (#13135)
This commit is contained in:
parent
efe683b3be
commit
66c7a98009
|
@ -921,11 +921,12 @@ impl Tower {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(checked_slot) = checked_slot {
|
if let Some(checked_slot) = checked_slot {
|
||||||
// This is really special, only if tower is initialized (root = slot 0) for genesis and contains
|
// This is really special, only if tower is initialized and contains
|
||||||
// a vote (= slot 0) for the genesis, the slot 0 can repeat only once
|
// a vote for the root, the root slot can repeat only once
|
||||||
let voting_from_genesis = *slot_in_tower == checked_slot && *slot_in_tower == 0;
|
let voting_for_root =
|
||||||
|
*slot_in_tower == checked_slot && *slot_in_tower == tower_root;
|
||||||
|
|
||||||
if !voting_from_genesis {
|
if !voting_for_root {
|
||||||
// Unless we're voting since genesis, slots_in_tower must always be older than last checked_slot
|
// Unless we're voting since genesis, slots_in_tower must always be older than last checked_slot
|
||||||
// including all vote slot and the root slot.
|
// including all vote slot and the root slot.
|
||||||
assert!(
|
assert!(
|
||||||
|
@ -3038,6 +3039,23 @@ pub mod test {
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_adjust_lockouts_after_replay_vote_on_root() {
|
||||||
|
let mut tower = Tower::new_for_tests(10, 0.9);
|
||||||
|
tower.lockouts.root_slot = Some(42);
|
||||||
|
tower.lockouts.votes.push_back(Lockout::new(42));
|
||||||
|
tower.lockouts.votes.push_back(Lockout::new(43));
|
||||||
|
tower.lockouts.votes.push_back(Lockout::new(44));
|
||||||
|
let vote = Vote::new(vec![44], Hash::default());
|
||||||
|
tower.last_vote = vote;
|
||||||
|
|
||||||
|
let mut slot_history = SlotHistory::default();
|
||||||
|
slot_history.add(42);
|
||||||
|
|
||||||
|
let tower = tower.adjust_lockouts_after_replay(42, &slot_history);
|
||||||
|
assert_eq!(tower.unwrap().voted_slots(), [43, 44]);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_adjust_lockouts_after_replay_vote_on_genesis() {
|
fn test_adjust_lockouts_after_replay_vote_on_genesis() {
|
||||||
let mut tower = Tower::new_for_tests(10, 0.9);
|
let mut tower = Tower::new_for_tests(10, 0.9);
|
||||||
|
|
Loading…
Reference in New Issue