mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-11-01 02:57:02 +08:00 
			
		
		
		
	fix: invalidation of in-memory cache (#1270)
This commit is contained in:
		| @ -57,14 +57,10 @@ impl<'a> TryFrom<RedisValue> for CacheKind<'a> { | |||||||
|             message: "Invalid publish key provided in pubsub".into(), |             message: "Invalid publish key provided in pubsub".into(), | ||||||
|         }; |         }; | ||||||
|         let kind = kind.as_string().ok_or(validation_err.clone())?; |         let kind = kind.as_string().ok_or(validation_err.clone())?; | ||||||
|         let mut split = kind.split(','); |         let split = kind.split_once(',').ok_or(validation_err.clone())?; | ||||||
|         match split.next().ok_or(validation_err.clone())? { |         match split.0 { | ||||||
|             ACCOUNTS_CACHE_PREFIX => Ok(Self::Accounts(Cow::Owned( |             ACCOUNTS_CACHE_PREFIX => Ok(Self::Accounts(Cow::Owned(split.1.to_string()))), | ||||||
|                 split.next().ok_or(validation_err)?.to_string(), |             CONFIG_CACHE_PREFIX => Ok(Self::Config(Cow::Owned(split.1.to_string()))), | ||||||
|             ))), |  | ||||||
|             CONFIG_CACHE_PREFIX => Ok(Self::Config(Cow::Owned( |  | ||||||
|                 split.next().ok_or(validation_err)?.to_string(), |  | ||||||
|             ))), |  | ||||||
|             _ => Err(validation_err.into()), |             _ => Err(validation_err.into()), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -136,7 +136,12 @@ impl MerchantAccountInterface for Store { | |||||||
|  |  | ||||||
|         #[cfg(feature = "accounts_cache")] |         #[cfg(feature = "accounts_cache")] | ||||||
|         { |         { | ||||||
|             super::cache::redact_cache(self, merchant_id, update_func, None).await |             super::cache::publish_and_redact( | ||||||
|  |                 self, | ||||||
|  |                 cache::CacheKind::Accounts(merchant_id.into()), | ||||||
|  |                 update_func, | ||||||
|  |             ) | ||||||
|  |             .await | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -170,7 +175,12 @@ impl MerchantAccountInterface for Store { | |||||||
|  |  | ||||||
|         #[cfg(feature = "accounts_cache")] |         #[cfg(feature = "accounts_cache")] | ||||||
|         { |         { | ||||||
|             super::cache::redact_cache(self, merchant_id, delete_func, None).await |             super::cache::publish_and_redact( | ||||||
|  |                 self, | ||||||
|  |                 cache::CacheKind::Accounts(merchant_id.into()), | ||||||
|  |                 delete_func, | ||||||
|  |             ) | ||||||
|  |             .await | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -64,21 +64,38 @@ impl PubSubInterface for redis_interface::RedisConnectionPool { | |||||||
|  |  | ||||||
|     #[inline] |     #[inline] | ||||||
|     async fn on_message(&self) -> errors::CustomResult<(), redis_errors::RedisError> { |     async fn on_message(&self) -> errors::CustomResult<(), redis_errors::RedisError> { | ||||||
|  |         logger::debug!("Started on message"); | ||||||
|         let mut rx = self.subscriber.on_message(); |         let mut rx = self.subscriber.on_message(); | ||||||
|         while let Ok(message) = rx.recv().await { |         while let Ok(message) = rx.recv().await { | ||||||
|             let key: CacheKind<'_> = RedisValue::new(message.value) |             logger::debug!("Invalidating {message:?}"); | ||||||
|  |             let key: CacheKind<'_> = match RedisValue::new(message.value) | ||||||
|                 .try_into() |                 .try_into() | ||||||
|                 .change_context(redis_errors::RedisError::OnMessageError)?; |                 .change_context(redis_errors::RedisError::OnMessageError) | ||||||
|             match key { |             { | ||||||
|  |                 Ok(value) => value, | ||||||
|  |                 Err(err) => { | ||||||
|  |                     logger::error!(value_conversion_err=?err); | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             let key = match key { | ||||||
|                 CacheKind::Config(key) => { |                 CacheKind::Config(key) => { | ||||||
|                     self.delete_key(key.as_ref()).await?; |  | ||||||
|                     CONFIG_CACHE.invalidate(key.as_ref()).await; |                     CONFIG_CACHE.invalidate(key.as_ref()).await; | ||||||
|  |                     key | ||||||
|                 } |                 } | ||||||
|                 CacheKind::Accounts(key) => { |                 CacheKind::Accounts(key) => { | ||||||
|                     self.delete_key(key.as_ref()).await?; |  | ||||||
|                     ACCOUNTS_CACHE.invalidate(key.as_ref()).await; |                     ACCOUNTS_CACHE.invalidate(key.as_ref()).await; | ||||||
|  |                     key | ||||||
|                 } |                 } | ||||||
|             } |             }; | ||||||
|  |  | ||||||
|  |             self.delete_key(key.as_ref()) | ||||||
|  |                 .await | ||||||
|  |                 .map_err(|err| logger::error!("Error while deleting redis key: {err:?}")) | ||||||
|  |                 .ok(); | ||||||
|  |  | ||||||
|  |             logger::debug!("Done invalidating {key}"); | ||||||
|         } |         } | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| @ -116,7 +133,10 @@ impl Store { | |||||||
|  |  | ||||||
|         let subscriber_conn = redis_conn.clone(); |         let subscriber_conn = redis_conn.clone(); | ||||||
|  |  | ||||||
|         redis_conn.subscribe(consts::PUB_SUB_CHANNEL).await.ok(); |         if let Err(e) = redis_conn.subscribe(consts::PUB_SUB_CHANNEL).await { | ||||||
|  |             logger::error!(subscribe_err=?e); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         async_spawn!({ |         async_spawn!({ | ||||||
|             if let Err(e) = subscriber_conn.on_message().await { |             if let Err(e) = subscriber_conn.on_message().await { | ||||||
|                 logger::error!(pubsub_err=?e); |                 logger::error!(pubsub_err=?e); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Kartikeya Hegde
					Kartikeya Hegde