From 3dfe87973b92a6db5669c1ce335f3dffac37b3a9 Mon Sep 17 00:00:00 2001 From: carllin Date: Tue, 25 May 2021 13:43:47 -0700 Subject: [PATCH] Propagate dead slots up to replay (#17227) --- ledger/src/blockstore.rs | 12 +----------- local-cluster/tests/local_cluster.rs | 11 ++++++++--- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index 2c207249fe..36f00e2fe9 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -2755,17 +2755,7 @@ impl Blockstore { let result: HashMap> = slots .iter() .zip(slot_metas) - .filter_map(|(height, meta)| { - meta.map(|meta| { - let valid_next_slots: Vec = 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) diff --git a/local-cluster/tests/local_cluster.rs b/local-cluster/tests/local_cluster.rs index 4f0f3bcb66..2ef5fd4e6c 100644 --- a/local-cluster/tests/local_cluster.rs +++ b/local-cluster/tests/local_cluster.rs @@ -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(); }