@@ -12,16 +12,14 @@ use {
1212 tracer_packet_stats:: TracerPacketStats ,
1313 unprocessed_packet_batches:: { self , * } ,
1414 } ,
15+ core:: iter:: repeat,
1516 crossbeam_channel:: {
1617 Receiver as CrossbeamReceiver , RecvTimeoutError , Sender as CrossbeamSender ,
1718 } ,
1819 histogram:: Histogram ,
1920 itertools:: Itertools ,
2021 min_max_heap:: MinMaxHeap ,
21- solana_client:: {
22- connection_cache:: ConnectionCache , tpu_connection:: TpuConnection ,
23- udp_client:: UdpTpuConnection ,
24- } ,
22+ solana_client:: { connection_cache:: ConnectionCache , tpu_connection:: TpuConnection } ,
2523 solana_entry:: entry:: hash_transactions,
2624 solana_gossip:: { cluster_info:: ClusterInfo , contact_info:: ContactInfo } ,
2725 solana_ledger:: blockstore_processor:: TransactionStatusSender ,
@@ -59,14 +57,15 @@ use {
5957 } ,
6058 transport:: TransportError ,
6159 } ,
60+ solana_streamer:: sendmmsg:: batch_send,
6261 solana_transaction_status:: token_balances:: {
6362 collect_token_balances, TransactionTokenBalancesSet ,
6463 } ,
6564 std:: {
6665 cmp,
6766 collections:: HashMap ,
6867 env,
69- net:: SocketAddr ,
68+ net:: { SocketAddr , UdpSocket } ,
7069 rc:: Rc ,
7170 sync:: {
7271 atomic:: { AtomicU64 , AtomicUsize , Ordering } ,
@@ -539,6 +538,7 @@ impl BankingStage {
539538 forward_option : & ForwardOption ,
540539 cluster_info : & ClusterInfo ,
541540 poh_recorder : & Arc < Mutex < PohRecorder > > ,
541+ socket : & UdpSocket ,
542542 filter_forwarding_results : & FilterForwardingResults ,
543543 data_budget : & DataBudget ,
544544 banking_stage_stats : & BankingStageStats ,
@@ -600,21 +600,22 @@ impl BankingStage {
600600
601601 let mut measure = Measure :: start ( "banking_stage-forward-us" ) ;
602602
603- let conn = if let ForwardOption :: ForwardTpuVote = forward_option {
604- // The vote must be forwarded using only UDP. Let's get the UDP connection.
603+ let res = if let ForwardOption :: ForwardTpuVote = forward_option {
604+ // The vote must be forwarded using only UDP.
605605 banking_stage_stats
606606 . forwarded_vote_count
607607 . fetch_add ( packet_vec_len, Ordering :: Relaxed ) ;
608- Arc :: new ( UdpTpuConnection :: new_from_addr ( addr) . into ( ) )
608+ let pkts: Vec < _ > = packet_vec. into_iter ( ) . zip ( repeat ( addr) ) . collect ( ) ;
609+ batch_send ( socket, & pkts) . map_err ( |err| err. into ( ) )
609610 } else {
610611 // All other transactions can be forwarded using QUIC, get_connection() will use
611612 // system wide setting to pick the correct connection object.
612613 banking_stage_stats
613614 . forwarded_transaction_count
614615 . fetch_add ( packet_vec_len, Ordering :: Relaxed ) ;
615- connection_cache. get_connection ( & addr)
616+ let conn = connection_cache. get_connection ( & addr) ;
617+ conn. send_wire_transaction_batch_async ( packet_vec)
616618 } ;
617- let res = conn. send_wire_transaction_batch_async ( packet_vec) ;
618619
619620 measure. stop ( ) ;
620621 inc_new_counter_info ! (
@@ -903,6 +904,7 @@ impl BankingStage {
903904 #[ allow( clippy:: too_many_arguments) ]
904905 fn process_buffered_packets (
905906 my_pubkey : & Pubkey ,
907+ socket : & UdpSocket ,
906908 poh_recorder : & Arc < Mutex < PohRecorder > > ,
907909 cluster_info : & ClusterInfo ,
908910 buffered_packet_batches : & mut UnprocessedPacketBatches ,
@@ -988,6 +990,7 @@ impl BankingStage {
988990 cluster_info,
989991 buffered_packet_batches,
990992 poh_recorder,
993+ socket,
991994 false ,
992995 data_budget,
993996 slot_metrics_tracker,
@@ -1009,6 +1012,7 @@ impl BankingStage {
10091012 cluster_info,
10101013 buffered_packet_batches,
10111014 poh_recorder,
1015+ socket,
10121016 true ,
10131017 data_budget,
10141018 slot_metrics_tracker,
@@ -1032,6 +1036,7 @@ impl BankingStage {
10321036 cluster_info : & ClusterInfo ,
10331037 buffered_packet_batches : & mut UnprocessedPacketBatches ,
10341038 poh_recorder : & Arc < Mutex < PohRecorder > > ,
1039+ socket : & UdpSocket ,
10351040 hold : bool ,
10361041 data_budget : & DataBudget ,
10371042 slot_metrics_tracker : & mut LeaderSlotMetricsTracker ,
@@ -1055,6 +1060,7 @@ impl BankingStage {
10551060 forward_option,
10561061 cluster_info,
10571062 poh_recorder,
1063+ socket,
10581064 & filter_forwarding_result,
10591065 data_budget,
10601066 banking_stage_stats,
@@ -1105,6 +1111,7 @@ impl BankingStage {
11051111 connection_cache : Arc < ConnectionCache > ,
11061112 ) {
11071113 let recorder = poh_recorder. lock ( ) . unwrap ( ) . recorder ( ) ;
1114+ let socket = UdpSocket :: bind ( "0.0.0.0:0" ) . unwrap ( ) ;
11081115 let mut buffered_packet_batches = UnprocessedPacketBatches :: with_capacity ( batch_limit) ;
11091116 let mut banking_stage_stats = BankingStageStats :: new ( id) ;
11101117 let mut tracer_packet_stats = TracerPacketStats :: new ( id) ;
@@ -1121,6 +1128,7 @@ impl BankingStage {
11211128 let ( _, process_buffered_packets_time) = measure ! (
11221129 Self :: process_buffered_packets(
11231130 & my_pubkey,
1131+ & socket,
11241132 poh_recorder,
11251133 cluster_info,
11261134 & mut buffered_packet_batches,
@@ -4160,6 +4168,7 @@ mod tests {
41604168 ] ;
41614169
41624170 let connection_cache = ConnectionCache :: default ( ) ;
4171+ let socket = UdpSocket :: bind ( "0.0.0.0:0" ) . unwrap ( ) ;
41634172 for ( name, data_budget, expected_num_forwarded) in test_cases {
41644173 let mut unprocessed_packet_batches: UnprocessedPacketBatches =
41654174 UnprocessedPacketBatches :: from_iter (
@@ -4172,6 +4181,7 @@ mod tests {
41724181 & cluster_info,
41734182 & mut unprocessed_packet_batches,
41744183 & poh_recorder,
4184+ & socket,
41754185 true ,
41764186 & data_budget,
41774187 & mut LeaderSlotMetricsTracker :: new ( 0 ) ,
@@ -4277,13 +4287,15 @@ mod tests {
42774287 ) ,
42784288 ] ;
42794289
4290+ let socket = UdpSocket :: bind ( "0.0.0.0:0" ) . unwrap ( ) ;
42804291 for ( name, forward_option, hold, expected_ids, expected_num_unprocessed) in test_cases {
42814292 let stats = BankingStageStats :: default ( ) ;
42824293 BankingStage :: handle_forwarding (
42834294 & forward_option,
42844295 & cluster_info,
42854296 & mut unprocessed_packet_batches,
42864297 & poh_recorder,
4298+ & socket,
42874299 hold,
42884300 & DataBudget :: default ( ) ,
42894301 & mut LeaderSlotMetricsTracker :: new ( 0 ) ,
0 commit comments