@@ -33,12 +33,13 @@ type S3Storage struct {
33
33
// NewS3Storage return new configured S3 storage.
34
34
//
35
35
// You should always create new storage with this constructor.
36
- func NewS3Storage (awsAccessKey , awsSecretKey , awsToken , awsRegion , endpoint , bucketName , prefix string , keysPerReq int64 , retryCnt uint , retryInterval time.Duration ) * S3Storage {
36
+ func NewS3Storage (awsAccessKey , awsSecretKey , awsToken , awsRegion , endpoint , bucketName , prefix string , keysPerReq int64 , retryCnt uint , retryDelay time.Duration ) * S3Storage {
37
37
sess := session .Must (session .NewSessionWithOptions (session.Options {
38
38
SharedConfigState : session .SharedConfigEnable ,
39
39
}))
40
40
sess .Config .S3ForcePathStyle = aws .Bool (true )
41
41
sess .Config .Region = aws .String (awsRegion )
42
+ sess .Config .Retryer = & Retryer {RetryCnt : retryCnt , RetryDelay : retryDelay }
42
43
43
44
if awsAccessKey != "" || awsSecretKey != "" {
44
45
sess .Config .Credentials = credentials .NewStaticCredentials (awsAccessKey , awsSecretKey , awsToken )
@@ -66,7 +67,7 @@ func NewS3Storage(awsAccessKey, awsSecretKey, awsToken, awsRegion, endpoint, buc
66
67
prefix : prefix ,
67
68
keysPerReq : keysPerReq ,
68
69
retryCnt : retryCnt ,
69
- retryInterval : retryInterval ,
70
+ retryInterval : retryDelay ,
70
71
ctx : context .TODO (),
71
72
rlBucket : ratelimit .NewFakeBucket (),
72
73
}
@@ -107,30 +108,20 @@ func (st *S3Storage) List(output chan<- *storage.Object) error {
107
108
return ! lastPage // continue paging
108
109
}
109
110
110
- for i := uint (0 ); ; i ++ {
111
- input := & s3.ListObjectsInput {
112
- Bucket : st .awsBucket ,
113
- Prefix : aws .String (st .prefix ),
114
- MaxKeys : aws .Int64 (st .keysPerReq ),
115
- EncodingType : aws .String (s3 .EncodingTypeUrl ),
116
- Marker : st .listMarker ,
117
- }
111
+ input := & s3.ListObjectsInput {
112
+ Bucket : st .awsBucket ,
113
+ Prefix : aws .String (st .prefix ),
114
+ MaxKeys : aws .Int64 (st .keysPerReq ),
115
+ EncodingType : aws .String (s3 .EncodingTypeUrl ),
116
+ Marker : st .listMarker ,
117
+ }
118
118
119
- err := st .awsSvc .ListObjectsPagesWithContext (st .ctx , input , listObjectsFn )
120
- if err == nil {
121
- storage .Log .Debugf ("Listing bucket finished" )
122
- return nil
123
- } else if storage .IsAwsContextCanceled (err ) {
124
- return err
125
- } else if (err != nil ) && (i < st .retryCnt ) {
126
- storage .Log .Debugf ("S3 listing failed with error: %s" , err )
127
- time .Sleep (st .retryInterval )
128
- continue
129
- } else if (err != nil ) && (i == st .retryCnt ) {
130
- storage .Log .Debugf ("S3 listing failed with error: %s" , err )
131
- return err
132
- }
119
+ if err := st .awsSvc .ListObjectsPagesWithContext (st .ctx , input , listObjectsFn ); err != nil {
120
+ return err
133
121
}
122
+ storage .Log .Debugf ("Listing bucket finished" )
123
+ return nil
124
+
134
125
}
135
126
136
127
// PutObject saves object to S3.
@@ -153,22 +144,8 @@ func (st *S3Storage) PutObject(obj *storage.Object) error {
153
144
StorageClass : obj .StorageClass ,
154
145
}
155
146
156
- for i := uint (0 ); ; i ++ {
157
- _ , err := st .awsSvc .PutObjectWithContext (st .ctx , input )
158
- if storage .IsAwsContextCanceled (err ) {
159
- return err
160
- } else if err == nil {
161
- break
162
- } else if (err != nil ) && (i < st .retryCnt ) {
163
- storage .Log .Debugf ("S3 obj uploading failed with error: %s" , err )
164
- time .Sleep (st .retryInterval )
165
- if _ , err := rlReader .Seek (0 ,0 ); err != nil {
166
- return err
167
- }
168
- continue
169
- } else if (err != nil ) && (i == st .retryCnt ) {
170
- return err
171
- }
147
+ if _ , err := st .awsSvc .PutObjectWithContext (st .ctx , input ); err != nil {
148
+ return err
172
149
}
173
150
174
151
if obj .AccessControlPolicy != nil {
@@ -178,19 +155,8 @@ func (st *S3Storage) PutObject(obj *storage.Object) error {
178
155
AccessControlPolicy : obj .AccessControlPolicy ,
179
156
}
180
157
181
- for i := uint (0 ); ; i ++ {
182
- _ , err := st .awsSvc .PutObjectAclWithContext (st .ctx , inputAcl )
183
- if storage .IsAwsContextCanceled (err ) {
184
- return err
185
- } else if err == nil {
186
- break
187
- } else if (err != nil ) && (i < st .retryCnt ) {
188
- storage .Log .Debugf ("S3 ACL uploading failed with error: %s" , err )
189
- time .Sleep (st .retryInterval )
190
- continue
191
- } else if (err != nil ) && (i == st .retryCnt ) {
192
- return err
193
- }
158
+ if _ , err := st .awsSvc .PutObjectAclWithContext (st .ctx , inputAcl ); err != nil {
159
+ return err
194
160
}
195
161
}
196
162
@@ -205,44 +171,29 @@ func (st *S3Storage) GetObjectContent(obj *storage.Object) error {
205
171
VersionId : obj .VersionId ,
206
172
}
207
173
208
- for i := uint (0 ); ; i ++ {
209
- result , err := st .awsSvc .GetObjectWithContext (st .ctx , input )
210
- if storage .IsAwsContextCanceled (err ) {
211
- return err
212
- } else if (err != nil ) && (i < st .retryCnt ) {
213
- storage .Log .Debugf ("S3 obj content downloading request failed with error: %s" , err )
214
- time .Sleep (st .retryInterval )
215
- continue
216
- } else if (err != nil ) && (i == st .retryCnt ) {
217
- return err
218
- }
219
-
220
- buf := bytes .NewBuffer (make ([]byte , 0 , aws .Int64Value (result .ContentLength )))
221
- _ , err = io .Copy (ratelimit .NewWriter (buf , st .rlBucket ), result .Body )
222
- if storage .IsAwsContextCanceled (err ) {
223
- return err
224
- } else if (err != nil ) && (i < st .retryCnt ) {
225
- storage .Log .Debugf ("S3 obj content downloading failed with error: %s" , err )
226
- time .Sleep (st .retryInterval )
227
- continue
228
- } else if (err != nil ) && (i == st .retryCnt ) {
229
- return err
230
- }
174
+ result , err := st .awsSvc .GetObjectWithContext (st .ctx , input )
175
+ if err != nil {
176
+ return err
177
+ }
231
178
232
- data := buf .Bytes ()
233
- obj .Content = & data
234
- obj .ContentType = result .ContentType
235
- obj .ContentDisposition = result .ContentDisposition
236
- obj .ContentEncoding = result .ContentEncoding
237
- obj .ContentLanguage = result .ContentLanguage
238
- obj .ETag = storage .StrongEtag (result .ETag )
239
- obj .Metadata = result .Metadata
240
- obj .Mtime = result .LastModified
241
- obj .CacheControl = result .CacheControl
242
- obj .StorageClass = result .StorageClass
243
-
244
- return nil
179
+ buf := bytes .NewBuffer (make ([]byte , 0 , aws .Int64Value (result .ContentLength )))
180
+ if _ , err := io .Copy (ratelimit .NewWriter (buf , st .rlBucket ), result .Body ); err != nil {
181
+ return err
245
182
}
183
+
184
+ data := buf .Bytes ()
185
+ obj .Content = & data
186
+ obj .ContentType = result .ContentType
187
+ obj .ContentDisposition = result .ContentDisposition
188
+ obj .ContentEncoding = result .ContentEncoding
189
+ obj .ContentLanguage = result .ContentLanguage
190
+ obj .ETag = storage .StrongEtag (result .ETag )
191
+ obj .Metadata = result .Metadata
192
+ obj .Mtime = result .LastModified
193
+ obj .CacheControl = result .CacheControl
194
+ obj .StorageClass = result .StorageClass
195
+
196
+ return nil
246
197
}
247
198
248
199
// GetObjectACL read object ACL from S3.
@@ -253,25 +204,17 @@ func (st *S3Storage) GetObjectACL(obj *storage.Object) error {
253
204
VersionId : obj .VersionId ,
254
205
}
255
206
256
- for i := uint (0 ); ; i ++ {
257
- result , err := st .awsSvc .GetObjectAclWithContext (st .ctx , input )
258
- if storage .IsAwsContextCanceled (err ) {
259
- return err
260
- } else if (err != nil ) && (i < st .retryCnt ) {
261
- storage .Log .Debugf ("S3 obj ACL downloading request failed with error: %s" , err )
262
- time .Sleep (st .retryInterval )
263
- continue
264
- } else if (err != nil ) && (i == st .retryCnt ) {
265
- return err
266
- }
267
-
268
- obj .AccessControlPolicy = & s3.AccessControlPolicy {
269
- Grants : result .Grants ,
270
- Owner : result .Owner ,
271
- }
207
+ result , err := st .awsSvc .GetObjectAclWithContext (st .ctx , input )
208
+ if err != nil {
209
+ return err
210
+ }
272
211
273
- return nil
212
+ obj .AccessControlPolicy = & s3.AccessControlPolicy {
213
+ Grants : result .Grants ,
214
+ Owner : result .Owner ,
274
215
}
216
+
217
+ return nil
275
218
}
276
219
277
220
// GetObjectMeta update object metadata from S3.
@@ -282,30 +225,22 @@ func (st *S3Storage) GetObjectMeta(obj *storage.Object) error {
282
225
VersionId : obj .VersionId ,
283
226
}
284
227
285
- for i := uint (0 ); ; i ++ {
286
- result , err := st .awsSvc .HeadObjectWithContext (st .ctx , input )
287
- if storage .IsAwsContextCanceled (err ) {
288
- return err
289
- } else if (err != nil ) && (i < st .retryCnt ) {
290
- storage .Log .Debugf ("S3 obj meta downloading request failed with error: %s" , err )
291
- time .Sleep (st .retryInterval )
292
- continue
293
- } else if (err != nil ) && (i == st .retryCnt ) {
294
- return err
295
- }
296
-
297
- obj .ContentType = result .ContentType
298
- obj .ContentDisposition = result .ContentDisposition
299
- obj .ContentEncoding = result .ContentEncoding
300
- obj .ContentLanguage = result .ContentLanguage
301
- obj .ETag = storage .StrongEtag (result .ETag )
302
- obj .Metadata = result .Metadata
303
- obj .Mtime = result .LastModified
304
- obj .CacheControl = result .CacheControl
305
- obj .StorageClass = result .StorageClass
306
-
307
- return nil
228
+ result , err := st .awsSvc .HeadObjectWithContext (st .ctx , input )
229
+ if err != nil {
230
+ return err
308
231
}
232
+
233
+ obj .ContentType = result .ContentType
234
+ obj .ContentDisposition = result .ContentDisposition
235
+ obj .ContentEncoding = result .ContentEncoding
236
+ obj .ContentLanguage = result .ContentLanguage
237
+ obj .ETag = storage .StrongEtag (result .ETag )
238
+ obj .Metadata = result .Metadata
239
+ obj .Mtime = result .LastModified
240
+ obj .CacheControl = result .CacheControl
241
+ obj .StorageClass = result .StorageClass
242
+
243
+ return nil
309
244
}
310
245
311
246
// DeleteObject remove object from S3.
@@ -316,19 +251,8 @@ func (st *S3Storage) DeleteObject(obj *storage.Object) error {
316
251
VersionId : obj .VersionId ,
317
252
}
318
253
319
- for i := uint (0 ); ; i ++ {
320
- _ , err := st .awsSvc .DeleteObjectWithContext (st .ctx , input )
321
- if err == nil {
322
- break
323
- } else if storage .IsAwsContextCanceled (err ) {
324
- return err
325
- } else if (err != nil ) && (i < st .retryCnt ) {
326
- storage .Log .Debugf ("S3 obj removing failed with error: %s" , err )
327
- time .Sleep (st .retryInterval )
328
- continue
329
- } else if (err != nil ) && (i == st .retryCnt ) {
330
- return err
331
- }
254
+ if _ , err := st .awsSvc .DeleteObjectWithContext (st .ctx , input ); err != nil {
255
+ return err
332
256
}
333
257
return nil
334
258
}
0 commit comments