@@ -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+
205231const updateStageCacheSettings = async ( settings , serverless ) => {
206232 // do nothing if caching settings are not defined
207233 if ( settings . cachingEnabled == undefined ) {
0 commit comments