diff --git a/crates/drainer/src/connection.rs b/crates/drainer/src/connection.rs index 74d2c20596..0f05a2d86f 100644 --- a/crates/drainer/src/connection.rs +++ b/crates/drainer/src/connection.rs @@ -5,10 +5,13 @@ use crate::settings::Database; pub type PgPool = bb8::Pool>; +#[allow(clippy::expect_used)] pub async fn redis_connection( conf: &crate::settings::Settings, ) -> redis_interface::RedisConnectionPool { - redis_interface::RedisConnectionPool::new(&conf.redis).await + redis_interface::RedisConnectionPool::new(&conf.redis) + .await + .expect("Failed to create Redis connection Pool") } #[allow(clippy::expect_used)] diff --git a/crates/redis_interface/src/commands.rs b/crates/redis_interface/src/commands.rs index 6308fa5a73..514f648026 100644 --- a/crates/redis_interface/src/commands.rs +++ b/crates/redis_interface/src/commands.rs @@ -589,7 +589,9 @@ mod tests { #[tokio::test] async fn test_consumer_group_create() { - let redis_conn = RedisConnectionPool::new(&RedisSettings::default()).await; + let redis_conn = RedisConnectionPool::new(&RedisSettings::default()) + .await + .unwrap(); let result1 = redis_conn .consumer_group_create("TEST1", "GTEST", &RedisEntryId::AutoGeneratedID) diff --git a/crates/redis_interface/src/errors.rs b/crates/redis_interface/src/errors.rs index c0bd00210a..0ae8f510f1 100644 --- a/crates/redis_interface/src/errors.rs +++ b/crates/redis_interface/src/errors.rs @@ -52,4 +52,6 @@ pub enum RedisError { NotFound, #[error("Invalid RedisEntryId provided")] InvalidRedisEntryId, + #[error("Failed to establish Redis connection")] + RedisConnectionError, } diff --git a/crates/redis_interface/src/lib.rs b/crates/redis_interface/src/lib.rs index 3a0c4164a1..abb6ef9679 100644 --- a/crates/redis_interface/src/lib.rs +++ b/crates/redis_interface/src/lib.rs @@ -21,6 +21,8 @@ pub mod commands; pub mod errors; pub mod types; +use common_utils::errors::CustomResult; +use error_stack::{IntoReport, ResultExt}; use router_env::logger; pub use self::{commands::*, types::*}; @@ -28,17 +30,12 @@ pub use self::{commands::*, types::*}; pub struct RedisConnectionPool { pub pool: fred::pool::RedisPool, config: RedisConfig, - _join_handles: Vec, + join_handles: Vec, } impl RedisConnectionPool { /// Create a new Redis connection - /// - /// # Panics - /// - /// Panics if a connection to Redis is not successful. - #[allow(clippy::expect_used)] - pub async fn new(conf: &RedisSettings) -> Self { + pub async fn new(conf: &RedisSettings) -> CustomResult { let redis_connection_url = match conf.cluster_enabled { // Fred relies on this format for specifying cluster where the host port is ignored & only query parameters are used for node addresses // redis-cluster://username:password@host:port?node=bar.com:30002&node=baz.com:30003 @@ -58,7 +55,9 @@ impl RedisConnectionPool { ), }; let mut config = fred::types::RedisConfig::from_url(&redis_connection_url) - .expect("Invalid Redis connection URL"); + .into_report() + .change_context(errors::RedisError::RedisConnectionError)?; + if !conf.use_legacy_version { config.version = fred::types::RespVersion::RESP3; } @@ -68,24 +67,27 @@ impl RedisConnectionPool { conf.reconnect_delay, ); let pool = fred::pool::RedisPool::new(config, conf.pool_size) - .expect("Unable to construct Redis pool"); + .into_report() + .change_context(errors::RedisError::RedisConnectionError)?; - let _join_handles = pool.connect(Some(policy)); + let join_handles = pool.connect(Some(policy)); pool.wait_for_connect() .await - .expect("Error connecting to Redis"); + .into_report() + .change_context(errors::RedisError::RedisConnectionError)?; + let config = RedisConfig::from(conf); - Self { + Ok(Self { pool, config, - _join_handles, - } + join_handles, + }) } pub async fn close_connections(&mut self) { self.pool.quit_pool().await; - for handle in self._join_handles.drain(..) { + for handle in self.join_handles.drain(..) { match handle.await { Ok(Ok(_)) => (), Ok(Err(error)) => logger::error!(%error), diff --git a/crates/router/src/connection.rs b/crates/router/src/connection.rs index 12d0bb72b9..25d38e107c 100644 --- a/crates/router/src/connection.rs +++ b/crates/router/src/connection.rs @@ -26,10 +26,13 @@ impl CustomizeConnection for TestTransaction { } } +#[allow(clippy::expect_used)] pub async fn redis_connection( conf: &crate::configs::settings::Settings, ) -> redis_interface::RedisConnectionPool { - redis_interface::RedisConnectionPool::new(&conf.redis).await + redis_interface::RedisConnectionPool::new(&conf.redis) + .await + .expect("Failed to create Redis Connection Pool") } #[allow(clippy::expect_used)]