For all code paths (gossip push, pull, purge, etc) that remove or override a crds value, it is necessary to record hash of values purged from crds table, in order to exclude them from subsequent pull-requests; otherwise the next pull request will likely return outdated values, wasting bandwidth: https://github.com/solana-labs/solana/blob/ed51cde37/core/src/crds_gossip_pull.rs#L486-L491 Currently this is done all over the place in multiple modules, and this has caused bugs in the past where purged values were not recorded. This commit encapsulated this bookkeeping into crds module, so that any code path which removes or overrides a crds value, also records the hash of purged value in-place.
49 lines
1.3 KiB
Rust
49 lines
1.3 KiB
Rust
#![feature(test)]
|
|
|
|
extern crate test;
|
|
|
|
use rand::{thread_rng, Rng};
|
|
use rayon::ThreadPoolBuilder;
|
|
use solana_core::cluster_info::MAX_BLOOM_SIZE;
|
|
use solana_core::crds::Crds;
|
|
use solana_core::crds_gossip_pull::{CrdsFilter, CrdsGossipPull};
|
|
use solana_core::crds_value::CrdsValue;
|
|
use solana_sdk::hash;
|
|
use test::Bencher;
|
|
|
|
#[bench]
|
|
fn bench_hash_as_u64(bencher: &mut Bencher) {
|
|
let mut rng = thread_rng();
|
|
let hashes: Vec<_> = std::iter::repeat_with(|| hash::new_rand(&mut rng))
|
|
.take(1000)
|
|
.collect();
|
|
bencher.iter(|| {
|
|
hashes
|
|
.iter()
|
|
.map(CrdsFilter::hash_as_u64)
|
|
.collect::<Vec<_>>()
|
|
});
|
|
}
|
|
|
|
#[bench]
|
|
fn bench_build_crds_filters(bencher: &mut Bencher) {
|
|
let thread_pool = ThreadPoolBuilder::new().build().unwrap();
|
|
let mut rng = thread_rng();
|
|
let crds_gossip_pull = CrdsGossipPull::default();
|
|
let mut crds = Crds::default();
|
|
let mut num_inserts = 0;
|
|
for _ in 0..90_000 {
|
|
if crds
|
|
.insert(CrdsValue::new_rand(&mut rng, None), rng.gen())
|
|
.is_ok()
|
|
{
|
|
num_inserts += 1;
|
|
}
|
|
}
|
|
assert_eq!(num_inserts, 90_000);
|
|
bencher.iter(|| {
|
|
let filters = crds_gossip_pull.build_crds_filters(&thread_pool, &crds, MAX_BLOOM_SIZE);
|
|
assert_eq!(filters.len(), 128);
|
|
});
|
|
}
|