mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 10:06:32 +08:00 
			
		
		
		
	refactor(access_token): handle network delays with expiry of access token (#4617)
This commit is contained in:
		| @ -118,6 +118,8 @@ pub const POLL_ID_TTL: i64 = 900; | |||||||
| pub const DEFAULT_POLL_DELAY_IN_SECS: i8 = 2; | pub const DEFAULT_POLL_DELAY_IN_SECS: i8 = 2; | ||||||
| pub const DEFAULT_POLL_FREQUENCY: i8 = 5; | pub const DEFAULT_POLL_FREQUENCY: i8 = 5; | ||||||
|  |  | ||||||
|  | // Number of seconds to subtract from access token expiry | ||||||
|  | pub(crate) const REDUCE_ACCESS_TOKEN_EXPIRY_TIME: u8 = 15; | ||||||
| pub const CONNECTOR_CREDS_TOKEN_TTL: i64 = 900; | pub const CONNECTOR_CREDS_TOKEN_TTL: i64 = 900; | ||||||
|  |  | ||||||
| //max_amount allowed is 999999999 in minor units | //max_amount allowed is 999999999 in minor units | ||||||
|  | |||||||
| @ -91,9 +91,26 @@ pub async fn add_access_token< | |||||||
|                     connector.connector_name, |                     connector.connector_name, | ||||||
|                     access_token.expires |                     access_token.expires | ||||||
|                 ); |                 ); | ||||||
|  |                 metrics::ACCESS_TOKEN_CACHE_HIT.add( | ||||||
|  |                     &metrics::CONTEXT, | ||||||
|  |                     1, | ||||||
|  |                     &[metrics::request::add_attributes( | ||||||
|  |                         "connector", | ||||||
|  |                         connector.connector_name.to_string(), | ||||||
|  |                     )], | ||||||
|  |                 ); | ||||||
|                 Ok(Some(access_token)) |                 Ok(Some(access_token)) | ||||||
|             } |             } | ||||||
|             None => { |             None => { | ||||||
|  |                 metrics::ACCESS_TOKEN_CACHE_MISS.add( | ||||||
|  |                     &metrics::CONTEXT, | ||||||
|  |                     1, | ||||||
|  |                     &[metrics::request::add_attributes( | ||||||
|  |                         "connector", | ||||||
|  |                         connector.connector_name.to_string(), | ||||||
|  |                     )], | ||||||
|  |                 ); | ||||||
|  |  | ||||||
|                 let cloned_router_data = router_data.clone(); |                 let cloned_router_data = router_data.clone(); | ||||||
|                 let refresh_token_request_data = types::AccessTokenRequestData::try_from( |                 let refresh_token_request_data = types::AccessTokenRequestData::try_from( | ||||||
|                     router_data.connector_auth_type.clone(), |                     router_data.connector_auth_type.clone(), | ||||||
| @ -123,15 +140,31 @@ pub async fn add_access_token< | |||||||
|                     &refresh_token_router_data, |                     &refresh_token_router_data, | ||||||
|                 ) |                 ) | ||||||
|                 .await? |                 .await? | ||||||
|                 .async_map(|access_token| async { |                 .async_map(|access_token| async move { | ||||||
|                     // Store the access token in redis with expiry |  | ||||||
|                     // The expiry should be adjusted for network delays from the connector |  | ||||||
|                     let store = &*state.store; |                     let store = &*state.store; | ||||||
|  |  | ||||||
|  |                     // The expiry should be adjusted for network delays from the connector | ||||||
|  |                     // The access token might not have been expired when request is sent | ||||||
|  |                     // But once it reaches the connector, it might expire because of the network delay | ||||||
|  |                     // Subtract few seconds from the expiry in order to account for these network delays | ||||||
|  |                     // This will reduce the expiry time by `REDUCE_ACCESS_TOKEN_EXPIRY_TIME` seconds | ||||||
|  |                     let modified_access_token_with_expiry = types::AccessToken { | ||||||
|  |                         expires: access_token | ||||||
|  |                             .expires | ||||||
|  |                             .saturating_sub(consts::REDUCE_ACCESS_TOKEN_EXPIRY_TIME.into()), | ||||||
|  |                         ..access_token | ||||||
|  |                     }; | ||||||
|  |  | ||||||
|  |                     logger::debug!( | ||||||
|  |                         access_token_expiry_after_modification = | ||||||
|  |                             modified_access_token_with_expiry.expires | ||||||
|  |                     ); | ||||||
|  |  | ||||||
|                     if let Err(access_token_set_error) = store |                     if let Err(access_token_set_error) = store | ||||||
|                         .set_access_token( |                         .set_access_token( | ||||||
|                             merchant_id, |                             merchant_id, | ||||||
|                             &merchant_connector_id_or_connector_name, |                             &merchant_connector_id_or_connector_name, | ||||||
|                             access_token.clone(), |                             modified_access_token_with_expiry.clone(), | ||||||
|                         ) |                         ) | ||||||
|                         .await |                         .await | ||||||
|                         .change_context(errors::ApiErrorResponse::InternalServerError) |                         .change_context(errors::ApiErrorResponse::InternalServerError) | ||||||
| @ -142,7 +175,7 @@ pub async fn add_access_token< | |||||||
|                         // The next request will create new access token, if required |                         // The next request will create new access token, if required | ||||||
|                         logger::error!(access_token_set_error=?access_token_set_error); |                         logger::error!(access_token_set_error=?access_token_set_error); | ||||||
|                     } |                     } | ||||||
|                     Some(access_token) |                     Some(modified_access_token_with_expiry) | ||||||
|                 }) |                 }) | ||||||
|                 .await |                 .await | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -52,7 +52,6 @@ counter_metric!(MCA_CREATE, GLOBAL_METER); | |||||||
|  |  | ||||||
| // Flow Specific Metrics | // Flow Specific Metrics | ||||||
|  |  | ||||||
| counter_metric!(ACCESS_TOKEN_CREATION, GLOBAL_METER); |  | ||||||
| histogram_metric!(CONNECTOR_REQUEST_TIME, GLOBAL_METER); | histogram_metric!(CONNECTOR_REQUEST_TIME, GLOBAL_METER); | ||||||
| counter_metric!(SESSION_TOKEN_CREATED, GLOBAL_METER); | counter_metric!(SESSION_TOKEN_CREATED, GLOBAL_METER); | ||||||
|  |  | ||||||
| @ -123,5 +122,16 @@ counter_metric!(TASKS_ADDED_COUNT, GLOBAL_METER); // Tasks added to process trac | |||||||
| counter_metric!(TASK_ADDITION_FAILURES_COUNT, GLOBAL_METER); // Failures in task addition to process tracker | counter_metric!(TASK_ADDITION_FAILURES_COUNT, GLOBAL_METER); // Failures in task addition to process tracker | ||||||
| counter_metric!(TASKS_RESET_COUNT, GLOBAL_METER); // Tasks reset in process tracker for requeue flow | counter_metric!(TASKS_RESET_COUNT, GLOBAL_METER); // Tasks reset in process tracker for requeue flow | ||||||
|  |  | ||||||
|  | // Access token metrics | ||||||
|  | // | ||||||
|  | // A counter to indicate the number of new access tokens created | ||||||
|  | counter_metric!(ACCESS_TOKEN_CREATION, GLOBAL_METER); | ||||||
|  |  | ||||||
|  | // A counter to indicate the access token cache hits | ||||||
|  | counter_metric!(ACCESS_TOKEN_CACHE_HIT, GLOBAL_METER); | ||||||
|  |  | ||||||
|  | // A counter to indicate the access token cache miss | ||||||
|  | counter_metric!(ACCESS_TOKEN_CACHE_MISS, GLOBAL_METER); | ||||||
|  |  | ||||||
| pub mod request; | pub mod request; | ||||||
| pub mod utils; | pub mod utils; | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Narayan Bhat
					Narayan Bhat