fix epoch_stakes again (#5396)

This commit is contained in:
Rob Walker
2019-08-01 14:27:47 -07:00
committed by GitHub
parent 4298b1f595
commit f7d3f55566
4 changed files with 43 additions and 38 deletions

View File

@ -214,8 +214,7 @@ impl Tower {
}
pub fn is_recent_epoch(&self, bank: &Bank) -> bool {
let bank_epoch = bank.get_epoch_and_slot_index(bank.slot()).0;
bank_epoch >= self.epoch_stakes.epoch
bank.epoch() >= self.epoch_stakes.epoch
}
pub fn update_epoch(&mut self, bank: &Bank) {
@ -224,8 +223,7 @@ impl Tower {
bank.slot(),
self.epoch_stakes.epoch
);
let bank_epoch = bank.get_epoch_and_slot_index(bank.slot()).0;
if bank_epoch != self.epoch_stakes.epoch {
if bank.epoch() != self.epoch_stakes.epoch {
assert!(
self.is_recent_epoch(bank),
"epoch_stakes cannot move backwards"

View File

@ -150,23 +150,15 @@ pub(crate) mod tests {
// First epoch has the bootstrap leader
expected.insert(voting_keypair.pubkey(), leader_stake.stake(0));
assert_eq!(
vote_account_stakes_at_epoch(&bank, 0),
Some(expected.clone())
);
// henceforth, verify that we have snapshots of stake at epoch 0
let expected = Some(expected);
assert_eq!(vote_account_stakes_at_epoch(&bank, 0), expected);
// Second epoch carries same information
let bank = new_from_parent(&Arc::new(bank), 1);
assert_eq!(
vote_account_stakes_at_epoch(&bank, 0),
Some(expected.clone())
);
expected.insert(voting_keypair.pubkey(), leader_stake.stake(1));
assert_eq!(
vote_account_stakes_at_epoch(&bank, 1),
Some(expected.clone())
);
assert_eq!(vote_account_stakes_at_epoch(&bank, 0), expected);
assert_eq!(vote_account_stakes_at_epoch(&bank, 1), expected);
}
pub(crate) fn setup_vote_and_stake_accounts(
@ -233,7 +225,7 @@ pub(crate) mod tests {
..
} = create_genesis_block(10_000);
let mut bank = Bank::new(&genesis_block);
let bank = Bank::new(&genesis_block);
let vote_pubkey = Pubkey::new_rand();
// Give the validator some stake but don't setup a staking account
@ -252,23 +244,28 @@ pub(crate) mod tests {
stake,
);
// simulated stake
let other_stake = Stake {
stake,
activated: bank.get_stakers_epoch(bank.slot()),
activated: bank.epoch(),
..Stake::default()
};
let epoch = bank.get_stakers_epoch(bank.slot());
// find the first slot in the next staker's epoch
while bank.epoch() <= epoch {
let slot = bank.slot() + 1;
bank = new_from_parent(&Arc::new(bank), slot);
let mut slot = 1;
while bank.get_stakers_epoch(slot) <= epoch {
slot += 1;
}
let bank = new_from_parent(&Arc::new(bank), slot);
let epoch = bank.get_stakers_epoch(slot);
let result: Vec<_> = epoch_stakes_and_lockouts(&bank, 0);
assert_eq!(result, vec![(leader_stake.stake(0), None)]);
let mut result: Vec<_> = epoch_stakes_and_lockouts(&bank, bank.epoch());
// epoch stakes and lockouts are saved off for the future epoch, should
// match current bank state
let mut result: Vec<_> = epoch_stakes_and_lockouts(&bank, epoch);
result.sort();
let mut expected = vec![
(leader_stake.stake(bank.epoch()), None),