Skip to content

Commit cbbdd30

Browse files
authored
update to tokio 0.3 (#491)
1 parent 676a068 commit cbbdd30

File tree

11 files changed

+68
-61
lines changed

11 files changed

+68
-61
lines changed

Cargo.toml

+6-6
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,14 @@ members = [
4545
futures-core = { version = "0.3", default-features = false }
4646
futures-sink = { version = "0.3", default-features = false }
4747
futures-util = { version = "0.3", default-features = false }
48-
tokio-util = { version = "0.3.1", features = ["codec"] }
49-
tokio = { version = "0.2", features = ["io-util"] }
48+
tokio-util = { version = "0.4.0", features = ["codec"] }
49+
tokio = { version = "0.3", features = ["io-util"] }
5050
bytes = "0.5.2"
5151
http = "0.2"
5252
tracing = { version = "0.1.13", default-features = false, features = ["std", "log"] }
5353
tracing-futures = { version = "0.2", default-features = false, features = ["std-future"]}
5454
fnv = "1.0.5"
55-
slab = "0.4.0"
55+
slab = "0.4.2"
5656
indexmap = "1.0"
5757

5858
[dev-dependencies]
@@ -68,9 +68,9 @@ serde = "1.0.0"
6868
serde_json = "1.0.0"
6969

7070
# Examples
71-
tokio = { version = "0.2", features = ["dns", "macros", "rt-core", "sync", "tcp"] }
71+
tokio = { version = "0.3", features = ["rt-multi-thread", "macros", "sync", "net"] }
7272
env_logger = { version = "0.5.3", default-features = false }
73-
rustls = "0.16"
74-
tokio-rustls = "0.12.0"
73+
rustls = "0.18"
74+
tokio-rustls = "0.20.0"
7575
webpki = "0.21"
7676
webpki-roots = "0.17"

examples/server.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tokio::net::{TcpListener, TcpStream};
88
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
99
let _ = env_logger::try_init();
1010

11-
let mut listener = TcpListener::bind("127.0.0.1:5928").await?;
11+
let listener = TcpListener::bind("127.0.0.1:5928").await?;
1212

1313
println!("listening on {:?}", listener.local_addr());
1414

src/codec/framed_write.rs

+21-22
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ use crate::codec::UserError::*;
33
use crate::frame::{self, Frame, FrameSize};
44
use crate::hpack;
55

6-
use bytes::{
7-
buf::{BufExt, BufMutExt},
8-
Buf, BufMut, BytesMut,
9-
};
6+
use bytes::{buf::BufMutExt, Buf, BufMut, BytesMut};
107
use std::pin::Pin;
118
use std::task::{Context, Poll};
12-
use tokio::io::{AsyncRead, AsyncWrite};
9+
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
1310

1411
use std::io::{self, Cursor};
1512

@@ -193,12 +190,26 @@ where
193190
match self.next {
194191
Some(Next::Data(ref mut frame)) => {
195192
tracing::trace!(queued_data_frame = true);
196-
let mut buf = (&mut self.buf).chain(frame.payload_mut());
197-
ready!(Pin::new(&mut self.inner).poll_write_buf(cx, &mut buf))?;
193+
194+
if self.buf.has_remaining() {
195+
let n =
196+
ready!(Pin::new(&mut self.inner).poll_write(cx, self.buf.bytes()))?;
197+
self.buf.advance(n);
198+
}
199+
200+
let buf = frame.payload_mut();
201+
202+
if !self.buf.has_remaining() && buf.has_remaining() {
203+
let n = ready!(Pin::new(&mut self.inner).poll_write(cx, buf.bytes()))?;
204+
buf.advance(n);
205+
}
198206
}
199207
_ => {
200208
tracing::trace!(queued_data_frame = false);
201-
ready!(Pin::new(&mut self.inner).poll_write_buf(cx, &mut self.buf))?;
209+
let n = ready!(
210+
Pin::new(&mut self.inner).poll_write(cx, &mut self.buf.bytes())
211+
)?;
212+
self.buf.advance(n);
202213
}
203214
}
204215
}
@@ -290,25 +301,13 @@ impl<T, B> FramedWrite<T, B> {
290301
}
291302

292303
impl<T: AsyncRead + Unpin, B> AsyncRead for FramedWrite<T, B> {
293-
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [std::mem::MaybeUninit<u8>]) -> bool {
294-
self.inner.prepare_uninitialized_buffer(buf)
295-
}
296-
297304
fn poll_read(
298305
mut self: Pin<&mut Self>,
299306
cx: &mut Context<'_>,
300-
buf: &mut [u8],
301-
) -> Poll<io::Result<usize>> {
307+
buf: &mut ReadBuf,
308+
) -> Poll<io::Result<()>> {
302309
Pin::new(&mut self.inner).poll_read(cx, buf)
303310
}
304-
305-
fn poll_read_buf<Buf: BufMut>(
306-
mut self: Pin<&mut Self>,
307-
cx: &mut Context<'_>,
308-
buf: &mut Buf,
309-
) -> Poll<io::Result<usize>> {
310-
Pin::new(&mut self.inner).poll_read_buf(cx, buf)
311-
}
312311
}
313312

314313
// We never project the Pin to `B`.

src/server.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ use std::pin::Pin;
127127
use std::task::{Context, Poll};
128128
use std::time::Duration;
129129
use std::{convert, fmt, io, mem};
130-
use tokio::io::{AsyncRead, AsyncWrite};
130+
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};
131131
use tracing_futures::{Instrument, Instrumented};
132132

133133
/// In progress HTTP/2.0 connection handshake future.
@@ -1158,16 +1158,18 @@ where
11581158
let mut rem = PREFACE.len() - self.pos;
11591159

11601160
while rem > 0 {
1161-
let n = ready!(Pin::new(self.inner_mut()).poll_read(cx, &mut buf[..rem]))
1161+
let mut buf = ReadBuf::new(&mut buf[..rem]);
1162+
ready!(Pin::new(self.inner_mut()).poll_read(cx, &mut buf))
11621163
.map_err(crate::Error::from_io)?;
1164+
let n = buf.filled().len();
11631165
if n == 0 {
11641166
return Poll::Ready(Err(crate::Error::from_io(io::Error::new(
11651167
io::ErrorKind::UnexpectedEof,
11661168
"connection closed before reading preface",
11671169
))));
11681170
}
11691171

1170-
if PREFACE[self.pos..self.pos + n] != buf[..n] {
1172+
if &PREFACE[self.pos..self.pos + n] != buf.filled() {
11711173
proto_err!(conn: "read_preface: invalid preface");
11721174
// TODO: Should this just write the GO_AWAY frame directly?
11731175
return Poll::Ready(Err(Reason::PROTOCOL_ERROR.into()));

tests/h2-fuzz/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ env_logger = { version = "0.5.3", default-features = false }
1212
futures = { version = "0.3", default-features = false, features = ["std"] }
1313
honggfuzz = "0.5"
1414
http = "0.2"
15-
tokio = { version = "0.2", features = [] }
15+
tokio = { version = "0.3", features = [] }

tests/h2-support/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ tracing = "0.1"
1212
tracing-subscriber = { version = "0.2", default-features = false, features = ["fmt", "chrono", "ansi"] }
1313
futures = { version = "0.3", default-features = false }
1414
http = "0.2"
15-
tokio = { version = "0.2", features = ["time"] }
16-
tokio-test = "0.2"
15+
tokio = { version = "0.3", features = ["time"] }
16+
tokio-test = "0.3"

tests/h2-support/src/mock.rs

+21-20
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use h2::{self, RecvError, SendError};
66
use futures::future::poll_fn;
77
use futures::{ready, Stream, StreamExt};
88

9-
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
9+
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf};
1010

1111
use super::assert::assert_frame_eq;
1212
use std::pin::Pin;
@@ -147,10 +147,11 @@ impl Handle {
147147
poll_fn(move |cx| {
148148
while buf.has_remaining() {
149149
let res = Pin::new(self.codec.get_mut())
150-
.poll_write_buf(cx, &mut buf)
150+
.poll_write(cx, &mut buf.bytes())
151151
.map_err(|e| panic!("write err={:?}", e));
152152

153-
ready!(res).unwrap();
153+
let n = ready!(res).unwrap();
154+
buf.advance(n);
154155
}
155156

156157
Poll::Ready(())
@@ -294,8 +295,8 @@ impl AsyncRead for Handle {
294295
fn poll_read(
295296
mut self: Pin<&mut Self>,
296297
cx: &mut Context<'_>,
297-
buf: &mut [u8],
298-
) -> Poll<io::Result<usize>> {
298+
buf: &mut ReadBuf,
299+
) -> Poll<io::Result<()>> {
299300
Pin::new(self.codec.get_mut()).poll_read(cx, buf)
300301
}
301302
}
@@ -344,29 +345,29 @@ impl AsyncRead for Mock {
344345
fn poll_read(
345346
self: Pin<&mut Self>,
346347
cx: &mut Context<'_>,
347-
buf: &mut [u8],
348-
) -> Poll<io::Result<usize>> {
348+
buf: &mut ReadBuf,
349+
) -> Poll<io::Result<()>> {
349350
assert!(
350-
buf.len() > 0,
351+
buf.remaining() > 0,
351352
"attempted read with zero length buffer... wut?"
352353
);
353354

354355
let mut me = self.pipe.inner.lock().unwrap();
355356

356357
if me.rx.is_empty() {
357358
if me.closed {
358-
return Poll::Ready(Ok(0));
359+
return Poll::Ready(Ok(()));
359360
}
360361

361362
me.rx_task = Some(cx.waker().clone());
362363
return Poll::Pending;
363364
}
364365

365-
let n = cmp::min(buf.len(), me.rx.len());
366-
buf[..n].copy_from_slice(&me.rx[..n]);
366+
let n = cmp::min(buf.remaining(), me.rx.len());
367+
buf.put_slice(&me.rx[..n]);
367368
me.rx.drain(..n);
368369

369-
Poll::Ready(Ok(n))
370+
Poll::Ready(Ok(()))
370371
}
371372
}
372373

@@ -427,29 +428,29 @@ impl AsyncRead for Pipe {
427428
fn poll_read(
428429
self: Pin<&mut Self>,
429430
cx: &mut Context<'_>,
430-
buf: &mut [u8],
431-
) -> Poll<io::Result<usize>> {
431+
buf: &mut ReadBuf,
432+
) -> Poll<io::Result<()>> {
432433
assert!(
433-
buf.len() > 0,
434+
buf.remaining() > 0,
434435
"attempted read with zero length buffer... wut?"
435436
);
436437

437438
let mut me = self.inner.lock().unwrap();
438439

439440
if me.tx.is_empty() {
440441
if me.closed {
441-
return Poll::Ready(Ok(0));
442+
return Poll::Ready(Ok(()));
442443
}
443444

444445
me.tx_task = Some(cx.waker().clone());
445446
return Poll::Pending;
446447
}
447448

448-
let n = cmp::min(buf.len(), me.tx.len());
449-
buf[..n].copy_from_slice(&me.tx[..n]);
449+
let n = cmp::min(buf.remaining(), me.tx.len());
450+
buf.put_slice(&me.tx[..n]);
450451
me.tx.drain(..n);
451452

452-
Poll::Ready(Ok(n))
453+
Poll::Ready(Ok(()))
453454
}
454455
}
455456

@@ -479,5 +480,5 @@ impl AsyncWrite for Pipe {
479480
}
480481

481482
pub async fn idle_ms(ms: u64) {
482-
tokio::time::delay_for(Duration::from_millis(ms)).await
483+
tokio::time::sleep(Duration::from_millis(ms)).await
483484
}

tests/h2-tests/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ edition = "2018"
1111
h2-support = { path = "../h2-support" }
1212
tracing = "0.1.13"
1313
futures = { version = "0.3", default-features = false, features = ["alloc"] }
14-
tokio = { version = "0.2", features = ["macros", "tcp"] }
14+
tokio = { version = "0.3", features = ["macros", "net", "rt", "io-util"] }

tests/h2-tests/tests/codec_read.rs

+5
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ async fn read_continuation_frames() {
190190
#[tokio::test]
191191
async fn update_max_frame_len_at_rest() {
192192
use futures::StreamExt;
193+
use tokio::io::AsyncReadExt;
193194

194195
h2_support::trace_init!();
195196
// TODO: add test for updating max frame length in flight as well?
@@ -211,6 +212,10 @@ async fn update_max_frame_len_at_rest() {
211212
codec.next().await.unwrap().unwrap_err().to_string(),
212213
"frame with invalid size"
213214
);
215+
216+
// drain codec buffer
217+
let mut buf = Vec::new();
218+
codec.get_mut().read_to_end(&mut buf).await.unwrap();
214219
}
215220

216221
#[tokio::test]

tests/h2-tests/tests/flow_control.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ async fn settings_lowered_capacity_returns_capacity_to_connection() {
972972
//
973973
// A timeout is used here to avoid blocking forever if there is a
974974
// failure
975-
let result = select(rx2, tokio::time::delay_for(Duration::from_secs(5))).await;
975+
let result = select(rx2, tokio::time::sleep(Duration::from_secs(5))).await;
976976
if let Either::Right((_, _)) = result {
977977
panic!("Timed out");
978978
}
@@ -1004,7 +1004,7 @@ async fn settings_lowered_capacity_returns_capacity_to_connection() {
10041004
});
10051005

10061006
// Wait for server handshake to complete.
1007-
let result = select(rx1, tokio::time::delay_for(Duration::from_secs(5))).await;
1007+
let result = select(rx1, tokio::time::sleep(Duration::from_secs(5))).await;
10081008
if let Either::Right((_, _)) = result {
10091009
panic!("Timed out");
10101010
}

tests/h2-tests/tests/hammer.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ impl Server {
2626
{
2727
let mk_data = Arc::new(mk_data);
2828

29-
let mut rt = tokio::runtime::Runtime::new().unwrap();
30-
let mut listener = rt
29+
let rt = tokio::runtime::Runtime::new().unwrap();
30+
let listener = rt
3131
.block_on(TcpListener::bind(SocketAddr::from(([127, 0, 0, 1], 0))))
3232
.unwrap();
3333
let addr = listener.local_addr().unwrap();
@@ -140,7 +140,7 @@ fn hammer_client_concurrency() {
140140
})
141141
});
142142

143-
let mut rt = tokio::runtime::Runtime::new().unwrap();
143+
let rt = tokio::runtime::Runtime::new().unwrap();
144144
rt.block_on(tcp);
145145
println!("...done");
146146
}

0 commit comments

Comments
 (0)