feat: cache reverse lookup fetches on redis (#719)

This commit is contained in:
Kartikeya Hegde
2023-03-08 13:08:51 +05:30
committed by GitHub
parent d36afbed7f
commit 1a27facaa7
4 changed files with 48 additions and 65 deletions

View File

@ -42,7 +42,6 @@ pub async fn redact_cache<T, F, Fut>(
fun: F,
) -> CustomResult<T, errors::StorageError>
where
T: serde::Serialize + serde::de::DeserializeOwned + std::fmt::Debug,
F: FnOnce() -> Fut + Send,
Fut: futures::Future<Output = CustomResult<T, errors::StorageError>> + Send,
{

View File

@ -535,11 +535,7 @@ mod storage {
enums::MerchantStorageScheme::RedisKv => {
// [#439]: get the attempt_id from payment_intent
let key = format!("{merchant_id}_{payment_id}");
let lookup = self
.get_lookup_by_lookup_id(&key)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&key).await?;
db_utils::try_redis_get_else_try_database_get(
self.redis_conn()
@ -580,11 +576,7 @@ mod storage {
enums::MerchantStorageScheme::RedisKv => {
// We assume that PaymentAttempt <=> PaymentIntent is a one-to-one relation for now
let lookup_id = format!("{merchant_id}_{connector_transaction_id}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
@ -641,11 +633,7 @@ mod storage {
enums::MerchantStorageScheme::RedisKv => {
let lookup_id = format!("{merchant_id}_{connector_txn_id}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
@ -677,11 +665,7 @@ mod storage {
enums::MerchantStorageScheme::RedisKv => {
let lookup_id = format!("{merchant_id}_{attempt_id}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
self.redis_conn()

View File

@ -261,11 +261,7 @@ mod storage {
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
enums::MerchantStorageScheme::RedisKv => {
let lookup_id = format!("{merchant_id}_{internal_reference_id}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
@ -461,11 +457,7 @@ mod storage {
let updated_refund = refund.clone().apply_changeset(this.clone());
// Check for database presence as well Maybe use a read replica here ?
let lookup = self
.get_lookup_by_lookup_id(&key)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&key).await?;
let field = &lookup.sk_id;
@ -519,11 +511,7 @@ mod storage {
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
enums::MerchantStorageScheme::RedisKv => {
let lookup_id = format!("{merchant_id}_{refund_id}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
@ -560,11 +548,7 @@ mod storage {
enums::MerchantStorageScheme::PostgresOnly => database_call().await,
enums::MerchantStorageScheme::RedisKv => {
let lookup_id = format!("{merchant_id}_{connector_refund_id}_{connector}");
let lookup = self
.get_lookup_by_lookup_id(&lookup_id)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&lookup_id).await?;
let key = &lookup.pk_id;
db_utils::try_redis_get_else_try_database_get(
@ -609,11 +593,7 @@ mod storage {
}
enums::MerchantStorageScheme::RedisKv => {
let key = format!("{merchant_id}_{payment_id}");
let lookup = self
.get_lookup_by_lookup_id(&key)
.await
.map_err(Into::<errors::StorageError>::into)
.into_report()?;
let lookup = self.get_lookup_by_lookup_id(&key).await?;
let pattern = db_utils::generate_hscan_pattern_for_refund(&lookup.sk_id);

View File

@ -1,41 +1,61 @@
use error_stack::ResultExt;
use storage_models::{errors, StorageResult};
use error_stack::IntoReport;
use super::{MockDb, Store};
use super::{cache, MockDb, Store};
use crate::{
connection::pg_connection,
errors::{self, CustomResult},
types::storage::reverse_lookup::{ReverseLookup, ReverseLookupNew},
};
#[async_trait::async_trait]
pub trait ReverseLookupInterface {
async fn insert_reverse_lookup(&self, _new: ReverseLookupNew) -> StorageResult<ReverseLookup>;
async fn get_lookup_by_lookup_id(&self, _id: &str) -> StorageResult<ReverseLookup>;
async fn insert_reverse_lookup(
&self,
_new: ReverseLookupNew,
) -> CustomResult<ReverseLookup, errors::StorageError>;
async fn get_lookup_by_lookup_id(
&self,
_id: &str,
) -> CustomResult<ReverseLookup, errors::StorageError>;
}
#[async_trait::async_trait]
impl ReverseLookupInterface for Store {
async fn insert_reverse_lookup(&self, new: ReverseLookupNew) -> StorageResult<ReverseLookup> {
let conn = pg_connection(&self.master_pool)
.await
.change_context(errors::DatabaseError::DatabaseConnectionError)?;
new.insert(&conn).await
async fn insert_reverse_lookup(
&self,
new: ReverseLookupNew,
) -> CustomResult<ReverseLookup, errors::StorageError> {
let conn = pg_connection(&self.master_pool).await?;
new.insert(&conn).await.map_err(Into::into).into_report()
}
async fn get_lookup_by_lookup_id(&self, id: &str) -> StorageResult<ReverseLookup> {
let conn = pg_connection(&self.master_pool)
.await
.change_context(errors::DatabaseError::DatabaseConnectionError)?;
ReverseLookup::find_by_lookup_id(id, &conn).await
async fn get_lookup_by_lookup_id(
&self,
id: &str,
) -> CustomResult<ReverseLookup, errors::StorageError> {
let database_call = || async {
let conn = pg_connection(&self.master_pool).await?;
ReverseLookup::find_by_lookup_id(id, &conn)
.await
.map_err(Into::into)
.into_report()
};
cache::get_or_populate_cache(self, id, database_call).await
}
}
#[async_trait::async_trait]
impl ReverseLookupInterface for MockDb {
async fn insert_reverse_lookup(&self, _new: ReverseLookupNew) -> StorageResult<ReverseLookup> {
Err(errors::DatabaseError::NotFound.into())
async fn insert_reverse_lookup(
&self,
_new: ReverseLookupNew,
) -> CustomResult<ReverseLookup, errors::StorageError> {
Err(errors::StorageError::MockDbError.into())
}
async fn get_lookup_by_lookup_id(&self, _id: &str) -> StorageResult<ReverseLookup> {
Err(errors::DatabaseError::NotFound.into())
async fn get_lookup_by_lookup_id(
&self,
_id: &str,
) -> CustomResult<ReverseLookup, errors::StorageError> {
Err(errors::StorageError::MockDbError.into())
}
}