diff --git a/core/src/cluster_slots.rs b/core/src/cluster_slots.rs index cdac782550..3984f97111 100644 --- a/core/src/cluster_slots.rs +++ b/core/src/cluster_slots.rs @@ -1,20 +1,21 @@ -use crate::serve_repair::ShredRepairType; -use itertools::Itertools; -use solana_gossip::{ - cluster_info::ClusterInfo, contact_info::ContactInfo, crds::Cursor, epoch_slots::EpochSlots, -}; -use solana_runtime::{bank_forks::BankForks, epoch_stakes::NodeIdToVoteAccounts}; -use solana_sdk::{clock::Slot, pubkey::Pubkey}; -use std::{ - collections::{BTreeMap, HashMap, HashSet}, - sync::{Arc, Mutex, RwLock}, +use { + itertools::Itertools, + solana_gossip::{ + cluster_info::ClusterInfo, contact_info::ContactInfo, crds::Cursor, epoch_slots::EpochSlots, + }, + solana_runtime::{bank_forks::BankForks, epoch_stakes::NodeIdToVoteAccounts}, + solana_sdk::{clock::Slot, pubkey::Pubkey}, + std::{ + collections::{BTreeMap, HashMap}, + sync::{Arc, Mutex, RwLock}, + }, }; // Limit the size of cluster-slots map in case // of receiving bogus epoch slots values. const CLUSTER_SLOTS_TRIM_SIZE: usize = 524_288; // 512K -pub type SlotPubkeys = HashMap; +pub(crate) type SlotPubkeys = HashMap; #[derive(Default)] pub struct ClusterSlots { @@ -25,11 +26,16 @@ pub struct ClusterSlots { } impl ClusterSlots { - pub fn lookup(&self, slot: Slot) -> Option>> { + pub(crate) fn lookup(&self, slot: Slot) -> Option>> { self.cluster_slots.read().unwrap().get(&slot).cloned() } - pub fn update(&self, root: Slot, cluster_info: &ClusterInfo, bank_forks: &RwLock) { + pub(crate) fn update( + &self, + root: Slot, + cluster_info: &ClusterInfo, + bank_forks: &RwLock, + ) { self.update_peers(bank_forks); let epoch_slots = { let mut cursor = self.cursor.lock().unwrap(); @@ -89,16 +95,6 @@ impl ClusterSlots { } } - pub fn collect(&self, id: &Pubkey) -> HashSet { - self.cluster_slots - .read() - .unwrap() - .iter() - .filter(|(_, keys)| keys.read().unwrap().contains_key(id)) - .map(|(slot, _)| *slot) - .collect() - } - #[cfg(test)] pub(crate) fn insert_node_id(&self, slot: Slot, node_id: Pubkey) { let balance = self @@ -135,7 +131,7 @@ impl ClusterSlots { } } - pub fn compute_weights(&self, slot: Slot, repair_peers: &[ContactInfo]) -> Vec { + pub(crate) fn compute_weights(&self, slot: Slot, repair_peers: &[ContactInfo]) -> Vec { if repair_peers.is_empty() { return Vec::default(); } @@ -165,7 +161,7 @@ impl ClusterSlots { .collect() } - pub fn compute_weights_exclude_nonfrozen( + pub(crate) fn compute_weights_exclude_nonfrozen( &self, slot: Slot, repair_peers: &[ContactInfo], @@ -181,21 +177,6 @@ impl ClusterSlots { }) .collect() } - - pub fn generate_repairs_for_missing_slots( - &self, - self_id: &Pubkey, - root: Slot, - ) -> Vec { - let my_slots = self.collect(self_id); - self.cluster_slots - .read() - .unwrap() - .keys() - .filter(|x| **x > root && !my_slots.contains(*x)) - .map(|x| ShredRepairType::HighestShred(*x, 0)) - .collect() - } } #[cfg(test)] @@ -380,40 +361,4 @@ mod tests { Some(&1) ); } - - #[test] - fn test_generate_repairs() { - let cs = ClusterSlots::default(); - let mut epoch_slot = EpochSlots::default(); - epoch_slot.fill(&[1], 0); - cs.update_internal(0, vec![epoch_slot]); - let self_id = solana_sdk::pubkey::new_rand(); - assert_eq!( - cs.generate_repairs_for_missing_slots(&self_id, 0), - vec![ShredRepairType::HighestShred(1, 0)] - ) - } - - #[test] - fn test_collect_my_slots() { - let cs = ClusterSlots::default(); - let mut epoch_slot = EpochSlots::default(); - epoch_slot.fill(&[1], 0); - let self_id = epoch_slot.from; - cs.update_internal(0, vec![epoch_slot]); - let slots: Vec = cs.collect(&self_id).into_iter().collect(); - assert_eq!(slots, vec![1]); - } - - #[test] - fn test_generate_repairs_existing() { - let cs = ClusterSlots::default(); - let mut epoch_slot = EpochSlots::default(); - epoch_slot.fill(&[1], 0); - let self_id = epoch_slot.from; - cs.update_internal(0, vec![epoch_slot]); - assert!(cs - .generate_repairs_for_missing_slots(&self_id, 0) - .is_empty()); - } }