Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 6a5a638

Browse files
authored
Fix skipping own leader slots (#8533)
automerge
1 parent 0f31ade commit 6a5a638

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

core/src/poh_recorder.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,17 @@ impl PohRecorder {
152152
})
153153
}
154154

155+
fn prev_slot_was_mine(&self, current_slot: Slot) -> bool {
156+
if let Some(leader_id) = self
157+
.leader_schedule_cache
158+
.slot_leader_at(current_slot.saturating_sub(1), None)
159+
{
160+
leader_id == self.id
161+
} else {
162+
false
163+
}
164+
}
165+
155166
fn reached_leader_tick(&self, leader_first_tick_height: u64) -> bool {
156167
let target_tick_height = leader_first_tick_height.saturating_sub(1);
157168
let ideal_target_tick_height = target_tick_height.saturating_sub(self.grace_ticks);
@@ -161,7 +172,8 @@ impl PohRecorder {
161172
self.tick_height >= target_tick_height
162173
|| self.start_tick_height + self.grace_ticks == leader_first_tick_height
163174
|| (self.tick_height >= ideal_target_tick_height
164-
&& !self.received_any_previous_leader_data(current_slot))
175+
&& (self.prev_slot_was_mine(current_slot)
176+
|| !self.received_any_previous_leader_data(current_slot)))
165177
}
166178

167179
/// returns if leader slot has been reached, how many grace ticks were afforded,
@@ -1131,6 +1143,7 @@ mod tests {
11311143
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(2);
11321144
let bank = Arc::new(Bank::new(&genesis_config));
11331145
let prev_hash = bank.last_blockhash();
1146+
let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank));
11341147
let (mut poh_recorder, _entry_receiver) = PohRecorder::new(
11351148
0,
11361149
prev_hash,
@@ -1139,10 +1152,12 @@ mod tests {
11391152
bank.ticks_per_slot(),
11401153
&Pubkey::default(),
11411154
&Arc::new(blockstore),
1142-
&Arc::new(LeaderScheduleCache::new_from_bank(&bank)),
1155+
&leader_schedule_cache,
11431156
&Arc::new(PohConfig::default()),
11441157
);
11451158

1159+
let bootstrap_validator_id = leader_schedule_cache.slot_leader_at(0, None).unwrap();
1160+
11461161
assert_eq!(poh_recorder.reached_leader_tick(0), true);
11471162

11481163
let grace_ticks = bank.ticks_per_slot() * MAX_GRACE_SLOTS;
@@ -1171,6 +1186,11 @@ mod tests {
11711186
poh_recorder.reached_leader_tick(new_tick_height + grace_ticks),
11721187
false
11731188
);
1189+
1190+
// From the bootstrap validator's perspective, it should have reached
1191+
// the tick
1192+
poh_recorder.id = bootstrap_validator_id;
1193+
assert!(poh_recorder.reached_leader_tick(new_tick_height + grace_ticks));
11741194
}
11751195
}
11761196

0 commit comments

Comments
 (0)