@@ -152,6 +152,17 @@ impl PohRecorder {
152
152
} )
153
153
}
154
154
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
+
155
166
fn reached_leader_tick ( & self , leader_first_tick_height : u64 ) -> bool {
156
167
let target_tick_height = leader_first_tick_height. saturating_sub ( 1 ) ;
157
168
let ideal_target_tick_height = target_tick_height. saturating_sub ( self . grace_ticks ) ;
@@ -161,7 +172,8 @@ impl PohRecorder {
161
172
self . tick_height >= target_tick_height
162
173
|| self . start_tick_height + self . grace_ticks == leader_first_tick_height
163
174
|| ( 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) ) )
165
177
}
166
178
167
179
/// returns if leader slot has been reached, how many grace ticks were afforded,
@@ -1131,6 +1143,7 @@ mod tests {
1131
1143
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config ( 2 ) ;
1132
1144
let bank = Arc :: new ( Bank :: new ( & genesis_config) ) ;
1133
1145
let prev_hash = bank. last_blockhash ( ) ;
1146
+ let leader_schedule_cache = Arc :: new ( LeaderScheduleCache :: new_from_bank ( & bank) ) ;
1134
1147
let ( mut poh_recorder, _entry_receiver) = PohRecorder :: new (
1135
1148
0 ,
1136
1149
prev_hash,
@@ -1139,10 +1152,12 @@ mod tests {
1139
1152
bank. ticks_per_slot ( ) ,
1140
1153
& Pubkey :: default ( ) ,
1141
1154
& Arc :: new ( blockstore) ,
1142
- & Arc :: new ( LeaderScheduleCache :: new_from_bank ( & bank ) ) ,
1155
+ & leader_schedule_cache ,
1143
1156
& Arc :: new ( PohConfig :: default ( ) ) ,
1144
1157
) ;
1145
1158
1159
+ let bootstrap_validator_id = leader_schedule_cache. slot_leader_at ( 0 , None ) . unwrap ( ) ;
1160
+
1146
1161
assert_eq ! ( poh_recorder. reached_leader_tick( 0 ) , true ) ;
1147
1162
1148
1163
let grace_ticks = bank. ticks_per_slot ( ) * MAX_GRACE_SLOTS ;
@@ -1171,6 +1186,11 @@ mod tests {
1171
1186
poh_recorder. reached_leader_tick( new_tick_height + grace_ticks) ,
1172
1187
false
1173
1188
) ;
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) ) ;
1174
1194
}
1175
1195
}
1176
1196
0 commit comments