Skip to content

Commit ada3005

Browse files
bring back buffering
1 parent ed27c98 commit ada3005

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

quinn/src/connection.rs

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,7 @@ impl ConnectionRef {
900900
udp_sender: sender,
901901
runtime,
902902
send_buffer: Vec::new(),
903+
buffered_transmit: None,
903904
observed_external_addr: watch::Sender::new(None),
904905
}),
905906
shared: Shared::default(),
@@ -1018,6 +1019,8 @@ pub(crate) struct State {
10181019
udp_sender: Pin<Box<dyn UdpSender>>,
10191020
runtime: Arc<dyn Runtime>,
10201021
send_buffer: Vec<u8>,
1022+
/// We buffer a transmit when the underlying I/O would block
1023+
buffered_transmit: Option<proto::Transmit>,
10211024
/// Our last external address reported by the peer.
10221025
pub(crate) observed_external_addr: watch::Sender<Option<SocketAddr>>,
10231026
}
@@ -1030,18 +1033,26 @@ impl State {
10301033
let max_datagrams = self.udp_sender.max_transmit_segments();
10311034

10321035
loop {
1033-
self.send_buffer.clear();
1034-
self.send_buffer.reserve(self.inner.current_mtu() as usize);
1035-
let Some(t) = self
1036-
.inner
1037-
.poll_transmit(now, max_datagrams, &mut self.send_buffer)
1038-
else {
1039-
break;
1040-
};
1041-
1042-
transmits += match t.segment_size {
1043-
None => 1,
1044-
Some(s) => (t.size + s - 1) / s, // round up
1036+
// Retry the last transmit, or get a new one.
1037+
let t = match self.buffered_transmit.take() {
1038+
Some(t) => t,
1039+
None => {
1040+
self.send_buffer.clear();
1041+
self.send_buffer.reserve(self.inner.current_mtu() as usize);
1042+
match self
1043+
.inner
1044+
.poll_transmit(now, max_datagrams, &mut self.send_buffer)
1045+
{
1046+
Some(t) => {
1047+
transmits += match t.segment_size {
1048+
None => 1,
1049+
Some(s) => (t.size + s - 1) / s, // round up
1050+
};
1051+
t
1052+
}
1053+
None => break,
1054+
}
1055+
}
10451056
};
10461057

10471058
let len = t.size;
@@ -1051,7 +1062,10 @@ impl State {
10511062
.as_mut()
10521063
.poll_send(&udp_transmit(&t, &self.send_buffer[..len]), cx)
10531064
{
1054-
Poll::Pending => return Ok(true),
1065+
Poll::Pending => {
1066+
self.buffered_transmit = Some(t);
1067+
return Ok(false);
1068+
}
10551069
Poll::Ready(result) => result?, // propagate errors
10561070
}
10571071

0 commit comments

Comments
 (0)