parent
0f31adeafb
commit
6a5a6387e2
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue