refactor(client): add comments about the checkout vs connect race
This commit is contained in:
@@ -281,11 +281,11 @@ where C: Connect + Sync + 'static,
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn send_request(&self, mut req: Request<B>, pool_key: PoolKey) -> impl Future<Item=Response<Body>, Error=ClientError<B>> {
|
fn send_request(&self, mut req: Request<B>, pool_key: PoolKey) -> impl Future<Item=Response<Body>, Error=ClientError<B>> {
|
||||||
let race = self.pool_checkout_or_connect(req.uri().clone(), pool_key);
|
let conn = self.connection_for(req.uri().clone(), pool_key);
|
||||||
|
|
||||||
let ver = self.ver;
|
let ver = self.ver;
|
||||||
let executor = self.executor.clone();
|
let executor = self.executor.clone();
|
||||||
race.and_then(move |mut pooled| {
|
conn.and_then(move |mut pooled| {
|
||||||
if ver == Ver::Http1 {
|
if ver == Ver::Http1 {
|
||||||
// CONNECT always sends origin-form, so check it first...
|
// CONNECT always sends origin-form, so check it first...
|
||||||
if req.method() == &Method::CONNECT {
|
if req.method() == &Method::CONNECT {
|
||||||
@@ -365,9 +365,22 @@ where C: Connect + Sync + 'static,
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pool_checkout_or_connect(&self, uri: Uri, pool_key: PoolKey)
|
fn connection_for(&self, uri: Uri, pool_key: PoolKey)
|
||||||
-> impl Future<Item=Pooled<PoolClient<B>>, Error=ClientError<B>>
|
-> impl Future<Item=Pooled<PoolClient<B>>, Error=ClientError<B>>
|
||||||
{
|
{
|
||||||
|
// This actually races 2 different futures to try to get a ready
|
||||||
|
// connection the fastest, and to reduce connection churn.
|
||||||
|
//
|
||||||
|
// - If the pool has an idle connection waiting, that's used
|
||||||
|
// immediately.
|
||||||
|
// - Otherwise, the Connector is asked to start connecting to
|
||||||
|
// the destination Uri.
|
||||||
|
// - Meanwhile, the pool Checkout is watching to see if any other
|
||||||
|
// request finishes and tries to insert an idle connection.
|
||||||
|
// - If a new connection is started, but the Checkout wins after
|
||||||
|
// (an idle connection becamse available first), the started
|
||||||
|
// connection future is spawned into the runtime to complete,
|
||||||
|
// and then be inserted into the pool as an idle connection.
|
||||||
let checkout = self.pool.checkout(pool_key.clone());
|
let checkout = self.pool.checkout(pool_key.clone());
|
||||||
let connect = self.connect_to(uri, pool_key);
|
let connect = self.connect_to(uri, pool_key);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user