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:
@ -3,8 +3,9 @@
|
|||||||
|
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
packet::{self, send_to, PacketBatch, PacketBatchRecycler, PACKETS_PER_BATCH},
|
packet::{self, PacketBatch, PacketBatchRecycler, PACKETS_PER_BATCH},
|
||||||
recvmmsg::NUM_RCVMMSGS,
|
recvmmsg::NUM_RCVMMSGS,
|
||||||
|
sendmmsg::{batch_send, SendPktsError},
|
||||||
socket::SocketAddrSpace,
|
socket::SocketAddrSpace,
|
||||||
},
|
},
|
||||||
crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender},
|
crossbeam_channel::{Receiver, RecvTimeoutError, SendError, Sender},
|
||||||
@ -37,6 +38,9 @@ pub enum StreamerError {
|
|||||||
|
|
||||||
#[error("send packets error")]
|
#[error("send packets error")]
|
||||||
Send(#[from] SendError<PacketBatch>),
|
Send(#[from] SendError<PacketBatch>),
|
||||||
|
|
||||||
|
#[error(transparent)]
|
||||||
|
SendPktsError(#[from] SendPktsError),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Result<T> = std::result::Result<T, StreamerError>;
|
pub type Result<T> = std::result::Result<T, StreamerError>;
|
||||||
@ -242,7 +246,13 @@ fn recv_send(
|
|||||||
if let Some(stats) = stats {
|
if let Some(stats) = stats {
|
||||||
packet_batch.packets.iter().for_each(|p| stats.record(p));
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user