Propagate dead slots up to replay (#17227)

This commit is contained in:
carllin 2021-05-25 13:43:47 -07:00 committed by GitHub
parent 7a1446a3ed
commit 3dfe87973b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 14 deletions

View File

@ -2755,17 +2755,7 @@ impl Blockstore {
let result: HashMap<u64, Vec<u64>> = slots
.iter()
.zip(slot_metas)
.filter_map(|(height, meta)| {
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)
})
})
.filter_map(|(height, meta)| meta.map(|meta| (*height, meta.next_slots.to_vec())))
.collect();
Ok(result)

View File

@ -2123,9 +2123,14 @@ fn test_optimistic_confirmation_violation_detection() {
"Setting slot: {} on main fork as dead, should cause fork",
prev_voted_slot
);
// marking this voted slot as dead makes the saved tower garbage
// effectively. That's because its stray last vote becomes stale (= no
// ancestor in bank forks).
// Necessary otherwise tower will inform this validator that it's latest
// vote is on slot `prev_voted_slot`. This will then prevent this validator
// 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();
}