cluster_nodes.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. use {
  2. bencher::{benchmark_group, benchmark_main, Bencher},
  3. rand::{seq::SliceRandom, Rng},
  4. solana_clock::Slot,
  5. solana_cluster_type::ClusterType,
  6. solana_gossip::contact_info::ContactInfo,
  7. solana_hash::Hash,
  8. solana_keypair::Keypair,
  9. solana_ledger::shred::{ProcessShredsStats, ReedSolomonCache, Shredder},
  10. solana_net_utils::SocketAddrSpace,
  11. solana_pubkey::Pubkey,
  12. solana_turbine::{
  13. cluster_nodes::{make_test_cluster, new_cluster_nodes, ClusterNodes},
  14. retransmit_stage::RetransmitStage,
  15. },
  16. };
  17. fn make_cluster_nodes<R: Rng>(
  18. rng: &mut R,
  19. unstaked_ratio: Option<(u32, u32)>,
  20. use_cha_cha_8: bool,
  21. ) -> (Vec<ContactInfo>, ClusterNodes<RetransmitStage>) {
  22. let (nodes, stakes, cluster_info) = make_test_cluster(rng, 5_000, unstaked_ratio);
  23. let cluster_nodes = new_cluster_nodes::<RetransmitStage>(
  24. &cluster_info,
  25. ClusterType::Development,
  26. &stakes,
  27. use_cha_cha_8,
  28. );
  29. (nodes, cluster_nodes)
  30. }
  31. #[allow(clippy::arithmetic_side_effects)]
  32. fn get_retransmit_peers_deterministic(
  33. cluster_nodes: &ClusterNodes<RetransmitStage>,
  34. slot: Slot,
  35. slot_leader: &Pubkey,
  36. ) {
  37. let keypair = Keypair::new();
  38. let reed_solomon_cache = ReedSolomonCache::default();
  39. let mut stats = ProcessShredsStats::default();
  40. let parent_slot = if slot > 0 { slot - 1 } else { 0 };
  41. let shredder = Shredder::new(slot, parent_slot, 0, 0).unwrap();
  42. let shreds = shredder.make_merkle_shreds_from_entries(
  43. &keypair,
  44. &[], // entries
  45. true, // is_last_in_slot
  46. Hash::default(), // chained_merkle_root
  47. 0, // next_shred_index
  48. 0, // next_code_index
  49. &reed_solomon_cache,
  50. &mut stats,
  51. );
  52. for shred in shreds {
  53. let _retransmit_peers = cluster_nodes.get_retransmit_addrs(
  54. slot_leader,
  55. &shred.id(),
  56. 200, // fanout
  57. &SocketAddrSpace::Unspecified,
  58. );
  59. }
  60. }
  61. fn get_retransmit_peers_deterministic_wrapper(
  62. b: &mut Bencher,
  63. unstaked_ratio: Option<(u32, u32)>,
  64. use_cha_cha_8: bool,
  65. ) {
  66. let mut rng = rand::thread_rng();
  67. let (nodes, cluster_nodes) = make_cluster_nodes(&mut rng, unstaked_ratio, use_cha_cha_8);
  68. let slot_leader = *nodes[1..].choose(&mut rng).unwrap().pubkey();
  69. let slot = rand::random::<u64>();
  70. b.iter(|| get_retransmit_peers_deterministic(&cluster_nodes, slot, &slot_leader));
  71. }
  72. fn bench_get_retransmit_peers_deterministic_unstaked_ratio_1_2_20(b: &mut Bencher) {
  73. get_retransmit_peers_deterministic_wrapper(b, Some((1, 2)), false);
  74. }
  75. fn bench_get_retransmit_peers_deterministic_unstaked_ratio_1_32_20(b: &mut Bencher) {
  76. get_retransmit_peers_deterministic_wrapper(b, Some((1, 32)), false);
  77. }
  78. fn bench_get_retransmit_peers_deterministic_unstaked_ratio_1_2_8(b: &mut Bencher) {
  79. get_retransmit_peers_deterministic_wrapper(b, Some((1, 2)), true);
  80. }
  81. fn bench_get_retransmit_peers_deterministic_unstaked_ratio_1_32_8(b: &mut Bencher) {
  82. get_retransmit_peers_deterministic_wrapper(b, Some((1, 32)), true);
  83. }
  84. benchmark_group!(
  85. benches,
  86. bench_get_retransmit_peers_deterministic_unstaked_ratio_1_2_20,
  87. bench_get_retransmit_peers_deterministic_unstaked_ratio_1_32_20,
  88. bench_get_retransmit_peers_deterministic_unstaked_ratio_1_2_8,
  89. bench_get_retransmit_peers_deterministic_unstaked_ratio_1_32_8
  90. );
  91. benchmark_main!(benches);