@ -213,49 +213,4 @@ mod tests {
|
|||||||
assert_eq!(packets[i].meta.addr(), saddr2);
|
assert_eq!(packets[i].meta.addr(), saddr2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
#[test]
|
|
||||||
pub fn test_recv_mmsg_batch_size() {
|
|
||||||
let reader = UdpSocket::bind("127.0.0.1:0").expect("bind");
|
|
||||||
let addr = reader.local_addr().unwrap();
|
|
||||||
let sender = UdpSocket::bind("127.0.0.1:0").expect("bind");
|
|
||||||
|
|
||||||
const TEST_BATCH_SIZE: usize = 64;
|
|
||||||
let sent = TEST_BATCH_SIZE;
|
|
||||||
|
|
||||||
let mut elapsed_in_max_batch = 0;
|
|
||||||
(0..1000).for_each(|_| {
|
|
||||||
for _ in 0..sent {
|
|
||||||
let data = [0; PACKET_DATA_SIZE];
|
|
||||||
sender.send_to(&data[..], &addr).unwrap();
|
|
||||||
}
|
|
||||||
let mut packets = vec![Packet::default(); TEST_BATCH_SIZE];
|
|
||||||
let now = Instant::now();
|
|
||||||
let recv = recv_mmsg(&reader, &mut packets[..]).unwrap().1;
|
|
||||||
elapsed_in_max_batch += now.elapsed().as_nanos();
|
|
||||||
assert_eq!(TEST_BATCH_SIZE, recv);
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut elapsed_in_small_batch = 0;
|
|
||||||
(0..1000).for_each(|_| {
|
|
||||||
for _ in 0..sent {
|
|
||||||
let data = [0; PACKET_DATA_SIZE];
|
|
||||||
sender.send_to(&data[..], &addr).unwrap();
|
|
||||||
}
|
|
||||||
let mut packets = vec![Packet::default(); 4];
|
|
||||||
let mut recv = 0;
|
|
||||||
let now = Instant::now();
|
|
||||||
while let Ok(num) = recv_mmsg(&reader, &mut packets[..]) {
|
|
||||||
recv += num.1;
|
|
||||||
if recv >= TEST_BATCH_SIZE {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
elapsed_in_small_batch += now.elapsed().as_nanos();
|
|
||||||
assert_eq!(TEST_BATCH_SIZE, recv);
|
|
||||||
});
|
|
||||||
|
|
||||||
assert!(elapsed_in_max_batch <= elapsed_in_small_batch);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
50
streamer/tests/recvmmsg.rs
Normal file
50
streamer/tests/recvmmsg.rs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
use solana_streamer::packet::Packet;
|
||||||
|
use solana_streamer::packet::PACKET_DATA_SIZE;
|
||||||
|
use solana_streamer::recvmmsg::*;
|
||||||
|
use std::net::UdpSocket;
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
#[test]
|
||||||
|
pub fn test_recv_mmsg_batch_size() {
|
||||||
|
let reader = UdpSocket::bind("127.0.0.1:0").expect("bind");
|
||||||
|
let addr = reader.local_addr().unwrap();
|
||||||
|
let sender = UdpSocket::bind("127.0.0.1:0").expect("bind");
|
||||||
|
|
||||||
|
const TEST_BATCH_SIZE: usize = 64;
|
||||||
|
let sent = TEST_BATCH_SIZE;
|
||||||
|
|
||||||
|
let mut elapsed_in_max_batch = 0;
|
||||||
|
(0..1000).for_each(|_| {
|
||||||
|
for _ in 0..sent {
|
||||||
|
let data = [0; PACKET_DATA_SIZE];
|
||||||
|
sender.send_to(&data[..], &addr).unwrap();
|
||||||
|
}
|
||||||
|
let mut packets = vec![Packet::default(); TEST_BATCH_SIZE];
|
||||||
|
let now = Instant::now();
|
||||||
|
let recv = recv_mmsg(&reader, &mut packets[..]).unwrap().1;
|
||||||
|
elapsed_in_max_batch += now.elapsed().as_nanos();
|
||||||
|
assert_eq!(TEST_BATCH_SIZE, recv);
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut elapsed_in_small_batch = 0;
|
||||||
|
(0..1000).for_each(|_| {
|
||||||
|
for _ in 0..sent {
|
||||||
|
let data = [0; PACKET_DATA_SIZE];
|
||||||
|
sender.send_to(&data[..], &addr).unwrap();
|
||||||
|
}
|
||||||
|
let mut packets = vec![Packet::default(); 4];
|
||||||
|
let mut recv = 0;
|
||||||
|
let now = Instant::now();
|
||||||
|
while let Ok(num) = recv_mmsg(&reader, &mut packets[..]) {
|
||||||
|
recv += num.1;
|
||||||
|
if recv >= TEST_BATCH_SIZE {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elapsed_in_small_batch += now.elapsed().as_nanos();
|
||||||
|
assert_eq!(TEST_BATCH_SIZE, recv);
|
||||||
|
});
|
||||||
|
|
||||||
|
assert!(elapsed_in_max_batch <= elapsed_in_small_batch);
|
||||||
|
}
|
Reference in New Issue
Block a user