From 982c27fce72074d2644c0a9f229b201b927c55da Mon Sep 17 00:00:00 2001 From: Nishant Joshi Date: Mon, 8 May 2023 14:31:49 +0530 Subject: [PATCH] fix(redis): fix recreation on redis connection pool (#1063) --- Cargo.lock | 10 +++++----- crates/redis_interface/src/lib.rs | 1 + crates/router/src/core/payment_methods/cards.rs | 3 +-- crates/router/src/core/payments.rs | 3 +-- crates/router/src/core/payments/helpers.rs | 4 ++-- crates/router/src/db.rs | 13 +++++++++++-- crates/router/src/services.rs | 10 ++++++++++ 7 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 46c98b30cc..82cc4015a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2950,7 +2950,7 @@ dependencies = [ [[package]] name = "opentelemetry" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "opentelemetry_api", "opentelemetry_sdk", @@ -2959,7 +2959,7 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" version = "0.11.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "async-trait", "futures", @@ -2976,7 +2976,7 @@ dependencies = [ [[package]] name = "opentelemetry-proto" version = "0.1.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "futures", "futures-util", @@ -2988,7 +2988,7 @@ dependencies = [ [[package]] name = "opentelemetry_api" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "fnv", "futures-channel", @@ -3003,7 +3003,7 @@ dependencies = [ [[package]] name = "opentelemetry_sdk" version = "0.18.0" -source = "git+https://github.com/open-telemetry/opentelemetry-rust/?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" +source = "git+https://github.com/open-telemetry/opentelemetry-rust?rev=44b90202fd744598db8b0ace5b8f0bad7ec45658#44b90202fd744598db8b0ace5b8f0bad7ec45658" dependencies = [ "async-trait", "crossbeam-channel", diff --git a/crates/redis_interface/src/lib.rs b/crates/redis_interface/src/lib.rs index 3a4ffdebc5..5a4789385b 100644 --- a/crates/redis_interface/src/lib.rs +++ b/crates/redis_interface/src/lib.rs @@ -156,6 +156,7 @@ impl RedisConnectionPool { } impl Drop for RedisConnectionPool { + // safety: panics when invoked without a current tokio runtime fn drop(&mut self) { let rt = tokio::runtime::Handle::current(); rt.block_on(self.close_connections()) diff --git a/crates/router/src/core/payment_methods/cards.rs b/crates/router/src/core/payment_methods/cards.rs index 835f076fb9..a662145b47 100644 --- a/crates/router/src/core/payment_methods/cards.rs +++ b/crates/router/src/core/payment_methods/cards.rs @@ -23,7 +23,6 @@ use storage_models::{enums as storage_enums, payment_method}; use crate::scheduler::metrics as scheduler_metrics; use crate::{ configs::settings, - connection, core::{ errors::{self, StorageErrorExt}, payment_methods::{ @@ -1531,7 +1530,7 @@ pub async fn list_customer_payment_method( }; customer_pms.push(pma.to_owned()); - let redis_conn = connection::redis_connection(&state.conf).await; + let redis_conn = state.store.get_redis_conn(); let key_for_hyperswitch_token = format!( "pm_token_{}_{}_hyperswitch", parent_payment_method_token, pma.payment_method diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index db71a3cca1..6c41f0ce10 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -24,7 +24,6 @@ use self::{ operations::{payment_complete_authorize, BoxedOperation, Operation}, }; use crate::{ - connection, core::{ errors::{self, CustomResult, RouterResponse, RouterResult}, payment_methods::vault, @@ -672,7 +671,7 @@ async fn decide_payment_method_tokenize_action( } } Some(token) => { - let redis_conn = connection::redis_connection(&state.conf).await; + let redis_conn = state.store.get_redis_conn(); let key = format!( "pm_token_{}_{}_{}", token.to_owned(), diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs index 365c804f07..536b29387a 100644 --- a/crates/router/src/core/payments/helpers.rs +++ b/crates/router/src/core/payments/helpers.rs @@ -19,7 +19,7 @@ use super::{ }; use crate::{ configs::settings::Server, - connection, consts, + consts, core::{ errors::{self, CustomResult, RouterResult, StorageErrorExt}, payment_methods::{cards, vault}, @@ -691,7 +691,7 @@ pub async fn make_pm_data<'a, F: Clone, R>( let request = &payment_data.payment_method_data; let token = payment_data.token.clone(); let hyperswitch_token = if let Some(token) = token { - let redis_conn = connection::redis_connection(&state.conf).await; + let redis_conn = state.store.get_redis_conn(); let key = format!( "pm_token_{}_{}_hyperswitch", token, diff --git a/crates/router/src/db.rs b/crates/router/src/db.rs index a8dadd2ab8..6b017b99eb 100644 --- a/crates/router/src/db.rs +++ b/crates/router/src/db.rs @@ -25,7 +25,10 @@ use std::sync::Arc; use futures::lock::Mutex; -use crate::{services::Store, types::storage}; +use crate::{ + services::{self, Store}, + types::storage, +}; #[derive(PartialEq, Eq)] pub enum StorageImpl { @@ -61,10 +64,10 @@ pub trait StorageInterface: + refund::RefundInterface + reverse_lookup::ReverseLookupInterface + cards_info::CardsInfoInterface + + services::RedisConnInterface + 'static { } - #[async_trait::async_trait] impl StorageInterface for Store {} @@ -117,4 +120,10 @@ where .change_context(redis_interface::errors::RedisError::JsonDeserializationFailed) } +impl services::RedisConnInterface for MockDb { + fn get_redis_conn(&self) -> Arc { + self.redis.clone() + } +} + dyn_clone::clone_trait_object!(StorageInterface); diff --git a/crates/router/src/services.rs b/crates/router/src/services.rs index 5540115659..8fec99a18f 100644 --- a/crates/router/src/services.rs +++ b/crates/router/src/services.rs @@ -78,6 +78,10 @@ impl PubSubInterface for redis_interface::RedisConnectionPool { } } +pub trait RedisConnInterface { + fn get_redis_conn(&self) -> Arc; +} + #[derive(Clone)] pub struct Store { pub master_pool: PgPool, @@ -185,3 +189,9 @@ impl Store { .change_context(crate::core::errors::StorageError::KVError) } } + +impl RedisConnInterface for Store { + fn get_redis_conn(&self) -> Arc { + self.redis_conn.clone() + } +}