5
5
crossbeam_channel:: { unbounded, Sender } ,
6
6
solana_gossip:: cluster_info:: ClusterInfo ,
7
7
solana_ledger:: shred:: { should_discard_shred, ShredFetchStats } ,
8
- solana_perf:: {
9
- packet:: { Packet , PacketBatch , PacketBatchRecycler , PacketFlags } ,
10
- sigverify:: Deduper ,
11
- } ,
8
+ solana_perf:: packet:: { PacketBatch , PacketBatchRecycler , PacketFlags } ,
12
9
solana_runtime:: { bank:: Bank , bank_forks:: BankForks } ,
13
10
solana_sdk:: {
14
11
clock:: { Slot , DEFAULT_MS_PER_SLOT } ,
26
23
} ,
27
24
} ;
28
25
29
- const DEDUPER_FALSE_POSITIVE_RATE : f64 = 0.001 ;
30
- const DEDUPER_NUM_BITS : u64 = 637_534_199 ; // 76MB
31
- const DEDUPER_RESET_CYCLE : Duration = Duration :: from_secs ( 5 * 60 ) ;
32
-
33
26
pub ( crate ) struct ShredFetchStage {
34
27
thread_hdls : Vec < JoinHandle < ( ) > > ,
35
28
}
@@ -47,8 +40,6 @@ impl ShredFetchStage {
47
40
turbine_disabled : Arc < AtomicBool > ,
48
41
) {
49
42
const STATS_SUBMIT_CADENCE : Duration = Duration :: from_secs ( 1 ) ;
50
- let mut rng = rand:: thread_rng ( ) ;
51
- let mut deduper = Deduper :: < 2 , [ u8 ] > :: new ( & mut rng, DEDUPER_NUM_BITS ) ;
52
43
let mut last_updated = Instant :: now ( ) ;
53
44
let mut keypair = repair_context
54
45
. as_ref ( )
@@ -63,9 +54,6 @@ impl ShredFetchStage {
63
54
let mut stats = ShredFetchStats :: default ( ) ;
64
55
65
56
for mut packet_batch in recvr {
66
- if deduper. maybe_reset ( & mut rng, DEDUPER_FALSE_POSITIVE_RATE , DEDUPER_RESET_CYCLE ) {
67
- stats. num_deduper_saturations += 1 ;
68
- }
69
57
if last_updated. elapsed ( ) . as_millis ( ) as u64 > DEFAULT_MS_PER_SLOT {
70
58
last_updated = Instant :: now ( ) ;
71
59
{
@@ -102,12 +90,11 @@ impl ShredFetchStage {
102
90
let turbine_disabled = turbine_disabled. load ( Ordering :: Relaxed ) ;
103
91
for packet in packet_batch. iter_mut ( ) {
104
92
if turbine_disabled
105
- || should_discard_packet (
93
+ || should_discard_shred (
106
94
packet,
107
95
last_root,
108
96
max_slot,
109
97
shred_version,
110
- & deduper,
111
98
should_drop_merkle_shreds,
112
99
& mut stats,
113
100
)
@@ -245,39 +232,6 @@ impl ShredFetchStage {
245
232
}
246
233
}
247
234
248
- // Returns true if the packet should be marked as discard.
249
- #[ must_use]
250
- fn should_discard_packet < const K : usize > (
251
- packet : & Packet ,
252
- root : Slot ,
253
- max_slot : Slot , // Max slot to ingest shreds for.
254
- shred_version : u16 ,
255
- deduper : & Deduper < K , [ u8 ] > ,
256
- should_drop_merkle_shreds : impl Fn ( Slot ) -> bool ,
257
- stats : & mut ShredFetchStats ,
258
- ) -> bool {
259
- if should_discard_shred (
260
- packet,
261
- root,
262
- max_slot,
263
- shred_version,
264
- should_drop_merkle_shreds,
265
- stats,
266
- ) {
267
- return true ;
268
- }
269
- if packet
270
- . data ( ..)
271
- . map ( |data| deduper. dedup ( data) )
272
- . unwrap_or ( true )
273
- {
274
- stats. duplicate_shred += 1 ;
275
- true
276
- } else {
277
- false
278
- }
279
- }
280
-
281
235
#[ must_use]
282
236
fn should_drop_merkle_shreds ( shred_slot : Slot , root_bank : & Bank ) -> bool {
283
237
check_feature_activation (
@@ -299,13 +253,12 @@ mod tests {
299
253
blockstore:: MAX_DATA_SHREDS_PER_SLOT ,
300
254
shred:: { ReedSolomonCache , Shred , ShredFlags } ,
301
255
} ,
256
+ solana_sdk:: packet:: Packet ,
302
257
} ;
303
258
304
259
#[ test]
305
260
fn test_data_code_same_index ( ) {
306
261
solana_logger:: setup ( ) ;
307
- let mut rng = rand:: thread_rng ( ) ;
308
- let deduper = Deduper :: < 2 , [ u8 ] > :: new ( & mut rng, /*num_bits:*/ 640_007 ) ;
309
262
let mut packet = Packet :: default ( ) ;
310
263
let mut stats = ShredFetchStats :: default ( ) ;
311
264
@@ -327,12 +280,11 @@ mod tests {
327
280
let last_slot = 100 ;
328
281
let slots_per_epoch = 10 ;
329
282
let max_slot = last_slot + 2 * slots_per_epoch;
330
- assert ! ( !should_discard_packet (
283
+ assert ! ( !should_discard_shred (
331
284
& packet,
332
285
last_root,
333
286
max_slot,
334
287
shred_version,
335
- & deduper,
336
288
|_| false , // should_drop_merkle_shreds
337
289
& mut stats,
338
290
) ) ;
@@ -342,12 +294,11 @@ mod tests {
342
294
& ReedSolomonCache :: default ( ) ,
343
295
) ;
344
296
coding[ 0 ] . copy_to_packet ( & mut packet) ;
345
- assert ! ( !should_discard_packet (
297
+ assert ! ( !should_discard_shred (
346
298
& packet,
347
299
last_root,
348
300
max_slot,
349
301
shred_version,
350
- & deduper,
351
302
|_| false , // should_drop_merkle_shreds
352
303
& mut stats,
353
304
) ) ;
@@ -356,8 +307,6 @@ mod tests {
356
307
#[ test]
357
308
fn test_shred_filter ( ) {
358
309
solana_logger:: setup ( ) ;
359
- let mut rng = rand:: thread_rng ( ) ;
360
- let deduper = Deduper :: < 2 , [ u8 ] > :: new ( & mut rng, /*num_bits:*/ 640_007 ) ;
361
310
let mut packet = Packet :: default ( ) ;
362
311
let mut stats = ShredFetchStats :: default ( ) ;
363
312
let last_root = 0 ;
@@ -367,12 +316,11 @@ mod tests {
367
316
let max_slot = last_slot + 2 * slots_per_epoch;
368
317
369
318
// packet size is 0, so cannot get index
370
- assert ! ( should_discard_packet (
319
+ assert ! ( should_discard_shred (
371
320
& packet,
372
321
last_root,
373
322
max_slot,
374
323
shred_version,
375
- & deduper,
376
324
|_| false , // should_drop_merkle_shreds
377
325
& mut stats,
378
326
) ) ;
@@ -390,50 +338,35 @@ mod tests {
390
338
shred. copy_to_packet ( & mut packet) ;
391
339
392
340
// rejected slot is 2, root is 3
393
- assert ! ( should_discard_packet (
341
+ assert ! ( should_discard_shred (
394
342
& packet,
395
343
3 ,
396
344
max_slot,
397
345
shred_version,
398
- & deduper,
399
346
|_| false , // should_drop_merkle_shreds
400
347
& mut stats,
401
348
) ) ;
402
349
assert_eq ! ( stats. slot_out_of_range, 1 ) ;
403
350
404
- assert ! ( should_discard_packet (
351
+ assert ! ( should_discard_shred (
405
352
& packet,
406
353
last_root,
407
354
max_slot,
408
- 345 , // shred_version
409
- & deduper,
355
+ 345 , // shred_version
410
356
|_| false , // should_drop_merkle_shreds
411
357
& mut stats,
412
358
) ) ;
413
359
assert_eq ! ( stats. shred_version_mismatch, 1 ) ;
414
360
415
361
// Accepted for 1,3
416
- assert ! ( !should_discard_packet(
417
- & packet,
418
- last_root,
419
- max_slot,
420
- shred_version,
421
- & deduper,
422
- |_| false , // should_drop_merkle_shreds
423
- & mut stats,
424
- ) ) ;
425
-
426
- // deduper should filter duplicate
427
- assert ! ( should_discard_packet(
362
+ assert ! ( !should_discard_shred(
428
363
& packet,
429
364
last_root,
430
365
max_slot,
431
366
shred_version,
432
- & deduper,
433
367
|_| false , // should_drop_merkle_shreds
434
368
& mut stats,
435
369
) ) ;
436
- assert_eq ! ( stats. duplicate_shred, 1 ) ;
437
370
438
371
let shred = Shred :: new_from_data (
439
372
1_000_000 ,
@@ -448,25 +381,23 @@ mod tests {
448
381
shred. copy_to_packet ( & mut packet) ;
449
382
450
383
// Slot 1 million is too high
451
- assert ! ( should_discard_packet (
384
+ assert ! ( should_discard_shred (
452
385
& packet,
453
386
last_root,
454
387
max_slot,
455
388
shred_version,
456
- & deduper,
457
389
|_| false , // should_drop_merkle_shreds
458
390
& mut stats,
459
391
) ) ;
460
392
461
393
let index = MAX_DATA_SHREDS_PER_SLOT as u32 ;
462
394
let shred = Shred :: new_from_data ( 5 , index, 0 , & [ ] , ShredFlags :: LAST_SHRED_IN_SLOT , 0 , 0 , 0 ) ;
463
395
shred. copy_to_packet ( & mut packet) ;
464
- assert ! ( should_discard_packet (
396
+ assert ! ( should_discard_shred (
465
397
& packet,
466
398
last_root,
467
399
max_slot,
468
400
shred_version,
469
- & deduper,
470
401
|_| false , // should_drop_merkle_shreds
471
402
& mut stats,
472
403
) ) ;
0 commit comments