An earlier version of the code was funneling through stakes along with shreds to broadcast: https://github.com/solana-labs/solana/blob/b67ffab37/core/src/broadcast_stage.rs#L127 This was changed to only slots as stakes computation was pushed further down the pipeline in: https://github.com/solana-labs/solana/pull/18971 However shreds themselves embody which slot they belong to. So pairing them with slot is redundant and adds rooms for bugs should they become inconsistent.
85 lines
2.5 KiB
Rust
85 lines
2.5 KiB
Rust
#![feature(test)]
|
|
|
|
extern crate test;
|
|
|
|
use {
|
|
rand::{thread_rng, Rng},
|
|
solana_core::{
|
|
broadcast_stage::{
|
|
broadcast_metrics::TransmitShredsStats, broadcast_shreds, BroadcastStage,
|
|
},
|
|
cluster_nodes::ClusterNodesCache,
|
|
},
|
|
solana_gossip::{
|
|
cluster_info::{ClusterInfo, Node},
|
|
contact_info::ContactInfo,
|
|
},
|
|
solana_ledger::{
|
|
genesis_utils::{create_genesis_config, GenesisConfigInfo},
|
|
shred::Shred,
|
|
},
|
|
solana_runtime::{bank::Bank, bank_forks::BankForks},
|
|
solana_sdk::{
|
|
pubkey,
|
|
signature::Keypair,
|
|
timing::{timestamp, AtomicInterval},
|
|
},
|
|
solana_streamer::socket::SocketAddrSpace,
|
|
std::{
|
|
collections::HashMap,
|
|
net::UdpSocket,
|
|
sync::{Arc, RwLock},
|
|
time::Duration,
|
|
},
|
|
test::Bencher,
|
|
};
|
|
|
|
#[bench]
|
|
fn broadcast_shreds_bench(bencher: &mut Bencher) {
|
|
solana_logger::setup();
|
|
let leader_pubkey = pubkey::new_rand();
|
|
let leader_info = Node::new_localhost_with_pubkey(&leader_pubkey);
|
|
let cluster_info = ClusterInfo::new(
|
|
leader_info.info,
|
|
Arc::new(Keypair::new()),
|
|
SocketAddrSpace::Unspecified,
|
|
);
|
|
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
|
|
|
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000);
|
|
let bank = Bank::new_for_benches(&genesis_config);
|
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
|
|
|
const NUM_SHREDS: usize = 32;
|
|
let shreds = vec![Shred::new_empty_data_shred(); NUM_SHREDS];
|
|
let mut stakes = HashMap::new();
|
|
const NUM_PEERS: usize = 200;
|
|
for _ in 0..NUM_PEERS {
|
|
let id = pubkey::new_rand();
|
|
let contact_info = ContactInfo::new_localhost(&id, timestamp());
|
|
cluster_info.insert_info(contact_info);
|
|
stakes.insert(id, thread_rng().gen_range(1, NUM_PEERS) as u64);
|
|
}
|
|
let cluster_info = Arc::new(cluster_info);
|
|
let cluster_nodes_cache = ClusterNodesCache::<BroadcastStage>::new(
|
|
8, // cap
|
|
Duration::from_secs(5), // ttl
|
|
);
|
|
let shreds = Arc::new(shreds);
|
|
let last_datapoint = Arc::new(AtomicInterval::default());
|
|
bencher.iter(move || {
|
|
let shreds = shreds.clone();
|
|
broadcast_shreds(
|
|
&socket,
|
|
&shreds,
|
|
&cluster_nodes_cache,
|
|
&last_datapoint,
|
|
&mut TransmitShredsStats::default(),
|
|
&cluster_info,
|
|
&bank_forks,
|
|
&SocketAddrSpace::Unspecified,
|
|
)
|
|
.unwrap();
|
|
});
|
|
}
|