Skip to content

Commit 2f3bfe0

Browse files
fix tests
1 parent b2b3549 commit 2f3bfe0

File tree

7 files changed

+19
-15
lines changed

7 files changed

+19
-15
lines changed

src/EFCore.Ydb/CHANGELOG.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
- Added support for the YDB retry policy (ADO.NET) and new configuration methods in `YdbDbContextOptionsBuilder`:
22
- `EnableRetryIdempotence()`: enables retries for errors classified as idempotent. You must ensure the operation itself is idempotent.
33
- `UseRetryPolicy(YdbRetryPolicyConfig retryPolicyConfig)`: configures custom backoff parameters and the maximum number of retry attempts.
4-
- `UseRetryPolicy(IRetryPolicy retryPolicy)`: advanced option giving full control over retry behavior. The provider does not manage the attempt counter; your implementation must handle it.
54

65
## v0.1.0
76

src/EFCore.Ydb/src/Infrastructure/YdbDbContextOptionsBuilder.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ public YdbDbContextOptionsBuilder EnableRetryIdempotence()
2222
=> UseRetryPolicy(new YdbRetryPolicyConfig { EnableRetryIdempotence = true });
2323

2424
public YdbDbContextOptionsBuilder UseRetryPolicy(YdbRetryPolicyConfig retryPolicyConfig)
25-
=> ExecutionStrategy(d => new YdbExecutionStrategy(d, new YdbRetryPolicy(retryPolicyConfig)));
26-
27-
public YdbDbContextOptionsBuilder UseRetryPolicy(IRetryPolicy retryPolicy)
28-
=> ExecutionStrategy(d => new YdbExecutionStrategy(d, retryPolicy));
25+
=> ExecutionStrategy(d => new YdbExecutionStrategy(d, retryPolicyConfig));
2926

3027
public YdbDbContextOptionsBuilder DisableRetryOnFailure() =>
3128
ExecutionStrategy(d => new NonRetryingExecutionStrategy(d));

src/EFCore.Ydb/src/Storage/Internal/YdbExecutionStrategy.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using Microsoft.EntityFrameworkCore.Storage;
3+
using Ydb.Sdk;
34
using Ydb.Sdk.Ado;
45
using Ydb.Sdk.Ado.RetryPolicy;
56

@@ -15,17 +16,23 @@ namespace EntityFrameworkCore.Ydb.Storage.Internal;
1516
/// so that exception types and ShouldRetryOn semantics match the provider.
1617
/// <br/>- This base <see cref="ExecutionStrategy"/> is a good place to emit metrics/logs (attempt number, delay, exception type, etc.).
1718
/// </summary>
18-
public class YdbExecutionStrategy(ExecutionStrategyDependencies dependencies, IRetryPolicy retryPolicy)
19+
public class YdbExecutionStrategy(ExecutionStrategyDependencies dependencies, YdbRetryPolicyConfig retryPolicyConfig)
1920
// We pass "placeholders" to the base class:
20-
// - int.MaxValue and TimeSpan.Zero are not used in the real retry logic.
21+
// - TimeSpan.Zero is not used in the real retry logic.
2122
// - Actual limits/delays are driven by IRetryPolicy.
22-
: ExecutionStrategy(dependencies, int.MaxValue /* unused! */, TimeSpan.Zero /* unused! */)
23+
: ExecutionStrategy(dependencies, retryPolicyConfig.MaxAttempts, TimeSpan.Zero /* unused! */)
2324
{
25+
private readonly YdbRetryPolicy _retryPolicy = new(retryPolicyConfig);
26+
2427
public override bool RetriesOnFailure => true;
2528

26-
protected override bool ShouldRetryOn(Exception exception) => exception is YdbException;
29+
protected override bool ShouldRetryOn(Exception exception) =>
30+
exception is YdbException ydbException &&
31+
(ydbException.IsTransient || retryPolicyConfig.EnableRetryIdempotence && ydbException.Code is
32+
StatusCode.ClientTransportUnknown or
33+
StatusCode.ClientTransportUnavailable or
34+
StatusCode.Undetermined);
2735

28-
protected override TimeSpan? GetNextDelay(Exception lastException) => lastException is YdbException ydbException
29-
? retryPolicy.GetNextDelay(ydbException, ExceptionsEncountered.Count - 1)
30-
: null;
36+
protected override TimeSpan? GetNextDelay(Exception lastException) =>
37+
_retryPolicy.GetNextDelay((YdbException)lastException, ExceptionsEncountered.Count - 1);
3138
}

src/EFCore.Ydb/src/Storage/Internal/YdbExecutionStrategyFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ public class YdbExecutionStrategyFactory(ExecutionStrategyDependencies dependenc
77
: RelationalExecutionStrategyFactory(dependencies)
88
{
99
protected override IExecutionStrategy CreateDefaultStrategy(ExecutionStrategyDependencies dependencies) =>
10-
new YdbExecutionStrategy(dependencies, YdbRetryPolicy.Default);
10+
new YdbExecutionStrategy(dependencies, YdbRetryPolicyConfig.Default);
1111
}

src/EFCore.Ydb/test/EntityFrameworkCore.Ydb.FunctionalTests/QueryExpressionInterceptionYdbTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public override DbContextOptionsBuilder AddOptions(DbContextOptionsBuilder build
2929
{
3030
new YdbDbContextOptionsBuilder(base.AddOptions(builder))
3131
#pragma warning disable EF1001
32-
.ExecutionStrategy(d => new YdbExecutionStrategy(d, YdbRetryPolicy.Default));
32+
.ExecutionStrategy(d => new YdbExecutionStrategy(d, YdbRetryPolicyConfig.Default));
3333
#pragma warning restore EF1001
3434
return builder;
3535
}

src/Ydb.Sdk/src/Ado/RetryPolicy/YdbRetryPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ internal YdbRetryPolicy(YdbRetryPolicyConfig config, IRandom random) : this(conf
8585

8686
return ydbException.Code switch
8787
{
88-
StatusCode.BadSession or StatusCode.SessionBusy => TimeSpan.Zero,
88+
StatusCode.BadSession or StatusCode.SessionBusy or StatusCode.SessionExpired => TimeSpan.Zero,
8989
StatusCode.Aborted or StatusCode.Undetermined =>
9090
FullJitter(_fastBackoffBaseMs, _fastCapBackoffMs, _fastCeiling, attempt, _random),
9191
StatusCode.Unavailable or StatusCode.ClientTransportUnknown or StatusCode.ClientTransportUnavailable =>

src/Ydb.Sdk/test/Ydb.Sdk.Ado.Tests/RetryPolicy/YdbRetryPolicyTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class YdbRetryPolicyTests
1010
[Theory]
1111
[InlineData(StatusCode.BadSession)]
1212
[InlineData(StatusCode.SessionBusy)]
13+
[InlineData(StatusCode.SessionExpired)]
1314
public void GetNextDelay_WhenStatusIsBadSessionOrBusySession_ReturnTimeSpanZero(StatusCode statusCode)
1415
{
1516
var ydbRetryPolicy = new YdbRetryPolicy(new YdbRetryPolicyConfig { MaxAttempts = 2 });

0 commit comments

Comments
 (0)