15
15
} ,
16
16
result:: { Error , Result } ,
17
17
} ,
18
+ assert_matches:: debug_assert_matches,
18
19
bytes:: Bytes ,
19
20
crossbeam_channel:: { unbounded, Receiver , RecvTimeoutError , Sender } ,
20
21
rayon:: { prelude:: * , ThreadPool } ,
27
28
} ,
28
29
solana_measure:: measure:: Measure ,
29
30
solana_metrics:: inc_new_counter_error,
30
- solana_perf:: packet:: { Packet , PacketBatch } ,
31
31
solana_rayon_threadlimit:: get_thread_count,
32
32
solana_runtime:: bank_forks:: BankForks ,
33
33
solana_sdk:: {
36
36
} ,
37
37
solana_turbine:: cluster_nodes,
38
38
std:: {
39
- cmp:: Reverse ,
40
- collections:: HashMap ,
41
39
net:: { SocketAddr , UdpSocket } ,
42
40
sync:: {
43
41
atomic:: { AtomicBool , AtomicUsize , Ordering } ,
@@ -55,7 +53,6 @@ pub(crate) type DuplicateSlotReceiver = Receiver<Slot>;
55
53
#[ derive( Default ) ]
56
54
struct WindowServiceMetrics {
57
55
run_insert_count : u64 ,
58
- num_packets : usize ,
59
56
num_repairs : AtomicUsize ,
60
57
num_shreds_received : usize ,
61
58
handle_packets_elapsed_us : u64 ,
@@ -65,12 +62,10 @@ struct WindowServiceMetrics {
65
62
num_errors_cross_beam_recv_timeout : u64 ,
66
63
num_errors_other : u64 ,
67
64
num_errors_try_crossbeam_send : u64 ,
68
- addrs : HashMap < /*source:*/ SocketAddr , /*num packets:*/ usize > ,
69
65
}
70
66
71
67
impl WindowServiceMetrics {
72
68
fn report_metrics ( & self , metric_name : & ' static str ) {
73
- const MAX_NUM_ADDRS : usize = 5 ;
74
69
datapoint_info ! (
75
70
metric_name,
76
71
(
@@ -79,7 +74,6 @@ impl WindowServiceMetrics {
79
74
i64
80
75
) ,
81
76
( "run_insert_count" , self . run_insert_count as i64 , i64 ) ,
82
- ( "num_packets" , self . num_packets, i64 ) ,
83
77
( "num_repairs" , self . num_repairs. load( Ordering :: Relaxed ) , i64 ) ,
84
78
( "num_shreds_received" , self . num_shreds_received, i64 ) ,
85
79
(
@@ -101,19 +95,6 @@ impl WindowServiceMetrics {
101
95
i64
102
96
) ,
103
97
) ;
104
-
105
- let mut addrs: Vec < _ > = self . addrs . iter ( ) . collect ( ) ;
106
- let reverse_count = |( _addr, count) : & _ | Reverse ( * count) ;
107
- if addrs. len ( ) > MAX_NUM_ADDRS {
108
- addrs. select_nth_unstable_by_key ( MAX_NUM_ADDRS , reverse_count) ;
109
- addrs. truncate ( MAX_NUM_ADDRS ) ;
110
- }
111
- addrs. sort_unstable_by_key ( reverse_count) ;
112
- info ! (
113
- "num addresses: {}, top packets by source: {:?}" ,
114
- self . addrs. len( ) ,
115
- addrs
116
- ) ;
117
98
}
118
99
119
100
fn record_error ( & mut self , err : & Error ) {
@@ -208,7 +189,7 @@ fn run_check_duplicate(
208
189
#[ allow( clippy:: too_many_arguments) ]
209
190
fn run_insert < F > (
210
191
thread_pool : & ThreadPool ,
211
- verified_receiver : & Receiver < Vec < PacketBatch > > ,
192
+ verified_receiver : & Receiver < Vec < ( shred :: Payload , /*is_repaired:*/ bool ) > > ,
212
193
blockstore : & Blockstore ,
213
194
leader_schedule_cache : & LeaderScheduleCache ,
214
195
handle_duplicate : F ,
@@ -224,41 +205,34 @@ where
224
205
{
225
206
const RECV_TIMEOUT : Duration = Duration :: from_millis ( 200 ) ;
226
207
let mut shred_receiver_elapsed = Measure :: start ( "shred_receiver_elapsed" ) ;
227
- let mut packets = verified_receiver. recv_timeout ( RECV_TIMEOUT ) ?;
228
- packets . extend ( verified_receiver. try_iter ( ) . flatten ( ) ) ;
208
+ let mut shreds = verified_receiver. recv_timeout ( RECV_TIMEOUT ) ?;
209
+ shreds . extend ( verified_receiver. try_iter ( ) . flatten ( ) ) ;
229
210
shred_receiver_elapsed. stop ( ) ;
230
211
ws_metrics. shred_receiver_elapsed_us += shred_receiver_elapsed. as_us ( ) ;
231
212
ws_metrics. run_insert_count += 1 ;
232
- let handle_packet = |packet : & Packet | {
233
- if packet . meta ( ) . discard ( ) {
213
+ let handle_shred = |( shred , repair ) : ( shred :: Payload , bool ) | {
214
+ if accept_repairs_only && !repair {
234
215
return None ;
235
216
}
236
- let repair = packet. meta ( ) . repair ( ) ;
237
217
if repair {
238
218
ws_metrics. num_repairs . fetch_add ( 1 , Ordering :: Relaxed ) ;
219
+ debug_assert_matches ! ( shred, shred:: Payload :: Unique ( _) ) ;
220
+ } else {
221
+ debug_assert_matches ! ( shred, shred:: Payload :: Shared ( _) ) ;
239
222
}
240
- if accept_repairs_only && !repair {
241
- return None ;
242
- }
243
- let shred = shred:: layout:: get_shred ( packet) ?;
244
- let shred = Shred :: new_from_serialized_shred ( shred. to_vec ( ) ) . ok ( ) ?;
223
+ let shred = Shred :: new_from_serialized_shred ( shred) . ok ( ) ?;
245
224
Some ( ( shred, repair) )
246
225
} ;
247
226
let now = Instant :: now ( ) ;
248
227
let shreds: Vec < _ > = thread_pool. install ( || {
249
- packets
250
- . par_iter ( )
228
+ shreds
229
+ . into_par_iter ( )
251
230
. with_min_len ( 32 )
252
- . flat_map_iter ( |packets| packets . iter ( ) . filter_map ( handle_packet ) )
231
+ . filter_map ( handle_shred )
253
232
. collect ( )
254
233
} ) ;
255
234
ws_metrics. handle_packets_elapsed_us += now. elapsed ( ) . as_micros ( ) as u64 ;
256
- ws_metrics. num_packets += packets. iter ( ) . map ( PacketBatch :: len) . sum :: < usize > ( ) ;
257
235
ws_metrics. num_shreds_received += shreds. len ( ) ;
258
- for packet in packets. iter ( ) . flat_map ( PacketBatch :: iter) {
259
- let addr = packet. meta ( ) . socket_addr ( ) ;
260
- * ws_metrics. addrs . entry ( addr) . or_default ( ) += 1 ;
261
- }
262
236
let completed_data_sets = blockstore. insert_shreds_handle_duplicate (
263
237
shreds,
264
238
Some ( leader_schedule_cache) ,
@@ -286,7 +260,7 @@ impl WindowService {
286
260
#[ allow( clippy:: too_many_arguments) ]
287
261
pub ( crate ) fn new (
288
262
blockstore : Arc < Blockstore > ,
289
- verified_receiver : Receiver < Vec < PacketBatch > > ,
263
+ verified_receiver : Receiver < Vec < ( shred :: Payload , /*is_repaired:*/ bool ) > > ,
290
264
retransmit_sender : Sender < Vec < shred:: Payload > > ,
291
265
repair_socket : Arc < UdpSocket > ,
292
266
ancestor_hashes_socket : Arc < UdpSocket > ,
@@ -391,7 +365,7 @@ impl WindowService {
391
365
exit : Arc < AtomicBool > ,
392
366
blockstore : Arc < Blockstore > ,
393
367
leader_schedule_cache : Arc < LeaderScheduleCache > ,
394
- verified_receiver : Receiver < Vec < PacketBatch > > ,
368
+ verified_receiver : Receiver < Vec < ( shred :: Payload , /*is_repaired:*/ bool ) > > ,
395
369
check_duplicate_sender : Sender < PossibleDuplicateShred > ,
396
370
completed_data_sets_sender : Option < CompletedDataSetsSender > ,
397
371
retransmit_sender : Sender < Vec < shred:: Payload > > ,
0 commit comments