-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(client): try to reuse connections when pool checkout wins
If a checkout wins, meaning an idle connection became available before a connect future completed, instead of just dropping the connect future, it spawns it into the background executor to allow being placed into the pool on completion.
- Loading branch information
1 parent
1f95f58
commit f2d464a
Showing
6 changed files
with
314 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
use std::mem; | ||
|
||
use futures::{Future, IntoFuture, Poll}; | ||
|
||
pub(crate) fn lazy<F, R>(func: F) -> Lazy<F, R> | ||
where | ||
F: FnOnce() -> R, | ||
R: IntoFuture, | ||
{ | ||
Lazy { | ||
inner: Inner::Init(func), | ||
} | ||
} | ||
|
||
pub struct Lazy<F, R: IntoFuture> { | ||
inner: Inner<F, R::Future> | ||
} | ||
|
||
enum Inner<F, R> { | ||
Init(F), | ||
Fut(R), | ||
Empty, | ||
} | ||
|
||
impl<F, R> Lazy<F, R> | ||
where | ||
F: FnOnce() -> R, | ||
R: IntoFuture, | ||
{ | ||
pub fn started(&self) -> bool { | ||
match self.inner { | ||
Inner::Init(_) => false, | ||
Inner::Fut(_) | | ||
Inner::Empty => true, | ||
} | ||
} | ||
} | ||
|
||
impl<F, R> Future for Lazy<F, R> | ||
where | ||
F: FnOnce() -> R, | ||
R: IntoFuture, | ||
{ | ||
type Item = R::Item; | ||
type Error = R::Error; | ||
|
||
fn poll(&mut self) -> Poll<Self::Item, Self::Error> { | ||
match self.inner { | ||
Inner::Fut(ref mut f) => return f.poll(), | ||
_ => (), | ||
} | ||
|
||
match mem::replace(&mut self.inner, Inner::Empty) { | ||
Inner::Init(func) => { | ||
let mut fut = func().into_future(); | ||
let ret = fut.poll(); | ||
self.inner = Inner::Fut(fut); | ||
ret | ||
}, | ||
_ => unreachable!("lazy state wrong"), | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,10 @@ | ||
mod buf; | ||
mod exec; | ||
pub(crate) mod io; | ||
mod lazy; | ||
mod never; | ||
|
||
pub(crate) use self::buf::StaticBuf; | ||
pub(crate) use self::exec::Exec; | ||
pub(crate) use self::lazy::lazy; | ||
pub use self::never::Never; |
Oops, something went wrong.