Skip to content

Commit 13273fe

Browse files
jebrosenSergioBenitez
authored andcommitted
Use 'tokio_executor::blocking' when acquiring connections from synchronous database pools to avoid tying up the executor.
1 parent f3db866 commit 13273fe

File tree

3 files changed

+18
-9
lines changed

3 files changed

+18
-9
lines changed

contrib/codegen/src/database.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
7373
let databases = quote_spanned!(span => ::rocket_contrib::databases);
7474
let Poolable = quote_spanned!(span => #databases::Poolable);
7575
let r2d2 = quote_spanned!(span => #databases::r2d2);
76+
let tokio_executor = quote_spanned!(span => #databases::tokio_executor);
7677
let request = quote!(::rocket::request);
7778

7879
let generated_types = quote_spanned! { span =>
@@ -140,17 +141,21 @@ pub fn database_attr(attr: TokenStream, input: TokenStream) -> Result<TokenStrea
140141
}
141142
}
142143

143-
impl<'a, 'r> #request::FromRequest<'a, 'r> for #guard_type {
144+
impl<'a, 'r> #request::FromRequestAsync<'a, 'r> for #guard_type {
144145
type Error = ();
145146

146-
fn from_request(request: &'a #request::Request<'r>) -> #request::Outcome<Self, ()> {
147+
fn from_request<'fut>(request: &'a #request::Request<'r>) -> #request::FromRequestFuture<'fut, Self, Self::Error> where 'a: 'fut {
147148
use ::rocket::{Outcome, http::Status};
148-
let pool = ::rocket::try_outcome!(request.guard::<::rocket::State<#pool_type>>());
149-
150-
match pool.0.get() {
151-
Ok(conn) => Outcome::Success(#guard_type(conn)),
152-
Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),
153-
}
149+
Box::pin(async move {
150+
let pool = ::rocket::try_outcome!(request.guard::<::rocket::State<'_, #pool_type>>()).0.clone();
151+
152+
#tokio_executor::blocking::run(move || {
153+
match pool.get() {
154+
Ok(conn) => Outcome::Success(#guard_type(conn)),
155+
Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())),
156+
}
157+
}).await
158+
})
154159
}
155160
}
156161
}.into())

contrib/lib/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ edition = "2018"
1414
[features]
1515
# Internal use only.
1616
templates = ["serde", "serde_json", "glob"]
17-
databases = ["r2d2", "rocket_contrib_codegen/database_attribute"]
17+
databases = ["r2d2", "tokio-executor", "rocket_contrib_codegen/database_attribute"]
1818

1919
# User-facing features.
2020
default = ["json", "serve"]
@@ -66,6 +66,7 @@ uuid = { version = ">=0.7.0, <0.9.0", optional = true }
6666
diesel = { version = "1.0", default-features = false, optional = true }
6767
postgres = { version = "0.17", optional = true }
6868
r2d2 = { version = "0.8", optional = true }
69+
tokio-executor = { version = "0.2.0-alpha.6", optional = true }
6970
r2d2_postgres = { version = "0.16", optional = true }
7071
mysql = { version = "17.0", optional = true }
7172
r2d2_mysql = { version = "17.0", optional = true }

contrib/lib/src/databases.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,9 @@
398398
399399
pub extern crate r2d2;
400400

401+
#[doc(hidden)]
402+
pub extern crate tokio_executor;
403+
401404
#[cfg(any(feature = "diesel_sqlite_pool",
402405
feature = "diesel_postgres_pool",
403406
feature = "diesel_mysql_pool"))]

0 commit comments

Comments
 (0)