Skip to content

Commit da52e73

Browse files
authored
Merge pull request #142 from egeniq-forks/develop
Retry behaviour for when a previous change is still in progress
2 parents b4035e3 + c2cc717 commit da52e73

File tree

1 file changed

+27
-1
lines changed

1 file changed

+27
-1
lines changed

src/stageCache.js

+27-1
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,38 @@ const updateStageFor = async (serverless, params, stage, region) => {
196196

197197
for (let index in paramsInChunks) {
198198
serverless.cli.log(`[serverless-api-gateway-caching] Updating API Gateway cache settings (${parseInt(index) + 1} of ${paramsInChunks.length}).`);
199-
await serverless.providers.aws.request('APIGateway', 'updateStage', paramsInChunks[index], stage, region);
199+
await applyUpdateStageForChunk(paramsInChunks[index], serverless, stage, region);
200200
}
201201

202202
serverless.cli.log(`[serverless-api-gateway-caching] Done updating API Gateway cache settings.`);
203203
}
204204

205+
const applyUpdateStageForChunk = async (chunk, serverless, stage, region) => {
206+
const maxRetries = 10;
207+
const baseDelay = 500;
208+
let attempt = 0;
209+
210+
while (attempt <= maxRetries) {
211+
try {
212+
serverless.cli.log(`[serverless-api-gateway-caching] Updating API Gateway cache settings. Attempt ${attempt + 1}.`);
213+
await serverless.providers.aws.request('APIGateway', 'updateStage', chunk, stage, region);
214+
break;
215+
} catch (error) {
216+
if (
217+
attempt < maxRetries &&
218+
error.message.includes('A previous change is still in progress')
219+
) {
220+
attempt++;
221+
const delay = baseDelay * 2 ** (attempt - 1);
222+
serverless.cli.log(`[serverless-api-gateway-caching] Retrying (${attempt}/${maxRetries}) after ${delay}ms due to error: ${error.message}`);
223+
await new Promise((resolve) => setTimeout(resolve, delay));
224+
} else {
225+
throw new Error(`Failed to update API Gateway cache settings after ${attempt} retries: ${error.message}`);
226+
}
227+
}
228+
}
229+
}
230+
205231
const updateStageCacheSettings = async (settings, serverless) => {
206232
// do nothing if caching settings are not defined
207233
if (settings.cachingEnabled == undefined) {

0 commit comments

Comments
 (0)