@@ -196,12 +196,38 @@ const updateStageFor = async (serverless, params, stage, region) => {
196
196
197
197
for ( let index in paramsInChunks ) {
198
198
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 ) ;
200
200
}
201
201
202
202
serverless . cli . log ( `[serverless-api-gateway-caching] Done updating API Gateway cache settings.` ) ;
203
203
}
204
204
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
+
205
231
const updateStageCacheSettings = async ( settings , serverless ) => {
206
232
// do nothing if caching settings are not defined
207
233
if ( settings . cachingEnabled == undefined ) {
0 commit comments