@@ -238,36 +238,40 @@ impl S3Storage {
238
238
res. e_tag . map ( ETag ) ,
239
239
) )
240
240
}
241
- Err ( e) => {
242
- match e {
243
- SdkError :: ServiceError ( err) => {
244
- let inner = err. into_err ( ) ;
245
- match & inner {
246
- aws_sdk_s3:: operation:: get_object:: GetObjectError :: NoSuchKey ( _) => {
247
- Err ( StorageError :: NotFound {
248
- path : key. to_string ( ) ,
249
- source : Arc :: new ( inner) ,
250
- } )
251
- }
252
- aws_sdk_s3:: operation:: get_object:: GetObjectError :: InvalidObjectState ( msg) => {
253
- tracing:: error!( "invalid object state: {}" , msg) ;
254
- Err ( StorageError :: Generic {
255
- source : Arc :: new ( inner) ,
256
- } )
257
- }
258
- _ => {
241
+ Err ( e) => match e {
242
+ SdkError :: ServiceError ( err) => {
243
+ let inner = err. into_err ( ) ;
244
+ match & inner {
245
+ aws_sdk_s3:: operation:: get_object:: GetObjectError :: NoSuchKey ( _) => {
246
+ Err ( StorageError :: NotFound {
247
+ path : key. to_string ( ) ,
248
+ source : Arc :: new ( inner) ,
249
+ } )
250
+ }
251
+ aws_sdk_s3:: operation:: get_object:: GetObjectError :: InvalidObjectState (
252
+ msg,
253
+ ) => {
254
+ tracing:: error!( "invalid object state: {}" , msg) ;
255
+ Err ( StorageError :: Generic {
256
+ source : Arc :: new ( inner) ,
257
+ } )
258
+ }
259
+ _ => {
260
+ if inner. code ( ) == Some ( "SlowDown" ) {
261
+ Err ( StorageError :: Backoff )
262
+ } else {
259
263
tracing:: error!( "error: {}" , inner. to_string( ) ) ;
260
264
Err ( StorageError :: Generic {
261
265
source : Arc :: new ( inner) ,
262
266
} )
263
267
}
264
268
}
265
269
}
266
- _ => Err ( StorageError :: Generic {
267
- source : Arc :: new ( e) ,
268
- } ) ,
269
270
}
270
- }
271
+ _ => Err ( StorageError :: Generic {
272
+ source : Arc :: new ( e) ,
273
+ } ) ,
274
+ } ,
271
275
}
272
276
}
273
277
@@ -350,9 +354,13 @@ impl S3Storage {
350
354
} )
351
355
}
352
356
_ => {
353
- Err ( StorageError :: Generic {
354
- source : Arc :: new ( inner) ,
355
- } )
357
+ if inner. code ( ) == Some ( "SlowDown" ) {
358
+ Err ( StorageError :: Backoff )
359
+ } else {
360
+ Err ( StorageError :: Generic {
361
+ source : Arc :: new ( inner) ,
362
+ } )
363
+ }
356
364
}
357
365
}
358
366
}
@@ -602,6 +610,8 @@ impl S3Storage {
602
610
path : key. to_string ( ) ,
603
611
source : Arc :: new ( err) ,
604
612
}
613
+ } else if err. meta ( ) . code ( ) == Some ( "SlowDown" ) {
614
+ StorageError :: Backoff
605
615
} else {
606
616
StorageError :: Generic {
607
617
source : Arc :: new ( err) ,
@@ -793,6 +803,7 @@ impl S3Storage {
793
803
path : key. to_string ( ) ,
794
804
source : Arc :: new ( inner) ,
795
805
} ) ,
806
+ Some ( "SlowDown" ) => Err ( StorageError :: Backoff ) ,
796
807
_ => {
797
808
tracing:: error!( error = %inner, key = %key, "Failed to delete object from S3" ) ;
798
809
Err ( StorageError :: Generic {
@@ -864,9 +875,15 @@ impl S3Storage {
864
875
tracing:: trace!( "Successfully deleted objects from S3" ) ;
865
876
Ok ( out)
866
877
}
867
- Err ( e) => Err ( StorageError :: Generic {
868
- source : Arc :: new ( e) ,
869
- } ) ,
878
+ Err ( e) => {
879
+ if e. code ( ) == Some ( "SlowDown" ) {
880
+ Err ( StorageError :: Backoff )
881
+ } else {
882
+ Err ( StorageError :: Generic {
883
+ source : Arc :: new ( e) ,
884
+ } )
885
+ }
886
+ }
870
887
}
871
888
}
872
889
0 commit comments