diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index 7ebfe825e0..b9a585033b 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -146,7 +146,7 @@ impl PacketPreparer { let initialisation_backoff = Duration::from_secs(30); loop { let gateways = self.validator_cache.gateways_all().await; - let mixnodes = self.validator_cache.mixnodes_basic().await; + let mixnodes = self.validator_cache.mixnodes_all_basic().await; if gateways.len() < minimum_full_routes { self.topology_wait_backoff(initialisation_backoff).await; @@ -179,12 +179,21 @@ impl PacketPreparer { async fn all_mixnodes_and_gateways(&self) -> (Vec, Vec) { info!("Obtaining network topology..."); - let mixnodes = self.validator_cache.mixnodes_basic().await; + let mixnodes = self.validator_cache.mixnodes_all_basic().await; let gateways = self.validator_cache.gateways_all().await; (mixnodes, gateways) } + async fn filtered_mixnodes_and_gateways(&self) -> (Vec, Vec) { + info!("Obtaining network topology..."); + + let mixnodes = self.validator_cache.mixnodes_filtered_basic().await; + let gateways = self.validator_cache.gateways_filtered().await; + + (mixnodes, gateways) + } + pub(crate) fn try_parse_mix_bond(&self, mix: &MixNodeBond) -> Result { let identity = mix.mix_node.identity_key.clone(); mix.try_into().map_err(|_| identity) @@ -208,7 +217,7 @@ impl PacketPreparer { n: usize, blacklist: &mut HashSet, ) -> Option> { - let (mixnodes, gateways) = self.all_mixnodes_and_gateways().await; + let (mixnodes, gateways) = self.filtered_mixnodes_and_gateways().await; // separate mixes into layers for easier selection let mut layered_mixes = HashMap::new(); for mix in mixnodes { diff --git a/nym-api/src/nym_contract_cache/cache/mod.rs b/nym-api/src/nym_contract_cache/cache/mod.rs index f5ed467d37..cb366a38d3 100644 --- a/nym-api/src/nym_contract_cache/cache/mod.rs +++ b/nym-api/src/nym_contract_cache/cache/mod.rs @@ -182,19 +182,20 @@ impl NymContractCache { } } - pub async fn mixnodes_basic(&self) -> Vec { - match time::timeout(Duration::from_millis(100), self.inner.read()).await { - Ok(cache) => cache - .mixnodes - .clone() - .into_iter() - .map(|bond| bond.bond_information) - .collect(), - Err(err) => { - error!("{err}"); - Vec::new() - } - } + pub async fn mixnodes_filtered_basic(&self) -> Vec { + self.mixnodes_filtered() + .await + .into_iter() + .map(|bond| bond.bond_information) + .collect() + } + + pub async fn mixnodes_all_basic(&self) -> Vec { + self.mixnodes_all() + .await + .into_iter() + .map(|bond| bond.bond_information) + .collect() } pub async fn gateways_filtered(&self) -> Vec { diff --git a/nym-api/src/support/storage/manager.rs b/nym-api/src/support/storage/manager.rs index 4e3c23c1e9..298f0c04a2 100644 --- a/nym-api/src/support/storage/manager.rs +++ b/nym-api/src/support/storage/manager.rs @@ -119,7 +119,7 @@ impl StorageManager { r#" SELECT d.identity as "identity: String", - AVG(reliability) as "value: f32" + CASE WHEN count(*) > 3 THEN AVG(reliability) ELSE 100 END as "value: f32" FROM gateway_details d JOIN