From 2268a57a01943207459eb99aac4e2043e4c25c0d Mon Sep 17 00:00:00 2001 From: Brian Talma Date: Mon, 8 Jul 2024 10:38:36 -0400 Subject: [PATCH 1/2] Reduce calls to VBase Improve logging of VBase calls --- CHANGELOG.md | 4 ++++ dotnet/Controlers/RoutesController.cs | 2 +- dotnet/Data/CybersourceConstants.cs | 1 + dotnet/Data/CybersourceRepository.cs | 15 +++++++++++++-- dotnet/Data/ICybersourceRepository.cs | 2 +- dotnet/Services/CybersourcePaymentService.cs | 7 +++++-- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a4e2b8..fbe9a75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +### Changed +- Reduce calls to VBase +- Improve logging of VBase calls + ## [1.22.1] - 2024-06-25 ### Fixed diff --git a/dotnet/Controlers/RoutesController.cs b/dotnet/Controlers/RoutesController.cs index ed848eb..d6b5eb4 100644 --- a/dotnet/Controlers/RoutesController.cs +++ b/dotnet/Controlers/RoutesController.cs @@ -93,7 +93,7 @@ public async Task CreatePayment() { //(createPaymentResponse, paymentsResponse) = await this._cybersourcePaymentService.CreatePayment(createPaymentRequest); var createPaymentTask = this._cybersourcePaymentService.CreatePayment(createPaymentRequest); - var winner = await Task.WhenAny(createPaymentTask, DelayedDummyResultTask<(CreatePaymentResponse, PaymentsResponse)>(TimeSpan.FromSeconds(25))); + var winner = await Task.WhenAny(createPaymentTask, DelayedDummyResultTask<(CreatePaymentResponse, PaymentsResponse)>(TimeSpan.FromSeconds(20))); if (winner == createPaymentTask) { //_context.Vtex.Logger.Debug("CreatePayment", "Timeout", $"Processed {createPaymentRequest.PaymentId} in time!"); diff --git a/dotnet/Data/CybersourceConstants.cs b/dotnet/Data/CybersourceConstants.cs index 53b561a..7c8c346 100644 --- a/dotnet/Data/CybersourceConstants.cs +++ b/dotnet/Data/CybersourceConstants.cs @@ -36,6 +36,7 @@ public class CybersourceConstants public const string CACHE_BUCKET = "tax-cache"; public const string SIGNATURE_ENCODING = "base64"; public const string SIGNATURE_KEY_FORMAT = "base64"; + public const string TOO_MANY_REQUESTS = "TooManyRequests"; public const string PAYMENTS = "/pts/v2/"; public const string RISK = "/risk/v1/"; diff --git a/dotnet/Data/CybersourceRepository.cs b/dotnet/Data/CybersourceRepository.cs index 70a2b5f..6a67686 100644 --- a/dotnet/Data/CybersourceRepository.cs +++ b/dotnet/Data/CybersourceRepository.cs @@ -93,7 +93,12 @@ public async Task GetPaymentData(string paymentIdentifier) null, true); if (sendResponse.StatusCode == HttpStatusCode.NotFound.ToString()) { - _context.Vtex.Logger.Warn("GetPaymentData", null, $"Payment Id '{paymentIdentifier}' Not Found."); + _context.Vtex.Logger.Debug("GetPaymentData", null, $"Payment Id '{paymentIdentifier}' Not Found."); + return null; + } + else if (!sendResponse.Success) + { + _context.Vtex.Logger.Error("GetPaymentData", null, $"Could not retrieve Payment Id '{paymentIdentifier}' [{sendResponse.StatusCode}] "); return null; } @@ -114,7 +119,7 @@ public async Task GetPaymentData(string paymentIdentifier) return paymentData; } - public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentData) + public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentData, int retryNumber = 0) { if (paymentData == null) { @@ -137,6 +142,12 @@ public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentD ( "paymentIdentifier", paymentIdentifier ), ( "paymentData", JsonConvert.SerializeObject(paymentData) ) }); + + if (sendResponse.StatusCode.Equals(CybersourceConstants.TOO_MANY_REQUESTS) && retryNumber < 5) + { + await Task.Delay(retryNumber * 1000); + await this.SavePaymentData(paymentIdentifier, paymentData, ++retryNumber); + } } } diff --git a/dotnet/Data/ICybersourceRepository.cs b/dotnet/Data/ICybersourceRepository.cs index 5995754..d9fba71 100644 --- a/dotnet/Data/ICybersourceRepository.cs +++ b/dotnet/Data/ICybersourceRepository.cs @@ -9,7 +9,7 @@ public interface ICybersourceRepository Task SetMerchantSettings(MerchantSettings merchantSettings); Task GetPaymentData(string paymentIdentifier); - Task SavePaymentData(string paymentIdentifier, PaymentData paymentData); + Task SavePaymentData(string paymentIdentifier, PaymentData paymentData, int retryNumber = 0); Task GetCreatePaymentRequest(string id); Task SaveCreatePaymentRequest(string id, CreatePaymentRequest createPaymentRequest); diff --git a/dotnet/Services/CybersourcePaymentService.cs b/dotnet/Services/CybersourcePaymentService.cs index 39c1f88..3fd347b 100644 --- a/dotnet/Services/CybersourcePaymentService.cs +++ b/dotnet/Services/CybersourcePaymentService.cs @@ -671,7 +671,7 @@ public async Task BuildPayment(CreatePaymentRequest createPaymentReque { // Setting the TimedOut flag to true so that any follow up requests will check for previous captures paymentData.TimedOut = true; - await _cybersourceRepository.SavePaymentData(paymentData.PaymentId, paymentData); + // await _cybersourceRepository.SavePaymentData(paymentData.PaymentId, paymentData); } bool isPayerAuth = false; @@ -787,7 +787,10 @@ public async Task BuildPayment(CreatePaymentRequest createPaymentReque paymentData.Value = capturedAmount; } - await _cybersourceRepository.SavePaymentData(createPaymentRequest.PaymentId, paymentData); + if (!createPaymentResponse.Equals(CybersourceConstants.VtexAuthStatus.Denied)) + { + await _cybersourceRepository.SavePaymentData(createPaymentRequest.PaymentId, paymentData); + } } if (doCancel) From 628009fb1c3b63f0ee3d5bad47923b66974f5b0b Mon Sep 17 00:00:00 2001 From: Brian Talma Date: Mon, 8 Jul 2024 10:53:08 -0400 Subject: [PATCH 2/2] retry --- CHANGELOG.md | 1 + dotnet/Data/CybersourceRepository.cs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbe9a75..947e2ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Changed - Reduce calls to VBase - Improve logging of VBase calls +- Retry GetPaymentData VBase calls ## [1.22.1] - 2024-06-25 diff --git a/dotnet/Data/CybersourceRepository.cs b/dotnet/Data/CybersourceRepository.cs index 6a67686..1e790ca 100644 --- a/dotnet/Data/CybersourceRepository.cs +++ b/dotnet/Data/CybersourceRepository.cs @@ -133,7 +133,7 @@ public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentD jsonSerializedCreatePaymentRequest); if (!sendResponse.Success) { - _context.Vtex.Logger.Error("SavePaymentData", null, $"Failed", + _context.Vtex.Logger.Error("SavePaymentData", null, $"({retryNumber}) Failed", null, new[] { @@ -145,7 +145,7 @@ public async Task SavePaymentData(string paymentIdentifier, PaymentData paymentD if (sendResponse.StatusCode.Equals(CybersourceConstants.TOO_MANY_REQUESTS) && retryNumber < 5) { - await Task.Delay(retryNumber * 1000); + await Task.Delay(retryNumber * 100); await this.SavePaymentData(paymentIdentifier, paymentData, ++retryNumber); } }