mirror of
https://github.com/rwf2/Rocket.git
synced 2025-02-16 13:42:05 +00:00
Use 'tokio_executor::blocking' when acquiring connections from synchronous database pools to avoid tying up the executor.
This commit is contained in:
parent
adf7e4233a
commit
0ab787e216
@ -73,6 +73,7 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
|
|||||||
let databases = quote_spanned!(span => ::rocket_contrib::databases);
|
let databases = quote_spanned!(span => ::rocket_contrib::databases);
|
||||||
let Poolable = quote_spanned!(span => #databases::Poolable);
|
let Poolable = quote_spanned!(span => #databases::Poolable);
|
||||||
let r2d2 = quote_spanned!(span => #databases::r2d2);
|
let r2d2 = quote_spanned!(span => #databases::r2d2);
|
||||||
|
let tokio_executor = quote_spanned!(span => #databases::tokio_executor);
|
||||||
let request = quote!(::rocket::request);
|
let request = quote!(::rocket::request);
|
||||||
|
|
||||||
let generated_types = quote_spanned! { span =>
|
let generated_types = quote_spanned! { span =>
|
||||||
@ -140,17 +141,21 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'r> #request::FromRequest<'a, 'r> for #guard_type {
|
impl<'a, 'r> #request::FromRequestAsync<'a, 'r> for #guard_type {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn from_request(request: &'a #request::Request<'r>) -> #request::Outcome<Self, ()> {
|
fn from_request<'fut>(request: &'a #request::Request<'r>) -> #request::FromRequestFuture<'fut, Self, Self::Error> where 'a: 'fut {
|
||||||
use ::rocket::{Outcome, http::Status};
|
use ::rocket::{Outcome, http::Status};
|
||||||
let pool = ::rocket::try_outcome!(request.guard::<::rocket::State<#pool_type>>());
|
Box::pin(async move {
|
||||||
|
let pool = ::rocket::try_outcome!(request.guard::<::rocket::State<'_, #pool_type>>()).0.clone();
|
||||||
|
|
||||||
match pool.0.get() {
|
#tokio_executor::blocking::run(move || {
|
||||||
Ok(conn) => Outcome::Success(#guard_type(conn)),
|
match pool.get() {
|
||||||
Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),
|
Ok(conn) => Outcome::Success(#guard_type(conn)),
|
||||||
}
|
Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),
|
||||||
|
}
|
||||||
|
}).await
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.into())
|
}.into())
|
||||||
|
@ -14,7 +14,7 @@ edition = "2018"
|
|||||||
[features]
|
[features]
|
||||||
# Internal use only.
|
# Internal use only.
|
||||||
templates = ["serde", "serde_json", "glob", "notify"]
|
templates = ["serde", "serde_json", "glob", "notify"]
|
||||||
databases = ["r2d2", "rocket_contrib_codegen/database_attribute"]
|
databases = ["r2d2", "tokio-executor", "rocket_contrib_codegen/database_attribute"]
|
||||||
|
|
||||||
# User-facing features.
|
# User-facing features.
|
||||||
default = ["json", "serve"]
|
default = ["json", "serve"]
|
||||||
@ -66,6 +66,7 @@ uuid = { version = ">=0.7.0, <0.9.0", optional = true }
|
|||||||
diesel = { version = "1.0", default-features = false, optional = true }
|
diesel = { version = "1.0", default-features = false, optional = true }
|
||||||
postgres = { version = "0.17", optional = true }
|
postgres = { version = "0.17", optional = true }
|
||||||
r2d2 = { version = "0.8", optional = true }
|
r2d2 = { version = "0.8", optional = true }
|
||||||
|
tokio-executor = { version = "0.2.0-alpha.6", optional = true }
|
||||||
r2d2_postgres = { version = "0.16", optional = true }
|
r2d2_postgres = { version = "0.16", optional = true }
|
||||||
mysql = { version = "17.0", optional = true }
|
mysql = { version = "17.0", optional = true }
|
||||||
r2d2_mysql = { version = "17.0", optional = true }
|
r2d2_mysql = { version = "17.0", optional = true }
|
||||||
|
@ -397,6 +397,9 @@
|
|||||||
|
|
||||||
pub extern crate r2d2;
|
pub extern crate r2d2;
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub extern crate tokio_executor;
|
||||||
|
|
||||||
#[cfg(any(feature = "diesel_sqlite_pool",
|
#[cfg(any(feature = "diesel_sqlite_pool",
|
||||||
feature = "diesel_postgres_pool",
|
feature = "diesel_postgres_pool",
|
||||||
feature = "diesel_mysql_pool"))]
|
feature = "diesel_mysql_pool"))]
|
||||||
|
Loading…
Reference in New Issue
Block a user