mirror of
https://github.com/YGGverse/aquatic.git
synced 2026-03-31 17:55:36 +00:00
udp: distribute announce swarm responses among socket workers
They don't have to be sent from the same worker that received the request, so we can decrease performance loss from underutilized threads this way.
This commit is contained in:
parent
7d17213a20
commit
b527af7195
2 changed files with 91 additions and 57 deletions
|
|
@ -171,13 +171,17 @@ impl ConnectedRequestSender {
|
|||
|
||||
pub struct ConnectedResponseSender {
|
||||
senders: Vec<thingbuf::mpsc::blocking::Sender<ConnectedResponseWithAddr, Recycler>>,
|
||||
to_any_last_index_picked: usize,
|
||||
}
|
||||
|
||||
impl ConnectedResponseSender {
|
||||
pub fn new(
|
||||
senders: Vec<thingbuf::mpsc::blocking::Sender<ConnectedResponseWithAddr, Recycler>>,
|
||||
) -> Self {
|
||||
Self { senders }
|
||||
Self {
|
||||
senders,
|
||||
to_any_last_index_picked: 0,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_send_ref_to(
|
||||
|
|
@ -193,6 +197,23 @@ impl ConnectedResponseSender {
|
|||
) -> Result<SendRef<ConnectedResponseWithAddr>, thingbuf::mpsc::errors::Closed> {
|
||||
self.senders[index.0].send_ref()
|
||||
}
|
||||
|
||||
pub fn send_ref_to_any(
|
||||
&mut self,
|
||||
) -> Result<SendRef<ConnectedResponseWithAddr>, thingbuf::mpsc::errors::Closed> {
|
||||
let start = self.to_any_last_index_picked + 1;
|
||||
|
||||
for i in (start..start + self.senders.len()).map(|i| i % self.senders.len()) {
|
||||
if let Ok(sender) = self.senders[i].try_send_ref() {
|
||||
self.to_any_last_index_picked = i;
|
||||
|
||||
return Ok(sender);
|
||||
}
|
||||
}
|
||||
|
||||
self.to_any_last_index_picked = start % self.senders.len();
|
||||
self.send_ref_to(SocketWorkerIndex(self.to_any_last_index_picked))
|
||||
}
|
||||
}
|
||||
|
||||
pub type ConnectedResponseReceiver =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue