Skip to content

Commit 7dbb571

Browse files
authored
chore: rename maxRetries to maxAttempts (#1244)
1 parent abfb40f commit 7dbb571

File tree

6 files changed

+34
-33
lines changed

6 files changed

+34
-33
lines changed

packages/middleware-retry/src/configurations.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,26 @@ import { ExponentialBackOffStrategy } from "./defaultStrategy";
33

44
export interface RetryInputConfig {
55
/**
6-
* The maximum number of times requests that encounter potentially transient failures should be retried
6+
* The maximum number of times requests that encounter retryable failures should be attempted.
77
*/
8-
maxRetries?: number;
8+
maxAttempts?: number;
99
/**
1010
* The strategy to retry the request. Using built-in exponential backoff strategy by default.
1111
*/
1212
retryStrategy?: RetryStrategy;
1313
}
1414
export interface RetryResolvedConfig {
15-
maxRetries: number;
15+
maxAttempts: number;
1616
retryStrategy: RetryStrategy;
1717
}
1818
export function resolveRetryConfig<T>(
1919
input: T & RetryInputConfig
2020
): T & RetryResolvedConfig {
21-
const maxRetries = input.maxRetries === undefined ? 3 : input.maxRetries;
21+
const maxAttempts = input.maxAttempts === undefined ? 3 : input.maxAttempts;
2222
return {
2323
...input,
24-
maxRetries,
24+
maxAttempts,
2525
retryStrategy:
26-
input.retryStrategy || new ExponentialBackOffStrategy(maxRetries)
26+
input.retryStrategy || new ExponentialBackOffStrategy(maxAttempts)
2727
};
2828
}

packages/middleware-retry/src/defaultStrategy.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,34 +35,35 @@ export interface DelayDecider {
3535

3636
export class ExponentialBackOffStrategy implements RetryStrategy {
3737
constructor(
38-
public readonly maxRetries: number,
38+
public readonly maxAttempts: number,
3939
private retryDecider: RetryDecider = defaultRetryDecider,
4040
private delayDecider: DelayDecider = defaultDelayDecider
4141
) {}
42-
private shouldRetry(error: SdkError, retryAttempted: number) {
43-
return retryAttempted < this.maxRetries && this.retryDecider(error);
42+
private shouldRetry(error: SdkError, attempts: number) {
43+
return attempts < this.maxAttempts && this.retryDecider(error);
4444
}
4545

4646
async retry<Input extends object, Ouput extends MetadataBearer>(
4747
next: FinalizeHandler<Input, Ouput>,
4848
args: FinalizeHandlerArguments<Input>
4949
) {
50-
let retries = 0;
50+
let attempts = 0;
5151
let totalDelay = 0;
5252
while (true) {
5353
try {
5454
const { response, output } = await next(args);
55-
output.$metadata.retries = retries;
55+
output.$metadata.attempts = attempts + 1;
5656
output.$metadata.totalRetryDelay = totalDelay;
5757

5858
return { response, output };
5959
} catch (err) {
60-
if (this.shouldRetry(err as SdkError, retries)) {
60+
attempts++;
61+
if (this.shouldRetry(err as SdkError, attempts)) {
6162
const delay = this.delayDecider(
6263
isThrottlingError(err)
6364
? THROTTLING_RETRY_DELAY_BASE
6465
: DEFAULT_RETRY_DELAY_BASE,
65-
retries++
66+
attempts
6667
);
6768
totalDelay += delay;
6869

@@ -74,7 +75,7 @@ export class ExponentialBackOffStrategy implements RetryStrategy {
7475
err.$metadata = {};
7576
}
7677

77-
err.$metadata.retries = retries;
78+
err.$metadata.attempts = attempts;
7879
err.$metadata.totalRetryDelay = totalDelay;
7980
throw err;
8081
}

packages/middleware-retry/src/index.spec.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,42 @@ import { SdkError } from "@aws-sdk/smithy-client";
1212
describe("retryMiddleware", () => {
1313
it("should not retry when the handler completes successfully", async () => {
1414
const next = jest.fn().mockResolvedValue({ output: { $metadata: {} } });
15-
const retryHandler = retryMiddleware(resolveRetryConfig({ maxRetries: 0 }))(
16-
next
17-
);
15+
const retryHandler = retryMiddleware(
16+
resolveRetryConfig({ maxAttempts: 0 })
17+
)(next);
1818

1919
const {
2020
output: { $metadata }
2121
} = await retryHandler({ input: {}, request: new HttpRequest({}) });
22-
expect($metadata.retries).toBe(0);
22+
expect($metadata.attempts).toBe(1);
2323
expect($metadata.totalRetryDelay).toBe(0);
2424

2525
expect(next.mock.calls.length).toBe(1);
2626
});
2727

2828
it("should stop retrying when the the maximum number of retries is reached", async () => {
29-
const maxRetries = 3;
29+
const maxAttempts = 3;
3030
const error = new Error();
3131
error.name = "ProvisionedThroughputExceededException";
3232
const next = jest.fn().mockRejectedValue(error);
33-
const retryHandler = retryMiddleware(resolveRetryConfig({ maxRetries }))(
33+
const retryHandler = retryMiddleware(resolveRetryConfig({ maxAttempts }))(
3434
next
3535
);
3636

3737
await expect(
3838
retryHandler({ input: {}, request: new HttpRequest({}) })
3939
).rejects.toMatchObject(error);
4040

41-
expect(next.mock.calls.length).toBe(maxRetries + 1);
41+
expect(next.mock.calls.length).toBe(maxAttempts);
4242
});
4343

4444
it("should not retry if the error is not transient", async () => {
4545
const error = new Error();
4646
error.name = "ValidationException";
4747
const next = jest.fn().mockRejectedValue(error);
48-
const retryHandler = retryMiddleware(resolveRetryConfig({ maxRetries: 3 }))(
49-
next
50-
);
48+
const retryHandler = retryMiddleware(
49+
resolveRetryConfig({ maxAttempts: 3 })
50+
)(next);
5151

5252
await expect(
5353
retryHandler({ input: {}, request: new HttpRequest({}) })
@@ -69,24 +69,24 @@ describe("retryMiddleware", () => {
6969

7070
jest.mock("./delayDecider");
7171

72-
const maxRetries = 3;
72+
const maxAttempts = 3;
7373
const delayDeciderMock = jest.spyOn(
7474
delayDeciderModule,
7575
"defaultDelayDecider"
7676
);
7777
const retryDecider: RetryDecider = (error: SdkError) => true;
78-
const strategy = new ExponentialBackOffStrategy(maxRetries, retryDecider);
78+
const strategy = new ExponentialBackOffStrategy(maxAttempts, retryDecider);
7979
const retryHandler = retryMiddleware({
80-
maxRetries,
80+
maxAttempts,
8181
retryStrategy: strategy
8282
})(next);
8383

8484
await retryHandler({ input: {}, request: new HttpRequest({}) });
8585

8686
expect(next.mock.calls.length).toBe(3);
8787
expect(delayDeciderMock.mock.calls).toEqual([
88-
[DEFAULT_RETRY_DELAY_BASE, 0],
89-
[THROTTLING_RETRY_DELAY_BASE, 1]
88+
[DEFAULT_RETRY_DELAY_BASE, 1],
89+
[THROTTLING_RETRY_DELAY_BASE, 2]
9090
]);
9191
});
9292
});

packages/middleware-retry/src/retryMiddleware.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export const getRetryPlugin = (
3131
options: RetryResolvedConfig
3232
): Pluggable<any, any> => ({
3333
applyToStack: clientStack => {
34-
if (options.maxRetries > 0) {
34+
if (options.maxAttempts > 1) {
3535
clientStack.add(retryMiddleware(options), retryMiddlewareOptions);
3636
}
3737
}

packages/types/src/response.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export interface ResponseMetadata {
2828
cfId?: string;
2929

3030
/**
31-
* The number of times this operation was retried.
31+
* The number of times this operation was attempted.
3232
*/
33-
retries?: number;
33+
attempts?: number;
3434

3535
/**
3636
* The total amount of time (in milliseconds) that was spent waiting between

packages/types/src/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export interface RetryStrategy {
6161
* the maximum number of times requests that encounter potentially
6262
* transient failures should be retried
6363
*/
64-
maxRetries: number;
64+
maxAttempts: number;
6565
/**
6666
* the retry behavior the will invoke the next handler and handle the retry accordingly.
6767
* This function should also update the $metadata from the response accordingly.

0 commit comments

Comments
 (0)