Skip to content

feat(retries): SRA retries #4187

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/middleware-retry/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@
"@aws-sdk/service-error-classification": "*",
"@aws-sdk/types": "*",
"@aws-sdk/util-middleware": "*",
"@aws-sdk/util-retry": "*",
"tslib": "^2.3.1",
"uuid": "^8.3.2"
},
"devDependencies": {
"@aws-sdk/node-config-provider": "*",
"@aws-sdk/util-retry": "*",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't need this in devDeps, should be deps only

"@tsconfig/recommended": "1.0.1",
"@types/uuid": "^8.3.0",
"concurrently": "7.0.0",
Expand Down
7 changes: 3 additions & 4 deletions packages/middleware-retry/src/AdaptiveRetryStrategy.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { DefaultRateLimiter, RateLimiter, RETRY_MODES, RetryQuota } from "@aws-sdk/util-retry";

import { AdaptiveRetryStrategy } from "./AdaptiveRetryStrategy";
import { RETRY_MODES } from "./config";
import { DefaultRateLimiter } from "./DefaultRateLimiter";
import { StandardRetryStrategy } from "./StandardRetryStrategy";
import { RateLimiter, RetryQuota } from "./types";

jest.mock("./StandardRetryStrategy");
jest.mock("./DefaultRateLimiter");
jest.mock("@aws-sdk/util-retry");

describe(AdaptiveRetryStrategy.name, () => {
const maxAttemptsProvider = jest.fn();
Expand Down
7 changes: 4 additions & 3 deletions packages/middleware-retry/src/AdaptiveRetryStrategy.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider } from "@aws-sdk/types";
import { DefaultRateLimiter, RateLimiter, RETRY_MODES } from "@aws-sdk/util-retry";

import { RETRY_MODES } from "./config";
import { DefaultRateLimiter } from "./DefaultRateLimiter";
import { StandardRetryStrategy, StandardRetryStrategyOptions } from "./StandardRetryStrategy";
import { RateLimiter } from "./types";

/**
* Strategy options to be passed to AdaptiveRetryStrategy
Expand All @@ -12,6 +10,9 @@ export interface AdaptiveRetryStrategyOptions extends StandardRetryStrategyOptio
rateLimiter?: RateLimiter;
}

/**
* @deprected use AdaptiveRetryStrategy from @aws-sdk/util-retry
*/
export class AdaptiveRetryStrategy extends StandardRetryStrategy {
private rateLimiter: RateLimiter;

Expand Down
11 changes: 8 additions & 3 deletions packages/middleware-retry/src/StandardRetryStrategy.spec.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
import { HttpRequest, HttpResponse } from "@aws-sdk/protocol-http";
import { isThrottlingError } from "@aws-sdk/service-error-classification";
import {
DEFAULT_MAX_ATTEMPTS,
DEFAULT_RETRY_DELAY_BASE,
INITIAL_RETRY_TOKENS,
RETRY_MODES,
RetryQuota,
THROTTLING_RETRY_DELAY_BASE,
} from "@aws-sdk/util-retry";
import { v4 } from "uuid";

import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from "./config";
import { DEFAULT_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, THROTTLING_RETRY_DELAY_BASE } from "./constants";
import { getDefaultRetryQuota } from "./defaultRetryQuota";
import { defaultDelayDecider } from "./delayDecider";
import { defaultRetryDecider } from "./retryDecider";
import { StandardRetryStrategy } from "./StandardRetryStrategy";
import { RetryQuota } from "./types";

jest.mock("@aws-sdk/service-error-classification");
jest.mock("./delayDecider");
Expand Down
16 changes: 11 additions & 5 deletions packages/middleware-retry/src/StandardRetryStrategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@ import { HttpRequest, HttpResponse } from "@aws-sdk/protocol-http";
import { isThrottlingError } from "@aws-sdk/service-error-classification";
import { SdkError } from "@aws-sdk/types";
import { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider, RetryStrategy } from "@aws-sdk/types";
import { v4 } from "uuid";

import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from "./config";
import {
DEFAULT_MAX_ATTEMPTS,
DEFAULT_RETRY_DELAY_BASE,
DelayDecider,
INITIAL_RETRY_TOKENS,
INVOCATION_ID_HEADER,
REQUEST_HEADER,
RETRY_MODES,
RetryDecider,
RetryQuota,
THROTTLING_RETRY_DELAY_BASE,
} from "./constants";
} from "@aws-sdk/util-retry";
import { v4 } from "uuid";

import { getDefaultRetryQuota } from "./defaultRetryQuota";
import { defaultDelayDecider } from "./delayDecider";
import { defaultRetryDecider } from "./retryDecider";
import { DelayDecider, RetryDecider, RetryQuota } from "./types";

/**
* Strategy options to be passed to StandardRetryStrategy
Expand All @@ -26,6 +29,9 @@ export interface StandardRetryStrategyOptions {
retryQuota?: RetryQuota;
}

/**
* @deprected use StandardRetryStrategy from @aws-sdk/util-retry
*/
export class StandardRetryStrategy implements RetryStrategy {
private retryDecider: RetryDecider;
private delayDecider: DelayDecider;
Expand Down
7 changes: 2 additions & 5 deletions packages/middleware-retry/src/configurations.spec.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
import { normalizeProvider } from "@aws-sdk/util-middleware";
import { AdaptiveRetryStrategy, DEFAULT_MAX_ATTEMPTS, StandardRetryStrategy } from "@aws-sdk/util-retry";

import { AdaptiveRetryStrategy } from "./AdaptiveRetryStrategy";
import { DEFAULT_MAX_ATTEMPTS } from "./config";
import {
CONFIG_MAX_ATTEMPTS,
ENV_MAX_ATTEMPTS,
NODE_MAX_ATTEMPT_CONFIG_OPTIONS,
resolveRetryConfig,
} from "./configurations";
import { StandardRetryStrategy } from "./StandardRetryStrategy";

jest.mock("./AdaptiveRetryStrategy");
jest.mock("./StandardRetryStrategy");
jest.mock("@aws-sdk/util-middleware");
jest.mock("@aws-sdk/util-retry");

describe(resolveRetryConfig.name, () => {
const retryMode = jest.fn() as any;
Expand Down
22 changes: 13 additions & 9 deletions packages/middleware-retry/src/configurations.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import { LoadedConfigSelectors } from "@aws-sdk/node-config-provider";
import { Provider, RetryStrategy } from "@aws-sdk/types";
import { Provider, RetryStrategy, RetryStrategyV2 } from "@aws-sdk/types";
import { normalizeProvider } from "@aws-sdk/util-middleware";

import { AdaptiveRetryStrategy } from "./AdaptiveRetryStrategy";
import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE, RETRY_MODES } from "./config";
import { StandardRetryStrategy } from "./StandardRetryStrategy";
import {
AdaptiveRetryStrategy,
DEFAULT_MAX_ATTEMPTS,
DEFAULT_RETRY_MODE,
RETRY_MODES,
StandardRetryStrategy,
} from "@aws-sdk/util-retry";

export const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS";
export const CONFIG_MAX_ATTEMPTS = "max_attempts";
Expand Down Expand Up @@ -39,7 +42,7 @@ export interface RetryInputConfig {
/**
* The strategy to retry the request. Using built-in exponential backoff strategy by default.
*/
retryStrategy?: RetryStrategy;
retryStrategy?: RetryStrategy | RetryStrategyV2;
}

interface PreviouslyResolved {
Expand All @@ -58,17 +61,18 @@ export interface RetryResolvedConfig {
/**
* Resolved value for input config {@link RetryInputConfig.retryStrategy}
*/
retryStrategy: Provider<RetryStrategy>;
retryStrategy: Provider<RetryStrategyV2 | RetryStrategy>;
}

export const resolveRetryConfig = <T>(input: T & PreviouslyResolved & RetryInputConfig): T & RetryResolvedConfig => {
const { retryStrategy } = input;
const maxAttempts = normalizeProvider(input.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
return {
...input,
maxAttempts,
retryStrategy: async () => {
if (input.retryStrategy) {
return input.retryStrategy;
if (retryStrategy) {
return retryStrategy;
}
const retryMode = await normalizeProvider(input.retryMode)();
if (retryMode === RETRY_MODES.ADAPTIVE) {
Expand Down
2 changes: 1 addition & 1 deletion packages/middleware-retry/src/defaultRetryQuota.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { SdkError } from "@aws-sdk/types";
import { INITIAL_RETRY_TOKENS, NO_RETRY_INCREMENT, RETRY_COST, TIMEOUT_RETRY_COST } from "@aws-sdk/util-retry";

import { INITIAL_RETRY_TOKENS, NO_RETRY_INCREMENT, RETRY_COST, TIMEOUT_RETRY_COST } from "./constants";
import { getDefaultRetryQuota } from "./defaultRetryQuota";

describe("defaultRetryQuota", () => {
Expand Down
4 changes: 1 addition & 3 deletions packages/middleware-retry/src/defaultRetryQuota.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import { SdkError } from "@aws-sdk/types";

import { NO_RETRY_INCREMENT, RETRY_COST, TIMEOUT_RETRY_COST } from "./constants";
import { RetryQuota } from "./types";
import { NO_RETRY_INCREMENT, RETRY_COST, RetryQuota, TIMEOUT_RETRY_COST } from "@aws-sdk/util-retry";

export interface DefaultRetryQuotaOptions {
/**
Expand Down
3 changes: 2 additions & 1 deletion packages/middleware-retry/src/delayDecider.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { MAXIMUM_RETRY_DELAY } from "./constants";
import { MAXIMUM_RETRY_DELAY } from "@aws-sdk/util-retry";

import { defaultDelayDecider } from "./delayDecider";

describe("defaultDelayDecider", () => {
Expand Down
2 changes: 1 addition & 1 deletion packages/middleware-retry/src/delayDecider.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { MAXIMUM_RETRY_DELAY } from "./constants";
import { MAXIMUM_RETRY_DELAY } from "@aws-sdk/util-retry";

/**
* Calculate a capped, fully-jittered exponential backoff time.
Expand Down
3 changes: 0 additions & 3 deletions packages/middleware-retry/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
export * from "./AdaptiveRetryStrategy";
export * from "./DefaultRateLimiter";
export * from "./StandardRetryStrategy";
export * from "./config";
export * from "./configurations";
export * from "./delayDecider";
export * from "./omitRetryHeadersMiddleware";
export * from "./retryDecider";
export * from "./retryMiddleware";
export * from "./types";
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { HttpRequest } from "@aws-sdk/protocol-http";
import { FinalizeHandlerArguments, MiddlewareStack } from "@aws-sdk/types";
import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "@aws-sdk/util-retry";

import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "./constants";
import {
getOmitRetryHeadersPlugin,
omitRetryHeadersMiddleware,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import {
Pluggable,
RelativeMiddlewareOptions,
} from "@aws-sdk/types";

import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "./constants";
import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "@aws-sdk/util-retry";

export const omitRetryHeadersMiddleware =
() =>
Expand Down
Loading