diff --git a/gossip/src/cluster_info.rs b/gossip/src/cluster_info.rs index ee338a66f4..700a1d0213 100644 --- a/gossip/src/cluster_info.rs +++ b/gossip/src/cluster_info.rs @@ -659,7 +659,7 @@ impl ClusterInfo { self.my_contact_info.read().unwrap().shred_version } - pub fn lookup_epoch_slots(&self, ix: EpochSlotsIndex) -> EpochSlots { + fn lookup_epoch_slots(&self, ix: EpochSlotsIndex) -> EpochSlots { let self_pubkey = self.id(); let label = CrdsValueLabel::EpochSlots(ix, self_pubkey); let gossip = self.gossip.read().unwrap(); @@ -1141,28 +1141,14 @@ impl ClusterInfo { } pub fn get_node_version(&self, pubkey: &Pubkey) -> Option { - let version = self - .gossip - .read() - .unwrap() - .crds - .get(&CrdsValueLabel::Version(*pubkey)) - .map(|x| x.value.version()) - .flatten() - .map(|version| version.version.clone()); - - if version.is_none() { - self.gossip - .read() - .unwrap() - .crds - .get(&CrdsValueLabel::LegacyVersion(*pubkey)) - .map(|x| x.value.legacy_version()) - .flatten() - .map(|version| version.version.clone().into()) - } else { - version + let gossip = self.gossip.read().unwrap(); + let version = gossip.crds.get(&CrdsValueLabel::Version(*pubkey)); + if let Some(version) = version.and_then(|v| v.value.version()) { + return Some(version.version.clone()); } + let version = gossip.crds.get(&CrdsValueLabel::LegacyVersion(*pubkey))?; + let version = version.value.legacy_version()?; + Some(version.version.clone().into()) } /// all validators that have a valid rpc port regardless of `shred_version`. diff --git a/gossip/src/crds_gossip.rs b/gossip/src/crds_gossip.rs index 6edbfc8efb..3749407c5a 100644 --- a/gossip/src/crds_gossip.rs +++ b/gossip/src/crds_gossip.rs @@ -238,8 +238,7 @@ impl CrdsGossip { where I: IntoIterator, { - self.pull - .process_pull_requests(&mut self.crds, callers, now); + CrdsGossipPull::process_pull_requests(&mut self.crds, callers, now); } pub fn generate_pull_responses( @@ -248,8 +247,7 @@ impl CrdsGossip { output_size_limit: usize, // Limit number of crds values returned. now: u64, ) -> Vec> { - self.pull - .generate_pull_responses(&self.crds, filters, output_size_limit, now) + CrdsGossipPull::generate_pull_responses(&self.crds, filters, output_size_limit, now) } pub fn filter_pull_responses( @@ -313,9 +311,7 @@ impl CrdsGossip { //sanity check assert_eq!(timeouts[self_pubkey], std::u64::MAX); assert!(timeouts.contains_key(&Pubkey::default())); - rv = self - .pull - .purge_active(thread_pool, &mut self.crds, now, timeouts); + rv = CrdsGossipPull::purge_active(thread_pool, &mut self.crds, now, timeouts); } self.crds .trim_purged(now.saturating_sub(5 * self.pull.crds_timeout)); diff --git a/gossip/src/crds_gossip_pull.rs b/gossip/src/crds_gossip_pull.rs index d2d9266ab9..8b8f364b34 100644 --- a/gossip/src/crds_gossip_pull.rs +++ b/gossip/src/crds_gossip_pull.rs @@ -75,7 +75,8 @@ impl solana_sdk::sanitize::Sanitize for CrdsFilter { } impl CrdsFilter { - pub fn new_rand(num_items: usize, max_bytes: usize) -> Self { + #[cfg(test)] + pub(crate) fn new_rand(num_items: usize, max_bytes: usize) -> Self { let max_bits = (max_bytes * 8) as f64; let max_items = Self::max_items(max_bits, FALSE_RATE, KEYS); let mask_bits = Self::mask_bits(num_items as f64, max_items as f64); @@ -208,7 +209,7 @@ impl Default for CrdsGossipPull { impl CrdsGossipPull { /// generate a random request #[allow(clippy::too_many_arguments)] - pub fn new_pull_request( + pub(crate) fn new_pull_request( &self, thread_pool: &ThreadPool, crds: &Crds, @@ -315,12 +316,12 @@ impl CrdsGossipPull { /// This is used for weighted random selection during `new_pull_request` /// It's important to use the local nodes request creation time as the weight /// instead of the response received time otherwise failed nodes will increase their weight. - pub fn mark_pull_request_creation_time(&mut self, from: Pubkey, now: u64) { + pub(crate) fn mark_pull_request_creation_time(&mut self, from: Pubkey, now: u64) { self.pull_request_time.put(from, now); } /// process a pull request - pub fn process_pull_requests(&mut self, crds: &mut Crds, callers: I, now: u64) + pub(crate) fn process_pull_requests(crds: &mut Crds, callers: I, now: u64) where I: IntoIterator, { @@ -332,14 +333,13 @@ impl CrdsGossipPull { } /// Create gossip responses to pull requests - pub fn generate_pull_responses( - &self, + pub(crate) fn generate_pull_responses( crds: &Crds, requests: &[(CrdsValue, CrdsFilter)], output_size_limit: usize, // Limit number of crds values returned. now: u64, ) -> Vec> { - self.filter_crds_values(crds, requests, output_size_limit, now) + Self::filter_crds_values(crds, requests, output_size_limit, now) } // Checks if responses should be inserted and @@ -348,7 +348,7 @@ impl CrdsGossipPull { // .0 => responses that update the owner timestamp // .1 => responses that do not update the owner timestamp // .2 => hash value of outdated values which will fail to insert. - pub fn filter_pull_responses( + pub(crate) fn filter_pull_responses( &self, crds: &Crds, timeouts: &HashMap, @@ -394,7 +394,7 @@ impl CrdsGossipPull { } /// process a vec of pull responses - pub fn process_pull_responses( + pub(crate) fn process_pull_responses( &mut self, crds: &mut Crds, from: &Pubkey, @@ -426,7 +426,7 @@ impl CrdsGossipPull { .extend(failed_inserts.into_iter().zip(std::iter::repeat(now))); } - pub fn purge_failed_inserts(&mut self, now: u64) { + pub(crate) fn purge_failed_inserts(&mut self, now: u64) { if FAILED_INSERTS_RETENTION_MS < now { let cutoff = now - FAILED_INSERTS_RETENTION_MS; let outdated = self @@ -472,7 +472,6 @@ impl CrdsGossipPull { /// filter values that fail the bloom filter up to max_bytes fn filter_crds_values( - &self, crds: &Crds, filters: &[(CrdsValue, CrdsFilter)], mut output_size_limit: usize, // Limit number of crds values returned. @@ -553,8 +552,7 @@ impl CrdsGossipPull { } /// Purge values from the crds that are older then `active_timeout` - pub fn purge_active( - &mut self, + pub(crate) fn purge_active( thread_pool: &ThreadPool, crds: &mut Crds, now: u64, @@ -569,7 +567,7 @@ impl CrdsGossipPull { /// For legacy tests #[cfg(test)] - pub fn process_pull_response( + fn process_pull_response( &mut self, crds: &mut Crds, from: &Pubkey, @@ -1123,10 +1121,9 @@ pub(crate) mod tests { ); let mut dest_crds = Crds::default(); - let dest = CrdsGossipPull::default(); let (_, filters) = req.unwrap(); let mut filters: Vec<_> = filters.into_iter().map(|f| (caller.clone(), f)).collect(); - let rsp = dest.generate_pull_responses( + let rsp = CrdsGossipPull::generate_pull_responses( &dest_crds, &filters, /*output_size_limit=*/ usize::MAX, @@ -1144,7 +1141,7 @@ pub(crate) mod tests { .unwrap(); //should skip new value since caller is to old - let rsp = dest.generate_pull_responses( + let rsp = CrdsGossipPull::generate_pull_responses( &dest_crds, &filters, /*output_size_limit=*/ usize::MAX, @@ -1162,7 +1159,7 @@ pub(crate) mod tests { .map(|(_, filter)| (caller.clone(), filter.clone())) .collect::>() }); - let rsp = dest.generate_pull_responses( + let rsp = CrdsGossipPull::generate_pull_responses( &dest_crds, &filters, /*output_size_limit=*/ usize::MAX, @@ -1211,16 +1208,15 @@ pub(crate) mod tests { ); let mut dest_crds = Crds::default(); - let mut dest = CrdsGossipPull::default(); let (_, filters) = req.unwrap(); let filters: Vec<_> = filters.into_iter().map(|f| (caller.clone(), f)).collect(); - let rsp = dest.generate_pull_responses( + let rsp = CrdsGossipPull::generate_pull_responses( &dest_crds, &filters, /*output_size_limit=*/ usize::MAX, 0, ); - dest.process_pull_requests( + CrdsGossipPull::process_pull_requests( &mut dest_crds, filters.into_iter().map(|(caller, _)| caller), 1, @@ -1251,7 +1247,6 @@ pub(crate) mod tests { let new = CrdsValue::new_unsigned(CrdsData::ContactInfo(new)); node_crds.insert(new, 0).unwrap(); - let mut dest = CrdsGossipPull::default(); let mut dest_crds = Crds::default(); let new_id = solana_sdk::pubkey::new_rand(); let new = ContactInfo::new_localhost(&new_id, 1); @@ -1286,13 +1281,13 @@ pub(crate) mod tests { ); let (_, filters) = req.unwrap(); let filters: Vec<_> = filters.into_iter().map(|f| (caller.clone(), f)).collect(); - let rsp = dest.generate_pull_responses( + let rsp = CrdsGossipPull::generate_pull_responses( &dest_crds, &filters, /*output_size_limit=*/ usize::MAX, 0, ); - dest.process_pull_requests( + CrdsGossipPull::process_pull_requests( &mut dest_crds, filters.into_iter().map(|(caller, _)| caller), 0, @@ -1335,7 +1330,7 @@ pub(crate) mod tests { ))); let node_label = entry.label(); let node_pubkey = node_label.pubkey(); - let mut node = CrdsGossipPull::default(); + let node = CrdsGossipPull::default(); node_crds.insert(entry, 0).unwrap(); let old = CrdsValue::new_unsigned(CrdsData::ContactInfo(ContactInfo::new_localhost( &solana_sdk::pubkey::new_rand(), @@ -1351,7 +1346,7 @@ pub(crate) mod tests { ); // purge let timeouts = node.make_timeouts(node_pubkey, &HashMap::new(), Duration::default()); - node.purge_active(&thread_pool, &mut node_crds, node.crds_timeout, &timeouts); + CrdsGossipPull::purge_active(&thread_pool, &mut node_crds, node.crds_timeout, &timeouts); //verify self is still valid after purge assert_eq!( diff --git a/gossip/src/crds_gossip_push.rs b/gossip/src/crds_gossip_push.rs index 24179f7ab9..2c744411fa 100644 --- a/gossip/src/crds_gossip_push.rs +++ b/gossip/src/crds_gossip_push.rs @@ -98,7 +98,7 @@ impl CrdsGossipPush { ((CRDS_GOSSIP_PRUNE_STAKE_THRESHOLD_PCT * min_path_stake as f64).round() as u64).max(1) } - pub fn prune_received_cache( + pub(crate) fn prune_received_cache( &mut self, self_pubkey: &Pubkey, origin: &Pubkey, @@ -254,7 +254,7 @@ impl CrdsGossipPush { /// refresh the push active set /// * ratio - active_set.len()/ratio is the number of actives to rotate - pub fn refresh_push_active_set( + pub(crate) fn refresh_push_active_set( &mut self, crds: &Crds, stakes: &HashMap, @@ -359,7 +359,7 @@ impl CrdsGossipPush { } /// purge received push message cache - pub fn purge_old_received_cache(&mut self, min_time: u64) { + pub(crate) fn purge_old_received_cache(&mut self, min_time: u64) { self.received_cache.retain(|_, v| { v.retain(|_, (_, t)| *t > min_time); !v.is_empty()