Skip to content

Commit 0ee53b4

Browse files
committed
CSHARP-6089: Rename retryAfterMS to baseBackoffMS per updated spec
1 parent 0e47a22 commit 0ee53b4

8 files changed

Lines changed: 49 additions & 49 deletions

File tree

src/MongoDB.Driver/Core/Operations/RetryabilityHelper.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ public static int GetRetryDelayMs(IRandom random, int attempt, double backoffBas
134134
/// </summary>
135135
/// <param name="attempt">The retry attempt number.</param>
136136
/// <param name="random">The random number generator.</param>
137-
/// <param name="retryAfterMs">
138-
/// A server-supplied backoff base (from the overload error's <c>retryAfterMS</c> field) that overrides
137+
/// <param name="baseBackoffMs">
138+
/// A server-supplied backoff base (from the overload error's <c>baseBackoffMS</c> field) that overrides
139139
/// the driver's default initial backoff, or <see langword="null"/> to use the default.
140140
/// </param>
141-
public static TimeSpan GetOperationRetryBackoffDelay(int attempt, IRandom random, int? retryAfterMs = null)
141+
public static TimeSpan GetOperationRetryBackoffDelay(int attempt, IRandom random, int? baseBackoffMs = null)
142142
{
143143
// Limit a server-supplied override to MaxBackoff so the backoff still resolves to min(MaxBackoff, ...) rather than tripping GetRetryDelayMs's guard.
144144
var initialBackoff = Math.Min(
145-
retryAfterMs ?? OperationRetryBackpressureConstants.InitialBackoff,
145+
baseBackoffMs ?? OperationRetryBackpressureConstants.InitialBackoff,
146146
OperationRetryBackpressureConstants.MaxBackoff);
147147
return TimeSpan.FromMilliseconds(
148148
GetRetryDelayMs(
@@ -154,14 +154,14 @@ public static TimeSpan GetOperationRetryBackoffDelay(int attempt, IRandom random
154154
}
155155

156156
/// <summary>
157-
/// Reads a server-supplied backoff override (the <c>retryAfterMS</c> field) from a retryable overload error,
157+
/// Reads a server-supplied backoff override (the <c>baseBackoffMS</c> field) from a retryable overload error,
158158
/// or <see langword="null"/> when absent. Only <see cref="MongoCommandException"/> results are inspected; a
159159
/// missing, non-numeric, or non-positive value is treated as absent.
160160
/// </summary>
161-
public static int? GetRetryAfterMs(Exception exception)
161+
public static int? GetBaseBackoffMs(Exception exception)
162162
{
163163
if (exception is MongoCommandException { Result: { } result } &&
164-
result.TryGetValue("retryAfterMS", out var value) &&
164+
result.TryGetValue("baseBackoffMS", out var value) &&
165165
value.IsNumeric)
166166
{
167167
var ms = value.ToInt64();

src/MongoDB.Driver/Core/Operations/RetryableReadOperationExecutor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ private static bool ShouldRetry(OperationContext operationContext,
164164
currentTransaction.ResetState();
165165
}
166166

167-
var retryAfterMs = RetryabilityHelper.GetRetryAfterMs(exception);
168-
backoff = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, random, retryAfterMs);
167+
var baseBackoffMs = RetryabilityHelper.GetBaseBackoffMs(exception);
168+
backoff = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, random, baseBackoffMs);
169169

170170
return attempt <= context.MaxAdaptiveRetries;
171171
}

src/MongoDB.Driver/Core/Operations/RetryableWriteOperationExecutor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,8 @@ private static bool ShouldRetry(OperationContext operationContext,
231231
currentTransaction.ResetState();
232232
}
233233

234-
var retryAfterMs = RetryabilityHelper.GetRetryAfterMs(exception);
235-
backoff = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, random, retryAfterMs);
234+
var baseBackoffMs = RetryabilityHelper.GetBaseBackoffMs(exception);
235+
backoff = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, random, baseBackoffMs);
236236

237237
return attempt <= context.MaxAdaptiveRetries;
238238
}

tests/MongoDB.Driver.Tests/Core/Operations/RetryabilityHelperTests.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -290,30 +290,30 @@ public void IsRetryableWriteException_should_return_expected_result([Values(fals
290290
}
291291

292292
[Fact]
293-
public void GetRetryAfterMs_should_return_null_for_non_command_exception()
293+
public void GetBaseBackoffMs_should_return_null_for_non_command_exception()
294294
{
295295
var exception = CoreExceptionHelper.CreateException(typeof(MongoConnectionException));
296296

297-
var retryAfterMs = RetryabilityHelper.GetRetryAfterMs(exception);
297+
var baseBackoffMs = RetryabilityHelper.GetBaseBackoffMs(exception);
298298

299-
retryAfterMs.Should().Be(null);
299+
baseBackoffMs.Should().Be(null);
300300
}
301301

302302
[Theory]
303303
[InlineData("{ ok : 0, code : 2 }", null)]
304-
[InlineData("{ ok : 0, code : 2, retryAfterMS : 0 }", null)]
305-
[InlineData("{ ok : 0, code : 2, retryAfterMS : -5 }", null)]
306-
[InlineData("{ ok : 0, code : 2, retryAfterMS : 'not-a-number' }", null)]
307-
[InlineData("{ ok : 0, code : 2, retryAfterMS : 50 }", 50)]
308-
[InlineData("{ ok : 0, code : 2, retryAfterMS : NumberLong(9999999999) }", int.MaxValue)]
309-
public void GetRetryAfterMs_should_return_expected_result(string resultJson, int? expectedValue)
304+
[InlineData("{ ok : 0, code : 2, baseBackoffMS : 0 }", null)]
305+
[InlineData("{ ok : 0, code : 2, baseBackoffMS : -5 }", null)]
306+
[InlineData("{ ok : 0, code : 2, baseBackoffMS : 'not-a-number' }", null)]
307+
[InlineData("{ ok : 0, code : 2, baseBackoffMS : 50 }", 50)]
308+
[InlineData("{ ok : 0, code : 2, baseBackoffMS : NumberLong(9999999999) }", int.MaxValue)]
309+
public void GetBaseBackoffMs_should_return_expected_result(string resultJson, int? expectedValue)
310310
{
311311
var result = BsonDocument.Parse(resultJson);
312312
var exception = CoreExceptionHelper.CreateMongoCommandExceptionWithLabels(result);
313313

314-
var retryAfterMs = RetryabilityHelper.GetRetryAfterMs(exception);
314+
var baseBackoffMs = RetryabilityHelper.GetBaseBackoffMs(exception);
315315

316-
retryAfterMs.Should().Be(expectedValue);
316+
baseBackoffMs.Should().Be(expectedValue);
317317
}
318318

319319
[Theory]
@@ -323,22 +323,22 @@ public void GetRetryAfterMs_should_return_expected_result(string resultJson, int
323323
[InlineData(2, 50, 0, 100)]
324324
[InlineData(1, 10000, 0, 10000)]
325325
[InlineData(2, 20000, 0, 10000)]
326-
public void GetOperationRetryBackoffDelay_should_apply_retryAfterMs_override(int attempt, int? retryAfterMs, int expectedRangeMin, int expectedRangeMax)
326+
public void GetOperationRetryBackoffDelay_should_apply_baseBackoffMs_override(int attempt, int? baseBackoffMs, int expectedRangeMin, int expectedRangeMax)
327327
{
328-
var result = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, DefaultRandom.Instance, retryAfterMs);
328+
var result = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, DefaultRandom.Instance, baseBackoffMs);
329329

330330
result.TotalMilliseconds.Should().BeInRange(expectedRangeMin, expectedRangeMax);
331331
}
332332

333333
[Theory]
334334
[InlineData(1, 10000, 10000)]
335335
[InlineData(2, 20000, 10000)]
336-
public void GetOperationRetryBackoffDelay_should_limit_override_to_MaxBackoff(int attempt, int retryAfterMs, int expectedMs)
336+
public void GetOperationRetryBackoffDelay_should_limit_override_to_MaxBackoff(int attempt, int baseBackoffMs, int expectedMs)
337337
{
338338
var randomMock = new Mock<IRandom>();
339339
randomMock.Setup(r => r.NextDouble()).Returns(1.0);
340340

341-
var result = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, randomMock.Object, retryAfterMs);
341+
var result = RetryabilityHelper.GetOperationRetryBackoffDelay(attempt, randomMock.Object, baseBackoffMs);
342342

343343
result.TotalMilliseconds.Should().Be(expectedMs);
344344
}

tests/MongoDB.Driver.Tests/Core/Operations/RetryableReadOperationExecutorTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,14 @@ public void ShouldRetry_with_system_overloaded_exception_should_not_retry_when_r
143143
[InlineData(2, 50, 0, 100)]
144144
[InlineData(1, 10000, 0, 10000)]
145145
[InlineData(2, 20000, 0, 10000)]
146-
public void ShouldRetry_with_retryAfterMs_should_use_it_as_backoff_base(
146+
public void ShouldRetry_with_baseBackoffMs_should_use_it_as_backoff_base(
147147
int attempt,
148-
int retryAfterMs,
148+
int baseBackoffMs,
149149
int expectedRangeMinMs,
150150
int expectedRangeMaxMs)
151151
{
152152
var context = CreateContext(retryRequested: true, isInTransaction: false);
153-
var result = BsonDocument.Parse($"{{ ok : 0, code : 2, retryAfterMS : {retryAfterMs} }}");
153+
var result = BsonDocument.Parse($"{{ ok : 0, code : 2, baseBackoffMS : {baseBackoffMs} }}");
154154
var exception = CoreExceptionHelper.CreateMongoCommandExceptionWithLabels(result, "SystemOverloadedError", "RetryableError");
155155
var operationContext = new OperationContext(null, CancellationToken.None);
156156
var randomMock = new Mock<IRandom>();

tests/MongoDB.Driver.Tests/Core/Operations/RetryableWriteOperationExecutorTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ public void IsOperationAcknowledged_should_return_expected_result(bool? isAcknow
9393
[InlineData(2, 50, 0, 100)]
9494
[InlineData(1, 10000, 0, 10000)]
9595
[InlineData(2, 20000, 0, 10000)]
96-
public void ShouldRetry_with_retryAfterMs_should_use_it_as_backoff_base(
96+
public void ShouldRetry_with_baseBackoffMs_should_use_it_as_backoff_base(
9797
int attempt,
98-
int retryAfterMs,
98+
int baseBackoffMs,
9999
int expectedRangeMinMs,
100100
int expectedRangeMaxMs)
101101
{
102102
var context = CreateContext(retryRequested: true, areRetryableWritesSupported: true, hasSessionId: true, isInTransaction: false);
103-
var result = BsonDocument.Parse($"{{ ok : 0, code : 2, retryAfterMS : {retryAfterMs} }}");
103+
var result = BsonDocument.Parse($"{{ ok : 0, code : 2, baseBackoffMS : {baseBackoffMs} }}");
104104
var exception = CoreExceptionHelper.CreateMongoCommandExceptionWithLabels(result, "SystemOverloadedError", "RetryableError");
105105
var operationContext = new OperationContext(null, CancellationToken.None);
106106
var randomMock = new Mock<IRandom>();

tests/MongoDB.Driver.Tests/Core/WireProtocol/CommandWriteProtocolTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ ICoreSession CreateTransactionSession()
479479

480480
[Theory]
481481
[ParameterAttributeData]
482-
public async Task Execute_should_preserve_server_supplied_retryAfterMS_in_the_command_exception(
482+
public async Task Execute_should_preserve_server_supplied_baseBackoffMS_in_the_command_exception(
483483
[Values(false, true)] bool async)
484484
{
485485
var connection = new MockConnection();
@@ -490,7 +490,7 @@ public async Task Execute_should_preserve_server_supplied_retryAfterMS_in_the_co
490490
{ "code", 462 },
491491
{ "errmsg", "overloaded" },
492492
{ "errorLabels", new BsonArray { "SystemOverloadedError", "RetryableError" } },
493-
{ "retryAfterMS", 50 }
493+
{ "baseBackoffMS", 50 }
494494
};
495495
connection.EnqueueCommandResponseMessage(
496496
MessageHelper.BuildCommandResponse(CreateRawBsonDocument(errorResponse)));
@@ -513,8 +513,8 @@ public async Task Execute_should_preserve_server_supplied_retryAfterMS_in_the_co
513513
: Record.Exception(() => subject.Execute(OperationContext.NoTimeout, connection));
514514

515515
var commandException = exception.Should().BeOfType<MongoCommandException>().Subject;
516-
commandException.Result["retryAfterMS"].ToInt32().Should().Be(50);
517-
RetryabilityHelper.GetRetryAfterMs(commandException).Should().Be(50);
516+
commandException.Result["baseBackoffMS"].ToInt32().Should().Be(50);
517+
RetryabilityHelper.GetBaseBackoffMs(commandException).Should().Be(50);
518518
}
519519

520520
// private methods

tests/MongoDB.Driver.Tests/Specifications/client-backpressure/prose-tests/ClientBackpressureProseTests.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ await AssertBackoffBehavior(
8787
[Theory]
8888
[InlineData(false)]
8989
[InlineData(true)]
90-
// https://github.com/mongodb/specifications/pull/1953 (Test 5: overload errors with retryAfterMS override base backoff)
91-
public async Task ReadExecute_should_use_retryAfterMs_as_backoff_base(bool async)
90+
// https://github.com/mongodb/specifications/pull/1953 (Test 5: overload errors with baseBackoffMS override base backoff)
91+
public async Task ReadExecute_should_use_baseBackoffMs_as_backoff_base(bool async)
9292
{
93-
await AssertRetryAfterMsOverridesBackoff(
93+
await AssertBaseBackoffMsOverridesBackoff(
9494
async,
9595
random => CreateRetryableReadContext(random),
9696
exception =>
@@ -111,10 +111,10 @@ await AssertRetryAfterMsOverridesBackoff(
111111
[Theory]
112112
[InlineData(false)]
113113
[InlineData(true)]
114-
// https://github.com/mongodb/specifications/pull/1953 (Test 5: overload errors with retryAfterMS override base backoff)
115-
public async Task WriteExecute_should_use_retryAfterMs_as_backoff_base(bool async)
114+
// https://github.com/mongodb/specifications/pull/1953 (Test 5: overload errors with baseBackoffMS override base backoff)
115+
public async Task WriteExecute_should_use_baseBackoffMs_as_backoff_base(bool async)
116116
{
117-
await AssertRetryAfterMsOverridesBackoff(
117+
await AssertBaseBackoffMsOverridesBackoff(
118118
async,
119119
random => CreateRetryableWriteContext(random),
120120
exception =>
@@ -176,7 +176,7 @@ private async Task AssertBackoffBehavior<TContext>(
176176
$"backoff difference should be approximately 300ms, got {difference}ms (noBackoff: {noBackoffTime}ms, withBackoff: {withBackoffTime}ms)");
177177
}
178178

179-
private async Task AssertRetryAfterMsOverridesBackoff<TOperation, TContext>(
179+
private async Task AssertBaseBackoffMsOverridesBackoff<TOperation, TContext>(
180180
bool async,
181181
Func<IRandom, TContext> createContext,
182182
Func<Exception, TOperation> createOperation,
@@ -188,18 +188,18 @@ private async Task AssertRetryAfterMsOverridesBackoff<TOperation, TContext>(
188188
var fullJitterRandom = new Mock<IRandom>();
189189
fullJitterRandom.Setup(r => r.NextDouble()).Returns(1.0);
190190

191-
// Exponential backoff run: overload error without retryAfterMS -> 100ms + 200ms = 300ms with jitter = 1.
191+
// Exponential backoff run: overload error without baseBackoffMS -> 100ms + 200ms = 300ms with jitter = 1.
192192
var exponentialException = CoreExceptionHelper.CreateMongoCommandExceptionWithLabels(462, "SystemOverloadedError", "RetryableError");
193193
var exponentialMs = await MeasureBackoff(async, executeSync, executeAsync, operationContext, createOperation(exponentialException), createContext(fullJitterRandom.Object));
194194

195-
// retryAfterMS override run: overload error with retryAfterMS = 50 -> 50ms + 100ms = 150ms with jitter = 1.
196-
var overrideResult = BsonDocument.Parse("{ ok : 0, code : 462, retryAfterMS : 50 }");
195+
// baseBackoffMS override run: overload error with baseBackoffMS = 50 -> 50ms + 100ms = 150ms with jitter = 1.
196+
var overrideResult = BsonDocument.Parse("{ ok : 0, code : 462, baseBackoffMS : 50 }");
197197
var overrideException = CoreExceptionHelper.CreateMongoCommandExceptionWithLabels(overrideResult, "SystemOverloadedError", "RetryableError");
198-
var withRetryAfterMs = await MeasureBackoff(async, executeSync, executeAsync, operationContext, createOperation(overrideException), createContext(fullJitterRandom.Object));
198+
var withBaseBackoffMs = await MeasureBackoff(async, executeSync, executeAsync, operationContext, createOperation(overrideException), createContext(fullJitterRandom.Object));
199199

200200
// Per the spec: assertTrue(abs(exponential_backoff_time - (with_retry_after_ms_time + 0.2s)) < 0.2s)
201-
Math.Abs(exponentialMs - (withRetryAfterMs + 200)).Should().BeLessThan(200,
202-
$"retryAfterMS should shorten the backoff base (exponential: {exponentialMs}ms, withRetryAfterMS: {withRetryAfterMs}ms)");
201+
Math.Abs(exponentialMs - (withBaseBackoffMs + 200)).Should().BeLessThan(200,
202+
$"baseBackoffMS should shorten the backoff base (exponential: {exponentialMs}ms, withBaseBackoffMS: {withBaseBackoffMs}ms)");
203203
}
204204

205205
private static async Task<long> MeasureBackoff<TOperation, TContext>(

0 commit comments

Comments
 (0)