diff --git a/packages/util-waiter/src/poller.spec.ts b/packages/util-waiter/src/poller.spec.ts index 366536104583..4359e5d2323f 100644 --- a/packages/util-waiter/src/poller.spec.ts +++ b/packages/util-waiter/src/poller.spec.ts @@ -49,18 +49,16 @@ describe(runPolling.name, () => { expect(mockAcceptorChecks).toHaveBeenCalled(); expect(mockAcceptorChecks).toHaveBeenCalledTimes(1); expect(mockAcceptorChecks).toHaveBeenCalledWith(config.client, input); - - expect(sleep).toHaveBeenCalled(); - expect(sleep).toHaveBeenCalledTimes(1); - expect(sleep).toHaveBeenCalledWith(config.minDelay); + expect(sleep).toHaveBeenCalledTimes(0); }); it("returns state in case of success", async () => { mockAcceptorChecks = jest.fn().mockResolvedValueOnce(successState); await expect(runPolling(config, input, mockAcceptorChecks)).resolves.toStrictEqual(successState); - expect(sleep).toHaveBeenCalled(); - expect(sleep).toHaveBeenCalledTimes(1); - expect(sleep).toHaveBeenCalledWith(config.minDelay); + expect(mockAcceptorChecks).toHaveBeenCalled(); + expect(mockAcceptorChecks).toHaveBeenCalledTimes(1); + expect(mockAcceptorChecks).toHaveBeenCalledWith(config.client, input); + expect(sleep).toHaveBeenCalledTimes(0); }); it("sleeps as per exponentialBackoff in case of retry", async () => { @@ -72,11 +70,13 @@ describe(runPolling.name, () => { .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) + .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(successState); await expect(runPolling(config, input, mockAcceptorChecks)).resolves.toStrictEqual(successState); expect(sleep).toHaveBeenCalled(); + expect(mockAcceptorChecks).toHaveBeenCalledTimes(8); expect(sleep).toHaveBeenCalledTimes(7); expect(sleep).toHaveBeenNthCalledWith(1, 2); // min delay. random(2, 2) expect(sleep).toHaveBeenNthCalledWith(2, 3); // random(2, 4) diff --git a/packages/util-waiter/src/poller.ts b/packages/util-waiter/src/poller.ts index ed1997281bc6..c01e261eb052 100644 --- a/packages/util-waiter/src/poller.ts +++ b/packages/util-waiter/src/poller.ts @@ -13,7 +13,8 @@ const exponentialBackoffWithJitter = (minDelay: number, maxDelay: number, attemp const randomInRange = (min: number, max: number) => min + Math.random() * (max - min); /** - * Function that runs indefinite polling as part of waiters. + * Function that runs polling as part of waiters. This will make one inital attempt and then + * subsequent attempts with an increasing delay. * @param params options passed to the waiter. * @param client AWS SDK Client * @param input client input @@ -24,6 +25,11 @@ export const runPolling = async ( input: Input, acceptorChecks: (client: Client, input: Input) => Promise ): Promise => { + const { state } = await acceptorChecks(client, input); + if (state !== WaiterState.RETRY) { + return { state }; + } + let currentAttempt = 1; const waitUntil = Date.now() + maxWaitTime * 1000; // The max attempt number that the derived delay time tend to increase.