perf(http2): don't register callback with main h2 client task

This commit is contained in:
Sean McArthur
2019-02-25 17:27:51 -08:00
parent 1161479945
commit 1e6603353e
2 changed files with 13 additions and 6 deletions

View File

@@ -178,14 +178,21 @@ pub enum Callback<T, U> {
} }
impl<T, U> Callback<T, U> { impl<T, U> Callback<T, U> {
pub fn poll_cancel(&mut self) -> Poll<(), ()> { pub(crate) fn is_canceled(&self) -> bool {
match *self {
Callback::Retry(ref tx) => tx.is_canceled(),
Callback::NoRetry(ref tx) => tx.is_canceled(),
}
}
pub(crate) fn poll_cancel(&mut self) -> Poll<(), ()> {
match *self { match *self {
Callback::Retry(ref mut tx) => tx.poll_cancel(), Callback::Retry(ref mut tx) => tx.poll_cancel(),
Callback::NoRetry(ref mut tx) => tx.poll_cancel(), Callback::NoRetry(ref mut tx) => tx.poll_cancel(),
} }
} }
pub fn send(self, val: Result<U, (::Error, Option<T>)>) { pub(crate) fn send(self, val: Result<U, (::Error, Option<T>)>) {
match self { match self {
Callback::Retry(tx) => { Callback::Retry(tx) => {
let _ = tx.send(val); let _ = tx.send(val);

View File

@@ -102,7 +102,7 @@ where
match self.rx.poll() { match self.rx.poll() {
Ok(Async::Ready(Some((req, mut cb)))) => { Ok(Async::Ready(Some((req, mut cb)))) => {
// check that future hasn't been canceled already // check that future hasn't been canceled already
if let Async::Ready(()) = cb.poll_cancel().expect("poll_cancel cannot error") { if cb.is_canceled() {
trace!("request canceled"); trace!("request canceled");
continue; continue;
} }
@@ -117,7 +117,7 @@ where
Ok(ok) => ok, Ok(ok) => ok,
Err(err) => { Err(err) => {
debug!("client send request error: {}", err); debug!("client send request error: {}", err);
let _ = cb.send(Err((::Error::new_h2(err), None))); cb.send(Err((::Error::new_h2(err), None)));
continue; continue;
} }
}; };
@@ -147,11 +147,11 @@ where
let content_length = content_length_parse_all(res.headers()); let content_length = content_length_parse_all(res.headers());
let res = res.map(|stream| let res = res.map(|stream|
::Body::h2(stream, content_length)); ::Body::h2(stream, content_length));
let _ = cb.send(Ok(res)); cb.send(Ok(res));
}, },
Err(err) => { Err(err) => {
debug!("client response error: {}", err); debug!("client response error: {}", err);
let _ = cb.send(Err((::Error::new_h2(err), None))); cb.send(Err((::Error::new_h2(err), None)));
} }
} }
Ok(()) Ok(())