Handle removing slots during account scans (#17471)
This commit is contained in:
@ -17,7 +17,12 @@ use solana_ledger::{
|
||||
};
|
||||
use solana_measure::measure::Measure;
|
||||
use solana_runtime::{bank::Bank, bank_forks::BankForks, contains::Contains};
|
||||
use solana_sdk::{clock::Slot, epoch_schedule::EpochSchedule, pubkey::Pubkey, timing::timestamp};
|
||||
use solana_sdk::{
|
||||
clock::{BankId, Slot},
|
||||
epoch_schedule::EpochSchedule,
|
||||
pubkey::Pubkey,
|
||||
timing::timestamp,
|
||||
};
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
iter::Iterator,
|
||||
@ -559,7 +564,7 @@ impl RepairService {
|
||||
|
||||
#[allow(dead_code)]
|
||||
fn process_new_duplicate_slots(
|
||||
new_duplicate_slots: &[Slot],
|
||||
new_duplicate_slots: &[(Slot, BankId)],
|
||||
duplicate_slot_repair_statuses: &mut HashMap<Slot, DuplicateSlotRepairStatus>,
|
||||
cluster_slots: &ClusterSlots,
|
||||
root_bank: &Bank,
|
||||
@ -568,7 +573,7 @@ impl RepairService {
|
||||
duplicate_slots_reset_sender: &DuplicateSlotsResetSender,
|
||||
repair_validators: &Option<HashSet<Pubkey>>,
|
||||
) {
|
||||
for slot in new_duplicate_slots {
|
||||
for (slot, bank_id) in new_duplicate_slots {
|
||||
warn!(
|
||||
"Cluster confirmed slot: {}, dumping our current version and repairing",
|
||||
slot
|
||||
@ -577,7 +582,7 @@ impl RepairService {
|
||||
root_bank.clear_slot_signatures(*slot);
|
||||
|
||||
// Clear the accounts for this slot
|
||||
root_bank.remove_unrooted_slots(&[*slot]);
|
||||
root_bank.remove_unrooted_slots(&[(*slot, *bank_id)]);
|
||||
|
||||
// Clear the slot-related data in blockstore. This will:
|
||||
// 1) Clear old shreds allowing new ones to be inserted
|
||||
@ -1139,6 +1144,7 @@ mod test {
|
||||
);
|
||||
let bank0 = Arc::new(Bank::new(&genesis_config));
|
||||
let bank9 = Bank::new_from_parent(&bank0, &Pubkey::default(), duplicate_slot);
|
||||
let duplicate_bank_id = bank9.bank_id();
|
||||
let old_balance = bank9.get_balance(&keypairs.node_keypair.pubkey());
|
||||
bank9
|
||||
.transfer(10_000, &mint_keypair, &keypairs.node_keypair.pubkey())
|
||||
@ -1156,7 +1162,7 @@ mod test {
|
||||
assert!(bank9.get_signature_status(&vote_tx.signatures[0]).is_some());
|
||||
|
||||
RepairService::process_new_duplicate_slots(
|
||||
&[duplicate_slot],
|
||||
&[(duplicate_slot, duplicate_bank_id)],
|
||||
&mut duplicate_slot_repair_statuses,
|
||||
&cluster_slots,
|
||||
&bank9,
|
||||
|
@ -850,12 +850,6 @@ impl ReplayStage {
|
||||
// Clear the duplicate banks from BankForks
|
||||
{
|
||||
let mut w_bank_forks = bank_forks.write().unwrap();
|
||||
// Purging should have already been taken care of by logic
|
||||
// in repair_service, so make sure drop implementation doesn't
|
||||
// run
|
||||
if let Some(b) = w_bank_forks.get(*d) {
|
||||
b.skip_drop.store(true, Ordering::Relaxed)
|
||||
}
|
||||
w_bank_forks.remove(*d);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user