use ticks per slot to check if the current tick is in the leader slot
This commit is contained in:
		| @@ -48,6 +48,7 @@ pub struct PohRecorder { | ||||
|     working_bank: Option<WorkingBank>, | ||||
|     sender: Sender<WorkingBankEntries>, | ||||
|     start_leader_at_tick: Option<u64>, | ||||
|     last_leader_tick: Option<u64>, | ||||
|     max_last_leader_grace_ticks: u64, | ||||
|     id: Pubkey, | ||||
| } | ||||
| @@ -58,9 +59,13 @@ impl PohRecorder { | ||||
|             let bank = working_bank.bank; | ||||
|             let next_leader_slot = | ||||
|                 leader_schedule_utils::next_leader_slot(&self.id, bank.slot(), &bank); | ||||
|             self.start_leader_at_tick = next_leader_slot | ||||
|                 .map(|slot| Some(slot * bank.ticks_per_slot() + self.max_last_leader_grace_ticks)) | ||||
|                 .unwrap_or(None); | ||||
|             let (start_leader_at_tick, last_leader_tick) = Self::compute_leader_slot_ticks( | ||||
|                 &next_leader_slot, | ||||
|                 bank.ticks_per_slot(), | ||||
|                 self.max_last_leader_grace_ticks, | ||||
|             ); | ||||
|             self.start_leader_at_tick = start_leader_at_tick; | ||||
|             self.last_leader_tick = last_leader_tick; | ||||
|         } | ||||
|         if let Some(ref signal) = self.clear_bank_signal { | ||||
|             let _ = signal.try_send(true); | ||||
| @@ -103,7 +108,7 @@ impl PohRecorder { | ||||
|                 // Is the current tick in the same slot as the target tick? | ||||
|                 // Check if either grace period has expired, | ||||
|                 // or target tick is = grace period (i.e. poh recorder was just reset) | ||||
|                 if self.tick_height().saturating_sub(target_tick) < self.max_last_leader_grace_ticks | ||||
|                 if self.tick_height() <= self.last_leader_tick.unwrap_or(0) | ||||
|                     && (self.tick_height() >= target_tick | ||||
|                         || self.max_last_leader_grace_ticks | ||||
|                             >= target_tick.saturating_sub(self.start_tick)) | ||||
| @@ -119,6 +124,21 @@ impl PohRecorder { | ||||
|             .unwrap_or((false, 0)) | ||||
|     } | ||||
|  | ||||
|     fn compute_leader_slot_ticks( | ||||
|         next_leader_slot: &Option<u64>, | ||||
|         ticks_per_slot: u64, | ||||
|         grace_ticks: u64, | ||||
|     ) -> (Option<u64>, Option<u64>) { | ||||
|         next_leader_slot | ||||
|             .map(|slot| { | ||||
|                 ( | ||||
|                     Some(slot * ticks_per_slot + grace_ticks), | ||||
|                     Some((slot + 1) * ticks_per_slot - 1), | ||||
|                 ) | ||||
|             }) | ||||
|             .unwrap_or((None, None)) | ||||
|     } | ||||
|  | ||||
|     // synchronize PoH with a bank | ||||
|     pub fn reset( | ||||
|         &mut self, | ||||
| @@ -139,9 +159,13 @@ impl PohRecorder { | ||||
|         self.start_tick = tick_height + 1; | ||||
|         self.poh = Poh::new(blockhash, tick_height); | ||||
|         self.max_last_leader_grace_ticks = ticks_per_slot / MAX_LAST_LEADER_GRACE_TICKS_FACTOR; | ||||
|         self.start_leader_at_tick = my_next_leader_slot | ||||
|             .map(|slot| Some(slot * ticks_per_slot + self.max_last_leader_grace_ticks)) | ||||
|             .unwrap_or(None); | ||||
|         let (start_leader_at_tick, last_leader_tick) = Self::compute_leader_slot_ticks( | ||||
|             &my_next_leader_slot, | ||||
|             ticks_per_slot, | ||||
|             self.max_last_leader_grace_ticks, | ||||
|         ); | ||||
|         self.start_leader_at_tick = start_leader_at_tick; | ||||
|         self.last_leader_tick = last_leader_tick; | ||||
|     } | ||||
|  | ||||
|     pub fn set_working_bank(&mut self, working_bank: WorkingBank) { | ||||
| @@ -251,6 +275,12 @@ impl PohRecorder { | ||||
|     ) -> (Self, Receiver<WorkingBankEntries>) { | ||||
|         let poh = Poh::new(last_entry_hash, tick_height); | ||||
|         let (sender, receiver) = channel(); | ||||
|         let max_last_leader_grace_ticks = ticks_per_slot / MAX_LAST_LEADER_GRACE_TICKS_FACTOR; | ||||
|         let (start_leader_at_tick, last_leader_tick) = Self::compute_leader_slot_ticks( | ||||
|             &my_leader_slot_index, | ||||
|             ticks_per_slot, | ||||
|             max_last_leader_grace_ticks, | ||||
|         ); | ||||
|         ( | ||||
|             PohRecorder { | ||||
|                 poh, | ||||
| @@ -260,15 +290,9 @@ impl PohRecorder { | ||||
|                 clear_bank_signal: None, | ||||
|                 start_slot, | ||||
|                 start_tick: tick_height + 1, | ||||
|                 start_leader_at_tick: my_leader_slot_index | ||||
|                     .map(|slot| { | ||||
|                         Some( | ||||
|                             slot * ticks_per_slot | ||||
|                                 + ticks_per_slot / MAX_LAST_LEADER_GRACE_TICKS_FACTOR, | ||||
|                         ) | ||||
|                     }) | ||||
|                     .unwrap_or(None), | ||||
|                 max_last_leader_grace_ticks: ticks_per_slot / MAX_LAST_LEADER_GRACE_TICKS_FACTOR, | ||||
|                 start_leader_at_tick, | ||||
|                 last_leader_tick, | ||||
|                 max_last_leader_grace_ticks, | ||||
|                 id: *id, | ||||
|             }, | ||||
|             receiver, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user