diff --git a/src/Polly.Core/Retry/RetryHelper.cs b/src/Polly.Core/Retry/RetryHelper.cs index a221e929fe0..42613ef0daf 100644 --- a/src/Polly.Core/Retry/RetryHelper.cs +++ b/src/Polly.Core/Retry/RetryHelper.cs @@ -9,6 +9,18 @@ internal static class RetryHelper public static bool IsValidDelay(TimeSpan delay) => delay >= TimeSpan.Zero; public static TimeSpan GetRetryDelay(RetryBackoffType type, bool jitter, int attempt, TimeSpan baseDelay, ref double state, Func randomizer) + { + try + { + return GetRetryDelayCore(type, jitter, attempt, baseDelay, ref state, randomizer); + } + catch (OverflowException) + { + return TimeSpan.MaxValue; + } + } + + private static TimeSpan GetRetryDelayCore(RetryBackoffType type, bool jitter, int attempt, TimeSpan baseDelay, ref double state, Func randomizer) { if (baseDelay == TimeSpan.Zero) { diff --git a/test/Polly.Core.Tests/Retry/RetryHelperTests.cs b/test/Polly.Core.Tests/Retry/RetryHelperTests.cs index 641a245e63d..9e7d136fb83 100644 --- a/test/Polly.Core.Tests/Retry/RetryHelperTests.cs +++ b/test/Polly.Core.Tests/Retry/RetryHelperTests.cs @@ -95,6 +95,14 @@ public void Exponential_Ok() RetryHelper.GetRetryDelay(RetryBackoffType.Exponential, false, 2, TimeSpan.FromSeconds(1), ref state, _randomizer).Should().Be(TimeSpan.FromSeconds(4)); } + [Fact] + public void GetRetryDelay_Overflow_ReturnsMaxTimeSpan() + { + double state = 0; + + RetryHelper.GetRetryDelay(RetryBackoffType.Exponential, false, 1000, TimeSpan.FromDays(1), ref state, _randomizer).Should().Be(TimeSpan.MaxValue); + } + [InlineData(1)] [InlineData(2)] [InlineData(3)]