use a hash set to avoid duplicates
This commit is contained in:
parent
7fa74f8611
commit
336242ccc8
@ -89,7 +89,7 @@ pub struct RankedRpcs {
|
|||||||
pub num_synced: usize,
|
pub num_synced: usize,
|
||||||
pub backups_needed: bool,
|
pub backups_needed: bool,
|
||||||
|
|
||||||
pub(crate) inner: Vec<Arc<Web3Rpc>>,
|
pub(crate) inner: HashSet<Arc<Web3Rpc>>,
|
||||||
|
|
||||||
sort_mode: SortMethod,
|
sort_mode: SortMethod,
|
||||||
}
|
}
|
||||||
@ -110,6 +110,8 @@ impl RankedRpcs {
|
|||||||
// TODO: why is head_block not set here?! it should always be set!
|
// TODO: why is head_block not set here?! it should always be set!
|
||||||
let head_block = head_block.unwrap_or_default();
|
let head_block = head_block.unwrap_or_default();
|
||||||
|
|
||||||
|
let rpcs: HashSet<_> = rpcs.into_iter().collect();
|
||||||
|
|
||||||
let backups_needed = rpcs.iter().any(|x| x.backup);
|
let backups_needed = rpcs.iter().any(|x| x.backup);
|
||||||
|
|
||||||
let num_synced = rpcs.len();
|
let num_synced = rpcs.len();
|
||||||
@ -161,14 +163,15 @@ impl RankedRpcs {
|
|||||||
|
|
||||||
// return the first result that exceededs confgured minimums (if any)
|
// return the first result that exceededs confgured minimums (if any)
|
||||||
if let Some((best_block, _, best_rpcs)) = votes.into_iter().next() {
|
if let Some((best_block, _, best_rpcs)) = votes.into_iter().next() {
|
||||||
let mut ranked_rpcs: Vec<_> = best_rpcs.into_iter().map(Arc::clone).collect();
|
let mut best_rpcs: HashSet<_> = best_rpcs.into_iter().map(Arc::clone).collect();
|
||||||
|
|
||||||
let backups_needed = ranked_rpcs.iter().any(|x| x.backup);
|
let backups_needed = best_rpcs.iter().any(|x| x.backup);
|
||||||
let num_synced = ranked_rpcs.len();
|
let num_synced = best_rpcs.len();
|
||||||
|
|
||||||
// add all the rpcs that are behind the ranked rpcs. these might be needed for serving archive requests
|
// add all the rpcs that are behind the ranked rpcs. these might be needed for serving archive requests
|
||||||
for (x, x_head) in heads.iter() {
|
for (x, x_head) in heads.iter() {
|
||||||
if ranked_rpcs.contains(x) {
|
// TODO: do we care about this "contains" when a set won't add more than once anyways?
|
||||||
|
if best_rpcs.contains(x) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,11 +188,11 @@ impl RankedRpcs {
|
|||||||
|
|
||||||
// TODO: max age here too?
|
// TODO: max age here too?
|
||||||
|
|
||||||
ranked_rpcs.push(x.clone());
|
best_rpcs.insert(x.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
// consensus found!
|
// consensus found!
|
||||||
trace!(?ranked_rpcs);
|
trace!(?best_rpcs);
|
||||||
|
|
||||||
let sort_mode = SortMethod::Sort;
|
let sort_mode = SortMethod::Sort;
|
||||||
|
|
||||||
@ -197,7 +200,7 @@ impl RankedRpcs {
|
|||||||
backups_needed,
|
backups_needed,
|
||||||
head_block: best_block,
|
head_block: best_block,
|
||||||
sort_mode,
|
sort_mode,
|
||||||
inner: ranked_rpcs,
|
inner: best_rpcs,
|
||||||
num_synced,
|
num_synced,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -290,8 +293,8 @@ impl RankedRpcs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn all(&self) -> &[Arc<Web3Rpc>] {
|
pub fn all(&self) -> hashbrown::hash_set::Iter<Arc<Web3Rpc>> {
|
||||||
&self.inner
|
self.inner.iter()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
|
Loading…
Reference in New Issue
Block a user