perf(lib): re-enable writev support (#2338)
Tokio's `AsyncWrite` trait once again has support for vectored writes in Tokio 0.3.4 (see tokio-rs/tokio#3149). This branch re-enables vectored writes in Hyper for HTTP/1. Using vectored writes in HTTP/2 will require an upstream change in the `h2` crate as well. I've removed the adaptive write buffer implementation that attempts to detect whether vectored IO is or is not available, since the Tokio 0.3.4 `AsyncWrite` trait exposes this directly via the `is_write_vectored` method. Now, we just ask the IO whether or not it supports vectored writes, and configure the buffer accordingly. This makes the implementation somewhat simpler. This also removes `http1_writev()` methods from the builders. These are no longer necessary, as Hyper can now determine whether or not to use vectored writes based on `is_write_vectored`, rather than trying to auto-detect it. Closes #2320 BREAKING CHANGE: Removed `http1_writev` methods from `client::Builder`, `client::conn::Builder`, `server::Builder`, and `server::conn::Builder`. Vectored writes are now enabled based on whether the `AsyncWrite` implementation in use supports them, rather than though adaptive detection. To explicitly disable vectored writes, users may wrap the IO in a newtype that implements `AsyncRead` and `AsyncWrite` and returns `false` from its `AsyncWrite::is_write_vectored` method.
This commit is contained in:
		| @@ -293,6 +293,15 @@ mod addr_stream { | ||||
|             self.project().inner.poll_write(cx, buf) | ||||
|         } | ||||
|  | ||||
|         #[inline] | ||||
|         fn poll_write_vectored( | ||||
|             self: Pin<&mut Self>, | ||||
|             cx: &mut task::Context<'_>, | ||||
|             bufs: &[io::IoSlice<'_>], | ||||
|         ) -> Poll<io::Result<usize>> { | ||||
|             self.project().inner.poll_write_vectored(cx, bufs) | ||||
|         } | ||||
|  | ||||
|         #[inline] | ||||
|         fn poll_flush(self: Pin<&mut Self>, _cx: &mut task::Context<'_>) -> Poll<io::Result<()>> { | ||||
|             // TCP flush is a noop | ||||
| @@ -303,6 +312,15 @@ mod addr_stream { | ||||
|         fn poll_shutdown(self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<io::Result<()>> { | ||||
|             self.project().inner.poll_shutdown(cx) | ||||
|         } | ||||
|  | ||||
|         #[inline] | ||||
|         fn is_write_vectored(&self) -> bool { | ||||
|             // Note that since `self.inner` is a `TcpStream`, this could | ||||
|             // *probably* be hard-coded to return `true`...but it seems more | ||||
|             // correct to ask it anyway (maybe we're on some platform without | ||||
|             // scatter-gather IO?) | ||||
|             self.inner.is_write_vectored() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     #[cfg(unix)] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user