Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit a906924

Browse files
authored
replace send with sendmmsg (#25585)
* replace send with sendmmsg * address PR comments
1 parent 4f0cc62 commit a906924

File tree

1 file changed

+42
-22
lines changed

1 file changed

+42
-22
lines changed

dos/src/main.rs

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ use {
4747
solana_client::{
4848
connection_cache::{ConnectionCache, DEFAULT_TPU_CONNECTION_POOL_SIZE},
4949
rpc_client::RpcClient,
50+
tpu_connection::TpuConnection,
5051
},
5152
solana_core::serve_repair::RepairProtocol,
5253
solana_dos::cli::*,
@@ -67,6 +68,7 @@ use {
6768
},
6869
solana_streamer::socket::SocketAddrSpace,
6970
std::{
71+
cmp::min,
7072
net::{SocketAddr, UdpSocket},
7173
process::exit,
7274
sync::Arc,
@@ -233,6 +235,8 @@ impl TransactionGenerator {
233235
}
234236
}
235237

238+
const SEND_BATCH_MAX_SIZE: usize = 1 << 10;
239+
236240
fn get_target(
237241
nodes: &[ContactInfo],
238242
mode: Mode,
@@ -385,9 +389,8 @@ fn run_dos_transactions<T: 'static + BenchTpsClient + Send + Sync>(
385389
iterations: usize,
386390
client: Option<Arc<T>>,
387391
transaction_params: TransactionParams,
392+
tpu_use_quic: bool,
388393
) {
389-
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
390-
391394
// Number of payers is the number of generating threads, for now it is 1
392395
// Later, we will create a new payer for each thread since Keypair is not clonable
393396
let payers: Vec<Option<Keypair>> =
@@ -417,34 +420,45 @@ fn run_dos_transactions<T: 'static + BenchTpsClient + Send + Sync>(
417420

418421
let mut transaction_generator = TransactionGenerator::new(transaction_params);
419422

423+
//let connection_cache_stats = Arc::new(ConnectionCacheStats::default());
424+
//let udp_client = UdpTpuConnection::new(target, connection_cache_stats);
425+
426+
let connection_cache = ConnectionCache::new(tpu_use_quic, DEFAULT_TPU_CONNECTION_POOL_SIZE);
427+
let connection = connection_cache.get_connection(&target);
428+
420429
let mut count = 0;
421430
let mut total_count = 0;
422431
let mut error_count = 0;
423432
let mut last_log = Instant::now();
433+
424434
loop {
425-
let chunk_keypairs = if generate_keypairs {
426-
let permutation = it.next();
427-
if permutation.is_none() {
428-
// if ran out of permutations, regenerate keys
429-
keypairs_flat.iter_mut().for_each(|v| *v = Keypair::new());
430-
info!("Regenerate keypairs");
431-
continue;
432-
}
433-
let permutation = permutation.unwrap();
434-
Some(apply_permutation(permutation, &keypairs_flat))
435-
} else {
436-
None
437-
};
435+
let send_batch_size = min(iterations - total_count, SEND_BATCH_MAX_SIZE);
436+
let mut data = Vec::<Vec<u8>>::with_capacity(SEND_BATCH_MAX_SIZE);
437+
for _ in 0..send_batch_size {
438+
let chunk_keypairs = if generate_keypairs {
439+
let mut permutation = it.next();
440+
if permutation.is_none() {
441+
// if ran out of permutations, regenerate keys
442+
keypairs_flat.iter_mut().for_each(|v| *v = Keypair::new());
443+
info!("Regenerate keypairs");
444+
permutation = it.next();
445+
}
446+
let permutation = permutation.unwrap();
447+
Some(apply_permutation(permutation, &keypairs_flat))
448+
} else {
449+
None
450+
};
451+
let tx = transaction_generator.generate(payer, chunk_keypairs, client.as_ref());
452+
data.push(bincode::serialize(&tx).unwrap());
453+
}
438454

439-
let tx = transaction_generator.generate(payer, chunk_keypairs, client.as_ref());
455+
let res = connection.send_wire_transaction_batch_async(data);
440456

441-
let data = bincode::serialize(&tx).unwrap();
442-
let res = socket.send_to(&data, target);
443457
if res.is_err() {
444-
error_count += 1;
458+
error_count += send_batch_size;
445459
}
446-
count += 1;
447-
total_count += 1;
460+
count += send_batch_size;
461+
total_count += send_batch_size;
448462
if last_log.elapsed().as_millis() > SAMPLE_PERIOD_MS as u128 {
449463
info!(
450464
"count: {}, errors: {}, rps: {}",
@@ -485,7 +499,13 @@ fn run_dos<T: 'static + BenchTpsClient + Send + Sync>(
485499
{
486500
let target = target.expect("should have target");
487501
info!("Targeting {}", target);
488-
run_dos_transactions(target, iterations, client, params.transaction_params);
502+
run_dos_transactions(
503+
target,
504+
iterations,
505+
client,
506+
params.transaction_params,
507+
params.tpu_use_quic,
508+
);
489509
} else {
490510
let target = target.expect("should have target");
491511
info!("Targeting {}", target);

0 commit comments

Comments
 (0)