Propagate dead slots up to replay (#17227)
This commit is contained in:
@ -2755,17 +2755,7 @@ impl Blockstore {
|
|||||||
let result: HashMap<u64, Vec<u64>> = slots
|
let result: HashMap<u64, Vec<u64>> = slots
|
||||||
.iter()
|
.iter()
|
||||||
.zip(slot_metas)
|
.zip(slot_metas)
|
||||||
.filter_map(|(height, meta)| {
|
.filter_map(|(height, meta)| meta.map(|meta| (*height, meta.next_slots.to_vec())))
|
||||||
meta.map(|meta| {
|
|
||||||
let valid_next_slots: Vec<u64> = meta
|
|
||||||
.next_slots
|
|
||||||
.iter()
|
|
||||||
.cloned()
|
|
||||||
.filter(|s| !self.is_dead(*s))
|
|
||||||
.collect();
|
|
||||||
(*height, valid_next_slots)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
|
@ -2123,9 +2123,14 @@ fn test_optimistic_confirmation_violation_detection() {
|
|||||||
"Setting slot: {} on main fork as dead, should cause fork",
|
"Setting slot: {} on main fork as dead, should cause fork",
|
||||||
prev_voted_slot
|
prev_voted_slot
|
||||||
);
|
);
|
||||||
// marking this voted slot as dead makes the saved tower garbage
|
// Necessary otherwise tower will inform this validator that it's latest
|
||||||
// effectively. That's because its stray last vote becomes stale (= no
|
// vote is on slot `prev_voted_slot`. This will then prevent this validator
|
||||||
// ancestor in bank forks).
|
// from resetting to the parent of `prev_voted_slot` to create an alternative fork because
|
||||||
|
// 1) Validator can't vote on earlier ancestor of last vote due to switch threshold (can't vote
|
||||||
|
// on ancestors of last vote)
|
||||||
|
// 2) Won't reset to this earlier ancestor becasue reset can only happen on same voted fork if
|
||||||
|
// it's for the last vote slot or later
|
||||||
|
remove_tower(&exited_validator_info.info.ledger_path, &entry_point_id);
|
||||||
blockstore.set_dead_slot(prev_voted_slot).unwrap();
|
blockstore.set_dead_slot(prev_voted_slot).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user