diff --git a/core/src/locktower.rs b/core/src/locktower.rs index 880cef59ff..e350207069 100644 --- a/core/src/locktower.rs +++ b/core/src/locktower.rs @@ -142,13 +142,28 @@ impl Locktower { stake_lockouts } + 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.slot + } + pub fn update_epoch(&mut self, bank: &Bank) { + trace!( + "updating bank epoch {} {}", + bank.slot(), + self.epoch_stakes.slot + ); let bank_epoch = bank.get_epoch_and_slot_index(bank.slot()).0; if bank_epoch != self.epoch_stakes.slot { assert!( - bank_epoch > self.epoch_stakes.slot, + self.is_recent_epoch(bank), "epoch_stakes cannot move backwards" ); + info!( + "Locktower updated epoch bank {} {}", + bank.slot(), + self.epoch_stakes.slot + ); self.epoch_stakes = EpochStakes::new_from_bank(bank); } } diff --git a/core/src/replay_stage.rs b/core/src/replay_stage.rs index 91bce1aaf0..8c46abcfca 100644 --- a/core/src/replay_stage.rs +++ b/core/src/replay_stage.rs @@ -385,6 +385,11 @@ impl ReplayStage { trace!("bank is votable: {} {}", b.slot(), is_votable); is_votable }) + .filter(|b| { + let is_recent_epoch = locktower.is_recent_epoch(b); + trace!("bank is is_recent_epoch: {} {}", b.slot(), is_recent_epoch); + is_recent_epoch + }) .filter(|b| { let has_voted = locktower.has_voted(b.slot()); trace!("bank is has_voted: {} {}", b.slot(), has_voted);