uses sendmmsg in streamer (#23062)

packet::send_to sends packets one by one:
https://github.com/solana-labs/solana/blob/9213fcb11/streamer/src/packet.rs#L63-L75

sendmmsg uses a single system call for multiple messages:
https://github.com/solana-labs/solana/blob/9213fcb11/streamer/src/sendmmsg.rs#L94
This commit is contained in:
behzad nouri 2022-02-11 13:36:50 +00:00 committed by GitHub
parent 34443a238e
commit c078ca3fb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 12 additions and 2 deletions

View File

@ -3,8 +3,9 @@
use {
crate::{
packet::{self, send_to, PacketBatch, PacketBatchRecycler, PACKETS_PER_BATCH},
packet::{self, PacketBatch, PacketBatchRecycler, PACKETS_PER_BATCH},
recvmmsg::NUM_RCVMMSGS,
sendmmsg::{batch_send, SendPktsError},
socket::SocketAddrSpace,
},
crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender},
@ -37,6 +38,9 @@ pub enum StreamerError {
#[error("send packets error")]
Send(#[from] SendError<PacketBatch>),
#[error(transparent)]
SendPktsError(#[from] SendPktsError),
}
pub type Result<T> = std::result::Result<T, StreamerError>;
@ -242,7 +246,13 @@ fn recv_send(
if let Some(stats) = stats {
packet_batch.packets.iter().for_each(|p| stats.record(p));
}
send_to(&packet_batch, sock, socket_addr_space)?;
let packets = packet_batch.packets.iter().filter_map(|pkt| {
let addr = pkt.meta.addr();
socket_addr_space
.check(&addr)
.then(|| (&pkt.data[..pkt.meta.size], addr))
});
batch_send(sock, &packets.collect::<Vec<_>>())?;
Ok(())
}