add global stake warmup (#5483)

* add global stake warmup

* integrate stake history into runtime

* fixup core tests

* fixup

* remove existing cooldown tests for now
This commit is contained in:
Rob Walker
2019-08-12 20:59:57 -07:00
committed by GitHub
parent 7981431f09
commit 07d11be6ab
8 changed files with 549 additions and 239 deletions

View File

@ -1073,7 +1073,7 @@ mod test {
assert_eq!(
bank_forks.read().unwrap().get_fork_confidence(0).unwrap(),
&Confidence::new(0, 1, 2)
&Confidence::new(0, 3, 2)
);
assert!(bank_forks.read().unwrap().get_fork_confidence(1).is_none());
@ -1112,15 +1112,15 @@ mod test {
assert_eq!(
bank_forks.read().unwrap().get_fork_confidence(0).unwrap(),
&Confidence::new_with_stake_weighted(1, 1, 14, 20)
&Confidence::new_with_stake_weighted(3, 3, 14, 60)
);
assert_eq!(
bank_forks.read().unwrap().get_fork_confidence(1).unwrap(),
&Confidence::new_with_stake_weighted(1, 1, 6, 6)
&Confidence::new_with_stake_weighted(3, 3, 6, 18)
);
assert_eq!(
bank_forks.read().unwrap().get_fork_confidence(2).unwrap(),
&Confidence::new_with_stake_weighted(0, 1, 2, 0)
&Confidence::new_with_stake_weighted(0, 3, 2, 0)
);
}
}

View File

@ -119,6 +119,7 @@ pub(crate) mod tests {
use solana_sdk::instruction::Instruction;
use solana_sdk::pubkey::Pubkey;
use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::sysvar::stake_history::{self, StakeHistory};
use solana_sdk::transaction::Transaction;
use solana_stake_api::stake_instruction;
use solana_stake_api::stake_state::Stake;
@ -145,11 +146,12 @@ pub(crate) mod tests {
let leader_stake = Stake {
stake: BOOTSTRAP_LEADER_LAMPORTS,
activated: std::u64::MAX, // exempt from warmup
..Stake::default()
};
// First epoch has the bootstrap leader
expected.insert(voting_keypair.pubkey(), leader_stake.stake(0));
expected.insert(voting_keypair.pubkey(), leader_stake.stake(0, None));
// henceforth, verify that we have snapshots of stake at epoch 0
let expected = Some(expected);
@ -214,6 +216,7 @@ pub(crate) mod tests {
let stake = BOOTSTRAP_LEADER_LAMPORTS * 100;
let leader_stake = Stake {
stake: BOOTSTRAP_LEADER_LAMPORTS,
activated: std::u64::MAX, // mark as bootstrap
..Stake::default()
};
@ -251,26 +254,35 @@ pub(crate) mod tests {
..Stake::default()
};
let epoch = bank.get_stakers_epoch(bank.slot());
let first_stakers_epoch = bank.get_stakers_epoch(bank.slot());
// find the first slot in the next staker's epoch
let mut slot = 1;
while bank.get_stakers_epoch(slot) <= epoch {
let mut slot = bank.slot();
loop {
slot += 1;
if bank.get_stakers_epoch(slot) != first_stakers_epoch {
break;
}
}
let bank = new_from_parent(&Arc::new(bank), slot);
let epoch = bank.get_stakers_epoch(slot);
let next_stakers_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 result: Vec<_> = epoch_stakes_and_lockouts(&bank, first_stakers_epoch);
assert_eq!(
result,
vec![(leader_stake.stake(first_stakers_epoch, None), None)]
);
// 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);
let mut result: Vec<_> = epoch_stakes_and_lockouts(&bank, next_stakers_epoch);
result.sort();
let stake_history =
StakeHistory::from(&bank.get_account(&stake_history::id()).unwrap()).unwrap();
let mut expected = vec![
(leader_stake.stake(bank.epoch()), None),
(other_stake.stake(bank.epoch()), None),
(leader_stake.stake(bank.epoch(), Some(&stake_history)), None),
(other_stake.stake(bank.epoch(), Some(&stake_history)), None),
];
expected.sort();
assert_eq!(result, expected);
}