mirror of https://github.com/rwf2/Rocket.git
parent
1edfa15d52
commit
5723f127c1
|
@ -195,7 +195,11 @@ impl<K, C: Poolable> Drop for Connection<K, C> {
|
||||||
impl<K, C: Poolable> Drop for ConnectionPool<K, C> {
|
impl<K, C: Poolable> Drop for ConnectionPool<K, C> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
let pool = self.pool.take();
|
let pool = self.pool.take();
|
||||||
tokio::task::spawn_blocking(move || drop(pool));
|
// Only use spawn_blocking if the Tokio runtime is still available
|
||||||
|
if let Ok(handle) = tokio::runtime::Handle::try_current() {
|
||||||
|
handle.spawn_blocking(move || drop(pool));
|
||||||
|
}
|
||||||
|
// Otherwise the pool will be dropped on the current thread
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#[cfg(all(feature = "diesel_sqlite_pool"))]
|
||||||
|
#[cfg(test)]
|
||||||
|
mod sqlite_shutdown_test {
|
||||||
|
use rocket::{async_test, Build, Rocket};
|
||||||
|
use rocket_sync_db_pools::database;
|
||||||
|
|
||||||
|
#[database("test")]
|
||||||
|
struct Pool(diesel::SqliteConnection);
|
||||||
|
|
||||||
|
async fn rocket() -> Rocket<Build> {
|
||||||
|
use rocket::figment::{util::map, Figment};
|
||||||
|
|
||||||
|
let options = map!["url" => ":memory:"];
|
||||||
|
let config = Figment::from(rocket::Config::debug_default())
|
||||||
|
.merge(("databases", map!["test" => &options]));
|
||||||
|
|
||||||
|
rocket::custom(config).attach(Pool::fairing())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_shutdown() {
|
||||||
|
let _rocket = async_test(
|
||||||
|
async {
|
||||||
|
let rocket = rocket().await.ignite().await.expect("unable to ignite");
|
||||||
|
// request shutdown
|
||||||
|
rocket.shutdown().notify();
|
||||||
|
rocket.launch().await.expect("unable to launch")
|
||||||
|
}
|
||||||
|
);
|
||||||
|
// _rocket is dropped here after the runtime is dropped
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue