Fix skipping own leader slots (#8533)

automerge
This commit is contained in:
carllin 2020-02-29 00:05:35 -08:00 committed by GitHub
parent 0f31adeafb
commit 6a5a6387e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 2 deletions

View File

@ -152,6 +152,17 @@ impl PohRecorder {
}) })
} }
fn prev_slot_was_mine(&self, current_slot: Slot) -> bool {
if let Some(leader_id) = self
.leader_schedule_cache
.slot_leader_at(current_slot.saturating_sub(1), None)
{
leader_id == self.id
} else {
false
}
}
fn reached_leader_tick(&self, leader_first_tick_height: u64) -> bool { fn reached_leader_tick(&self, leader_first_tick_height: u64) -> bool {
let target_tick_height = leader_first_tick_height.saturating_sub(1); let target_tick_height = leader_first_tick_height.saturating_sub(1);
let ideal_target_tick_height = target_tick_height.saturating_sub(self.grace_ticks); let ideal_target_tick_height = target_tick_height.saturating_sub(self.grace_ticks);
@ -161,7 +172,8 @@ impl PohRecorder {
self.tick_height >= target_tick_height self.tick_height >= target_tick_height
|| self.start_tick_height + self.grace_ticks == leader_first_tick_height || self.start_tick_height + self.grace_ticks == leader_first_tick_height
|| (self.tick_height >= ideal_target_tick_height || (self.tick_height >= ideal_target_tick_height
&& !self.received_any_previous_leader_data(current_slot)) && (self.prev_slot_was_mine(current_slot)
|| !self.received_any_previous_leader_data(current_slot)))
} }
/// returns if leader slot has been reached, how many grace ticks were afforded, /// returns if leader slot has been reached, how many grace ticks were afforded,
@ -1131,6 +1143,7 @@ mod tests {
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2); let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2);
let bank = Arc::new(Bank::new(&genesis_config)); let bank = Arc::new(Bank::new(&genesis_config));
let prev_hash = bank.last_blockhash(); let prev_hash = bank.last_blockhash();
let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank));
let (mut poh_recorder, _entry_receiver) = PohRecorder::new( let (mut poh_recorder, _entry_receiver) = PohRecorder::new(
0, 0,
prev_hash, prev_hash,
@ -1139,10 +1152,12 @@ mod tests {
bank.ticks_per_slot(), bank.ticks_per_slot(),
&Pubkey::default(), &Pubkey::default(),
&Arc::new(blockstore), &Arc::new(blockstore),
&Arc::new(LeaderScheduleCache::new_from_bank(&bank)), &leader_schedule_cache,
&Arc::new(PohConfig::default()), &Arc::new(PohConfig::default()),
); );
let bootstrap_validator_id = leader_schedule_cache.slot_leader_at(0, None).unwrap();
assert_eq!(poh_recorder.reached_leader_tick(0), true); assert_eq!(poh_recorder.reached_leader_tick(0), true);
let grace_ticks = bank.ticks_per_slot() * MAX_GRACE_SLOTS; let grace_ticks = bank.ticks_per_slot() * MAX_GRACE_SLOTS;
@ -1171,6 +1186,11 @@ mod tests {
poh_recorder.reached_leader_tick(new_tick_height + grace_ticks), poh_recorder.reached_leader_tick(new_tick_height + grace_ticks),
false false
); );
// From the bootstrap validator's perspective, it should have reached
// the tick
poh_recorder.id = bootstrap_validator_id;
assert!(poh_recorder.reached_leader_tick(new_tick_height + grace_ticks));
} }
} }