Skip to content

Commit 63c3e60

Browse files
authored
fix(util-retry): correct attempts count on StandardRetryStrategy (#4891)
1 parent 488c8e7 commit 63c3e60

File tree

4 files changed

+23
-18
lines changed

4 files changed

+23
-18
lines changed

packages/util-retry/src/ConfiguredRetryStrategy.spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ describe(ConfiguredRetryStrategy.name, () => {
55
const strategy = new ConfiguredRetryStrategy(5, (attempt) => attempt * 1000);
66

77
const token = await strategy.acquireInitialRetryToken("");
8-
token.getRetryCount = () => 4;
8+
token.getRetryCount = () => 3;
99

1010
const retryToken = await strategy.refreshRetryTokenForRetry(token, {
1111
errorType: "TRANSIENT",
1212
});
1313

14-
expect(retryToken.getRetryCount()).toBe(5);
15-
expect(retryToken.getRetryDelay()).toBe(5000);
14+
expect(retryToken.getRetryCount()).toBe(4);
15+
expect(retryToken.getRetryDelay()).toBe(4000);
1616
});
1717
});

packages/util-retry/src/StandardRetryStrategy.spec.ts

+14-11
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe(StandardRetryStrategy.name, () => {
2222
});
2323

2424
afterEach(() => {
25-
jest.clearAllMocks;
25+
jest.clearAllMocks();
2626
});
2727

2828
it("sets maxAttemptsProvider as a class member variable", () => {
@@ -65,47 +65,49 @@ describe(StandardRetryStrategy.name, () => {
6565
expect(getRetryCount).toHaveBeenCalledTimes(3);
6666
});
6767

68-
it("throws when attempts exceeds maxAttempts", async () => {
68+
it("disables any retries when maxAttempts is 1", async () => {
6969
const mockRetryToken = {
70-
getRetryCount: () => 2,
70+
getRetryCount: () => 0,
7171
getRetryTokenCount: (errorInfo: any) => 1,
7272
};
7373
(createDefaultRetryToken as jest.Mock).mockReturnValue(mockRetryToken);
74-
const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(1));
74+
const retryStrategy = new StandardRetryStrategy(1);
7575
const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope);
7676
try {
7777
await retryStrategy.refreshRetryTokenForRetry(token, errorInfo);
78+
fail(`expected ${noRetryTokenAvailableError}`);
7879
} catch (error) {
7980
expect(error).toStrictEqual(noRetryTokenAvailableError);
8081
}
8182
});
8283

83-
it("throws when attempts exceeds default max attempts (3)", async () => {
84+
it("throws when attempts exceeds maxAttempts", async () => {
8485
const mockRetryToken = {
85-
getRetryCount: () => 5,
86+
getRetryCount: () => 2,
8687
getRetryTokenCount: (errorInfo: any) => 1,
8788
};
8889
(createDefaultRetryToken as jest.Mock).mockReturnValue(mockRetryToken);
89-
const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(5));
90+
const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(1));
9091
const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope);
9192
try {
9293
await retryStrategy.refreshRetryTokenForRetry(token, errorInfo);
94+
fail(`expected ${noRetryTokenAvailableError}`);
9395
} catch (error) {
9496
expect(error).toStrictEqual(noRetryTokenAvailableError);
9597
}
9698
});
9799

98-
it("throws when no tokens are available", async () => {
100+
it("throws when attempts exceeds default max attempts (3)", async () => {
99101
const mockRetryToken = {
100-
getRetryCount: () => 0,
102+
getRetryCount: () => 5,
101103
getRetryTokenCount: (errorInfo: any) => 1,
102-
hasRetryTokens: (errorType: RetryErrorType) => false,
103104
};
104105
(createDefaultRetryToken as jest.Mock).mockReturnValue(mockRetryToken);
105-
const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts));
106+
const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(5));
106107
const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope);
107108
try {
108109
await retryStrategy.refreshRetryTokenForRetry(token, errorInfo);
110+
fail(`expected ${noRetryTokenAvailableError}`);
109111
} catch (error) {
110112
expect(error).toStrictEqual(noRetryTokenAvailableError);
111113
}
@@ -125,6 +127,7 @@ describe(StandardRetryStrategy.name, () => {
125127
} as RetryErrorInfo;
126128
try {
127129
await retryStrategy.refreshRetryTokenForRetry(token, errorInfo);
130+
fail(`expected ${noRetryTokenAvailableError}`);
128131
} catch (error) {
129132
expect(error).toStrictEqual(noRetryTokenAvailableError);
130133
}

packages/util-retry/src/StandardRetryStrategy.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class StandardRetryStrategy implements RetryStrategyV2 {
8686
}
8787

8888
private shouldRetry(tokenToRenew: StandardRetryToken, errorInfo: RetryErrorInfo, maxAttempts: number): boolean {
89-
const attempts = tokenToRenew.getRetryCount();
89+
const attempts = tokenToRenew.getRetryCount() + 1;
9090

9191
return (
9292
attempts < maxAttempts &&

private/aws-client-retry-test/src/ClientRetryTest.spec.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -89,21 +89,23 @@ describe("util-retry integration tests", () => {
8989
} catch (error) {
9090
expect(error).toStrictEqual(expectedException);
9191
expect(error.$metadata.httpStatusCode).toBe(429);
92-
expect(error.$metadata.attempts).toBe(4);
92+
expect(error.$metadata.attempts).toBe(3);
9393
expect(error.$metadata.totalRetryDelay).toBeGreaterThan(0);
9494
}
9595
});
9696

9797
it("should use a shared capacity for retries", async () => {
9898
const expectedInitialCapacity = 500;
9999
const expectedDrainPerAttempt = 5;
100-
const expectedRetryAttemptsPerRequest = 7;
100+
const expectedRetryAttemptsPerRequest = 6;
101+
// Set maxAttempts to one more than the number of retries (initial request + retries)
102+
const maxAttempts = 7;
101103
const delayPerRetry = 1;
102104
const expectedRequests = 4;
103105
const expectedRemainingCapacity =
104106
expectedInitialCapacity - expectedDrainPerAttempt * expectedRetryAttemptsPerRequest * expectedRequests;
105107

106-
const retryStrategy = new ConfiguredRetryStrategy(expectedRetryAttemptsPerRequest, delayPerRetry);
108+
const retryStrategy = new ConfiguredRetryStrategy(maxAttempts, delayPerRetry);
107109
const s3 = new S3({
108110
requestHandler: new MockRequestHandler(),
109111
retryStrategy,

0 commit comments

Comments
 (0)