mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-11-04 05:59:48 +08:00
fix: make push to drainer generic and add application metrics for KV (#2563)
This commit is contained in:
@ -280,7 +280,7 @@ mod storage {
|
||||
use error_stack::{IntoReport, ResultExt};
|
||||
use redis_interface::HsetnxReply;
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_impl::redis::kv_store::{kv_wrapper, KvOperation, PartitionKey};
|
||||
use storage_impl::redis::kv_store::{kv_wrapper, KvOperation};
|
||||
|
||||
use super::AddressInterface;
|
||||
use crate::{
|
||||
@ -419,15 +419,6 @@ mod storage {
|
||||
let redis_value = serde_json::to_string(&updated_address)
|
||||
.into_report()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_types::Address>((&field, redis_value)),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Update {
|
||||
@ -440,15 +431,19 @@ mod storage {
|
||||
},
|
||||
};
|
||||
|
||||
self.push_to_drainer_stream::<storage_types::Address>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id: &updated_address.merchant_id,
|
||||
payment_id: &payment_id,
|
||||
},
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_types::Address>(
|
||||
(&field, redis_value),
|
||||
redis_entry,
|
||||
),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
updated_address
|
||||
.convert(key_store.key.get_inner())
|
||||
.await
|
||||
@ -510,9 +505,19 @@ mod storage {
|
||||
payment_id: address_new.payment_id.clone(),
|
||||
};
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::Address(Box::new(address_new)),
|
||||
},
|
||||
};
|
||||
|
||||
match kv_wrapper::<diesel_models::Address, _, _>(
|
||||
self,
|
||||
KvOperation::HSetNx(&field, &created_address),
|
||||
KvOperation::HSetNx::<diesel_models::Address>(
|
||||
&field,
|
||||
&created_address,
|
||||
redis_entry,
|
||||
),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
@ -521,30 +526,13 @@ mod storage {
|
||||
{
|
||||
Ok(HsetnxReply::KeyNotSet) => Err(errors::StorageError::DuplicateValue {
|
||||
entity: "address",
|
||||
key: Some(address_new.address_id),
|
||||
key: Some(created_address.address_id),
|
||||
})
|
||||
.into_report(),
|
||||
Ok(HsetnxReply::KeySet) => {
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::Address(Box::new(address_new)),
|
||||
},
|
||||
};
|
||||
self.push_to_drainer_stream::<diesel_models::Address>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id: &merchant_id,
|
||||
payment_id,
|
||||
},
|
||||
)
|
||||
Ok(HsetnxReply::KeySet) => Ok(created_address
|
||||
.convert(key_store.key.get_inner())
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(created_address
|
||||
.convert(key_store.key.get_inner())
|
||||
.await
|
||||
.change_context(errors::StorageError::DecryptionError)?)
|
||||
}
|
||||
.change_context(errors::StorageError::DecryptionError)?),
|
||||
Err(er) => Err(er).change_context(errors::StorageError::KVError),
|
||||
}
|
||||
}
|
||||
|
||||
@ -100,7 +100,7 @@ mod storage {
|
||||
use error_stack::{IntoReport, ResultExt};
|
||||
use redis_interface::HsetnxReply;
|
||||
use router_env::{instrument, tracing};
|
||||
use storage_impl::redis::kv_store::{kv_wrapper, KvOperation, PartitionKey};
|
||||
use storage_impl::redis::kv_store::{kv_wrapper, KvOperation};
|
||||
|
||||
use super::Store;
|
||||
use crate::{
|
||||
@ -149,9 +149,17 @@ mod storage {
|
||||
encoded_data: connector_response.encoded_data.clone(),
|
||||
};
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::ConnectorResponse(
|
||||
connector_response.clone(),
|
||||
),
|
||||
},
|
||||
};
|
||||
|
||||
match kv_wrapper::<storage_type::ConnectorResponse, _, _>(
|
||||
self,
|
||||
KvOperation::HSetNx(&field, &created_connector_resp),
|
||||
KvOperation::HSetNx(&field, &created_connector_resp, redis_entry),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
@ -163,25 +171,7 @@ mod storage {
|
||||
key: Some(key),
|
||||
})
|
||||
.into_report(),
|
||||
Ok(HsetnxReply::KeySet) => {
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::ConnectorResponse(
|
||||
connector_response.clone(),
|
||||
),
|
||||
},
|
||||
};
|
||||
self.push_to_drainer_stream::<diesel_models::ConnectorResponse>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id,
|
||||
payment_id,
|
||||
},
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
Ok(created_connector_resp)
|
||||
}
|
||||
Ok(HsetnxReply::KeySet) => Ok(created_connector_resp),
|
||||
Err(er) => Err(er).change_context(errors::StorageError::KVError),
|
||||
}
|
||||
}
|
||||
@ -259,16 +249,6 @@ mod storage {
|
||||
&updated_connector_response.attempt_id
|
||||
);
|
||||
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_type::ConnectorResponse>((&field, redis_value)),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Update {
|
||||
updatable: kv::Updateable::ConnectorResponseUpdate(
|
||||
@ -280,15 +260,19 @@ mod storage {
|
||||
},
|
||||
};
|
||||
|
||||
self.push_to_drainer_stream::<storage_type::ConnectorResponse>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id: &updated_connector_response.merchant_id,
|
||||
payment_id: &updated_connector_response.payment_id,
|
||||
},
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_type::ConnectorResponse>(
|
||||
(&field, redis_value),
|
||||
redis_entry,
|
||||
),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(updated_connector_response)
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ mod storage {
|
||||
logger,
|
||||
services::Store,
|
||||
types::storage::{self as storage_types, enums, kv},
|
||||
utils::{self, db_utils, storage_partitioning::PartitionKey},
|
||||
utils::{self, db_utils},
|
||||
};
|
||||
#[async_trait::async_trait]
|
||||
impl RefundInterface for Store {
|
||||
@ -373,9 +373,20 @@ mod storage {
|
||||
"pa_{}_ref_{}",
|
||||
&created_refund.attempt_id, &created_refund.refund_id
|
||||
);
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::Refund(new),
|
||||
},
|
||||
};
|
||||
|
||||
match kv_wrapper::<storage_types::Refund, _, _>(
|
||||
self,
|
||||
KvOperation::HSetNx(&field, &created_refund),
|
||||
KvOperation::<storage_types::Refund>::HSetNx(
|
||||
&field,
|
||||
&created_refund,
|
||||
redis_entry,
|
||||
),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
@ -431,21 +442,6 @@ mod storage {
|
||||
|
||||
futures::future::try_join_all(rev_look).await?;
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::Refund(new),
|
||||
},
|
||||
};
|
||||
self.push_to_drainer_stream::<storage_types::Refund>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id: &created_refund.merchant_id,
|
||||
payment_id: &created_refund.payment_id,
|
||||
},
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(created_refund)
|
||||
}
|
||||
Err(er) => Err(er).change_context(errors::StorageError::KVError),
|
||||
@ -531,16 +527,6 @@ mod storage {
|
||||
)
|
||||
.change_context(errors::StorageError::SerializationFailed)?;
|
||||
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_types::Refund>((&field, redis_value)),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Update {
|
||||
updatable: kv::Updateable::RefundUpdate(kv::RefundUpdateMems {
|
||||
@ -549,15 +535,20 @@ mod storage {
|
||||
}),
|
||||
},
|
||||
};
|
||||
self.push_to_drainer_stream::<storage_types::Refund>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentId {
|
||||
merchant_id: &updated_refund.merchant_id,
|
||||
payment_id: &updated_refund.payment_id,
|
||||
},
|
||||
|
||||
kv_wrapper::<(), _, _>(
|
||||
self,
|
||||
KvOperation::Hset::<storage_types::Refund>(
|
||||
(&field, redis_value),
|
||||
redis_entry,
|
||||
),
|
||||
&key,
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_hset()
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(updated_refund)
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,7 +74,7 @@ mod storage {
|
||||
enums, kv,
|
||||
reverse_lookup::{ReverseLookup, ReverseLookupNew},
|
||||
},
|
||||
utils::{db_utils, storage_partitioning::PartitionKey},
|
||||
utils::db_utils,
|
||||
};
|
||||
|
||||
#[async_trait::async_trait]
|
||||
@ -96,31 +96,22 @@ mod storage {
|
||||
pk_id: new.pk_id.clone(),
|
||||
source: new.source.clone(),
|
||||
};
|
||||
let combination = &created_rev_lookup.pk_id;
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::ReverseLookUp(new),
|
||||
},
|
||||
};
|
||||
|
||||
match kv_wrapper::<ReverseLookup, _, _>(
|
||||
self,
|
||||
KvOperation::SetNx(&created_rev_lookup),
|
||||
KvOperation::SetNx(&created_rev_lookup, redis_entry),
|
||||
format!("reverse_lookup_{}", &created_rev_lookup.lookup_id),
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?
|
||||
.try_into_setnx()
|
||||
{
|
||||
Ok(SetnxReply::KeySet) => {
|
||||
let redis_entry = kv::TypedSql {
|
||||
op: kv::DBOperation::Insert {
|
||||
insertable: kv::Insertable::ReverseLookUp(new),
|
||||
},
|
||||
};
|
||||
self.push_to_drainer_stream::<ReverseLookup>(
|
||||
redis_entry,
|
||||
PartitionKey::MerchantIdPaymentIdCombination { combination },
|
||||
)
|
||||
.await
|
||||
.change_context(errors::StorageError::KVError)?;
|
||||
|
||||
Ok(created_rev_lookup)
|
||||
}
|
||||
Ok(SetnxReply::KeySet) => Ok(created_rev_lookup),
|
||||
Ok(SetnxReply::KeyNotSet) => Err(errors::StorageError::DuplicateValue {
|
||||
entity: "reverse_lookup",
|
||||
key: Some(created_rev_lookup.lookup_id.clone()),
|
||||
|
||||
Reference in New Issue
Block a user