diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 785297e6d80e2b..5a981330bccfc2 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -2157,7 +2157,9 @@ impl Bank { // crossed a boundary if !self.epoch_stakes.contains_key(&leader_schedule_epoch) { self.epoch_stakes.retain(|&epoch, _| { - epoch >= leader_schedule_epoch.saturating_sub(MAX_LEADER_SCHEDULE_STAKES) + // Note the greater-than-or-equal (and the `- 1`) is needed here + // to ensure we retain the oldest epoch, if that epoch is 0. + epoch >= leader_schedule_epoch.saturating_sub(MAX_LEADER_SCHEDULE_STAKES - 1) }); let stakes = self.stakes_cache.stakes().clone(); let stakes = SerdeStakesToStakeFormat::from(stakes); diff --git a/runtime/src/bank/tests.rs b/runtime/src/bank/tests.rs index fc608deaa6dcb8..a936cbbf36149e 100644 --- a/runtime/src/bank/tests.rs +++ b/runtime/src/bank/tests.rs @@ -371,8 +371,8 @@ fn test_bank_update_epoch_stakes() { assert_eq!(bank.epoch_stake_keys(), initial_epochs); } - for epoch in (initial_epochs.len() as Epoch)..MAX_LEADER_SCHEDULE_STAKES { - bank.update_epoch_stakes(epoch); + for epoch in (initial_epochs.len() as Epoch)..(MAX_LEADER_SCHEDULE_STAKES - 1) { + bank.update_epoch_stakes(dbg!(epoch)); assert_eq!(bank.epoch_stakes.len() as Epoch, epoch + 1); } @@ -380,28 +380,28 @@ fn test_bank_update_epoch_stakes() { bank.epoch_stake_key_info(), ( 0, - MAX_LEADER_SCHEDULE_STAKES - 1, - MAX_LEADER_SCHEDULE_STAKES as usize + MAX_LEADER_SCHEDULE_STAKES - 2, + MAX_LEADER_SCHEDULE_STAKES as usize - 1, ) ); - bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES); + bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES - 1); assert_eq!( bank.epoch_stake_key_info(), ( 0, - MAX_LEADER_SCHEDULE_STAKES, - MAX_LEADER_SCHEDULE_STAKES as usize + 1 + MAX_LEADER_SCHEDULE_STAKES - 1, + MAX_LEADER_SCHEDULE_STAKES as usize, ) ); - bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES + 1); + bank.update_epoch_stakes(MAX_LEADER_SCHEDULE_STAKES); assert_eq!( bank.epoch_stake_key_info(), ( 1, - MAX_LEADER_SCHEDULE_STAKES + 1, - MAX_LEADER_SCHEDULE_STAKES as usize + 1 + MAX_LEADER_SCHEDULE_STAKES, + MAX_LEADER_SCHEDULE_STAKES as usize, ) ); }