diff --git a/Cargo.lock b/Cargo.lock index 3ccca54f7..909893932 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1217,6 +1217,9 @@ name = "deadpool-runtime" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1" +dependencies = [ + "tokio", +] [[package]] name = "derive_builder" @@ -2491,6 +2494,7 @@ dependencies = [ "async-trait", "bcrypt", "chrono", + "deadpool", "diesel", "diesel-async", "diesel-derive-newtype", diff --git a/crates/db_schema/Cargo.toml b/crates/db_schema/Cargo.toml index 0983aa37c..c21467ebc 100644 --- a/crates/db_schema/Cargo.toml +++ b/crates/db_schema/Cargo.toml @@ -16,7 +16,7 @@ doctest = false [features] full = ["diesel", "diesel-derive-newtype", "diesel_migrations", "bcrypt", "lemmy_utils", "activitypub_federation", "sha2", "regex", "once_cell", "serde_json", "diesel_ltree", - "diesel-async"] + "diesel-async", "deadpool"] [dependencies] chrono = { workspace = true } @@ -41,6 +41,7 @@ async-trait = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } tracing-error = { workspace = true } +deadpool = { version = "0.9.5", features = ["rt_tokio_1"], optional = true } [dev-dependencies] serial_test = { workspace = true } diff --git a/crates/db_schema/src/utils.rs b/crates/db_schema/src/utils.rs index 9e3a3f418..c05cd565d 100644 --- a/crates/db_schema/src/utils.rs +++ b/crates/db_schema/src/utils.rs @@ -7,6 +7,7 @@ use crate::{ }; use activitypub_federation::{core::object_id::ObjectId, traits::ApubObject}; use chrono::NaiveDateTime; +use deadpool::Runtime; use diesel::{ backend::Backend, deserialize::FromSql, @@ -27,12 +28,13 @@ use diesel_migrations::EmbeddedMigrations; use lemmy_utils::{error::LemmyError, settings::structs::Settings}; use once_cell::sync::Lazy; use regex::Regex; -use std::{env, env::VarError}; +use std::{env, env::VarError, time::Duration}; use tracing::info; use url::Url; const FETCH_LIMIT_DEFAULT: i64 = 10; pub const FETCH_LIMIT_MAX: i64 = 50; +const POOL_TIMEOUT: Option = Some(Duration::from_secs(5)); pub type DbPool = Pool; @@ -135,7 +137,13 @@ async fn build_db_pool_settings_opt(settings: Option<&Settings>) -> Result::new(&db_url); - let pool = Pool::builder(manager).max_size(pool_size).build()?; + let pool = Pool::builder(manager) + .max_size(pool_size) + .wait_timeout(POOL_TIMEOUT) + .create_timeout(POOL_TIMEOUT) + .recycle_timeout(POOL_TIMEOUT) + .runtime(Runtime::Tokio1) + .build()?; // If there's no settings, that means its a unit test, and migrations need to be run if settings.is_none() {