fix: throw bad request while pushing duplicate data to redis (#3016)

This commit is contained in:
Kartikeya Hegde
2023-12-06 11:26:25 +05:30
committed by GitHub
parent c6e2ee29d9
commit a2405e56fb
9 changed files with 63 additions and 12 deletions

View File

@ -480,3 +480,25 @@ impl<T> ConnectorErrorExt<T> for error_stack::Result<T, errors::ConnectorError>
}
}
}
pub trait RedisErrorExt {
#[track_caller]
fn to_redis_failed_response(self, key: &str) -> error_stack::Report<errors::StorageError>;
}
impl RedisErrorExt for error_stack::Report<errors::RedisError> {
fn to_redis_failed_response(self, key: &str) -> error_stack::Report<errors::StorageError> {
match self.current_context() {
errors::RedisError::NotFound => self.change_context(
errors::StorageError::ValueNotFound(format!("Data does not exist for key {key}",)),
),
errors::RedisError::SetNxFailed => {
self.change_context(errors::StorageError::DuplicateValue {
entity: "redis",
key: Some(key.to_string()),
})
}
_ => self.change_context(errors::StorageError::KVError),
}
}
}

View File

@ -275,7 +275,7 @@ mod storage {
use super::RefundInterface;
use crate::{
connection,
core::errors::{self, CustomResult},
core::errors::{self, utils::RedisErrorExt, CustomResult},
db::reverse_lookup::ReverseLookupInterface,
services::Store,
types::storage::{self as storage_types, enums, kv},
@ -437,7 +437,7 @@ mod storage {
&key,
)
.await
.change_context(errors::StorageError::KVError)?
.map_err(|err| err.to_redis_failed_response(&key))?
.try_into_hsetnx()
{
Ok(HsetnxReply::KeyNotSet) => Err(errors::StorageError::DuplicateValue {
@ -544,7 +544,7 @@ mod storage {
&key,
)
.await
.change_context(errors::StorageError::KVError)?
.map_err(|err| err.to_redis_failed_response(&key))?
.try_into_hset()
.change_context(errors::StorageError::KVError)?;

View File

@ -69,6 +69,7 @@ mod storage {
use super::{ReverseLookupInterface, Store};
use crate::{
connection,
core::errors::utils::RedisErrorExt,
errors::{self, CustomResult},
types::storage::{
enums, kv,
@ -109,7 +110,7 @@ mod storage {
format!("reverse_lookup_{}", &created_rev_lookup.lookup_id),
)
.await
.change_context(errors::StorageError::KVError)?
.map_err(|err| err.to_redis_failed_response(&created_rev_lookup.lookup_id))?
.try_into_setnx()
{
Ok(SetnxReply::KeySet) => Ok(created_rev_lookup),

View File

@ -1,4 +1,7 @@
use crate::{core::errors, routes::metrics};
use crate::{
core::errors::{self, utils::RedisErrorExt},
routes::metrics,
};
/// Generates hscan field pattern. Suppose the field is pa_1234_ref_1211 it will generate
/// pa_1234_ref_*
@ -28,7 +31,8 @@ where
metrics::KV_MISS.add(&metrics::CONTEXT, 1, &[]);
database_call_closure().await
}
_ => Err(redis_error.change_context(errors::StorageError::KVError)),
// Keeping the key empty here since the error would never go here.
_ => Err(redis_error.to_redis_failed_response("")),
},
}
}