-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix retry delay going negative for large retries with exponential del…
…ays (#2164) - Suppress `xUnit1042` warnings. - Add repro for #2163. - Add an assertion for the delay's value not being negative. - Fix retry delays going negative with `DelayBackoffType.Exponential` after 1,024 retries. - Only compute the effective maximum `TimeSpan` once. - Assert delays are positive. - Add more unit tests related to the exponential delay becoming negative. - Remove redundant comment. - Use `TheoryData<int>` for retry test cases.
- Loading branch information
1 parent
5d81f99
commit 7301ef3
Showing
5 changed files
with
151 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
test/Polly.Core.Tests/Issues/IssuesTests.InfiniteRetry_2163.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
using Microsoft.Extensions.Time.Testing; | ||
using Polly.Retry; | ||
|
||
namespace Polly.Core.Tests.Issues; | ||
|
||
public partial class IssuesTests | ||
{ | ||
[Fact(Timeout = 15_000)] | ||
public async Task InfiniteRetry_Delay_Does_Not_Overflow_2163() | ||
{ | ||
// Arrange | ||
int attempts = 0; | ||
int succeedAfter = 2049; | ||
|
||
var options = new RetryStrategyOptions<bool> | ||
{ | ||
BackoffType = DelayBackoffType.Exponential, | ||
Delay = TimeSpan.FromSeconds(2), | ||
MaxDelay = TimeSpan.FromSeconds(30), | ||
MaxRetryAttempts = int.MaxValue, | ||
UseJitter = true, | ||
OnRetry = (args) => | ||
{ | ||
args.RetryDelay.Should().BeGreaterThan(TimeSpan.Zero, $"RetryDelay is less than zero after {args.AttemptNumber} attempts"); | ||
attempts++; | ||
return default; | ||
}, | ||
ShouldHandle = (args) => new ValueTask<bool>(!args.Outcome.Result), | ||
}; | ||
|
||
var listener = new FakeTelemetryListener(); | ||
var telemetry = TestUtilities.CreateResilienceTelemetry(listener); | ||
var timeProvider = new FakeTimeProvider(); | ||
|
||
var strategy = new RetryResilienceStrategy<bool>(options, timeProvider, telemetry); | ||
var pipeline = strategy.AsPipeline(); | ||
|
||
using var cts = new CancellationTokenSource(Debugger.IsAttached ? TimeSpan.MaxValue : TimeSpan.FromSeconds(10)); | ||
|
||
// Act | ||
var executing = pipeline.ExecuteAsync((_) => | ||
{ | ||
return new ValueTask<bool>(attempts >= succeedAfter); | ||
}, cts.Token); | ||
|
||
while (!executing.IsCompleted && !cts.IsCancellationRequested) | ||
{ | ||
timeProvider.Advance(TimeSpan.FromSeconds(1)); | ||
} | ||
|
||
// Assert | ||
cts.Token.ThrowIfCancellationRequested(); | ||
|
||
var actual = await executing; | ||
|
||
actual.Should().BeTrue(); | ||
attempts.Should().Be(succeedAfter); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters