@@ -272,13 +272,32 @@ func (a awsStorageClient) QueryPages(ctx context.Context, query IndexQuery, call
272
272
}
273
273
274
274
request := a .queryRequestFn (ctx , input )
275
- backoff := minBackoff
276
275
pageCount := 0
277
276
defer func () {
278
277
dynamoQueryPagesCount .Observe (float64 (pageCount ))
279
278
}()
279
+
280
280
for page := request ; page != nil ; page = page .NextPage () {
281
281
pageCount ++
282
+
283
+ response , err := a .queryPage (ctx , input , page )
284
+ if err != nil {
285
+ return err
286
+ }
287
+
288
+ if getNextPage := callback (response , ! page .HasNextPage ()); ! getNextPage {
289
+ if err != nil {
290
+ return fmt .Errorf ("QueryPages error: table=%v, err=%v" , * input .TableName , page .Error ())
291
+ }
292
+ return nil
293
+ }
294
+ }
295
+ return nil
296
+ }
297
+
298
+ func (a awsStorageClient ) queryPage (ctx context.Context , input * dynamodb.QueryInput , page dynamoDBRequest ) (dynamoDBReadResponse , error ) {
299
+ backoff := minBackoff
300
+ for i := 0 ; i < maxRetries ; i ++ {
282
301
err := instrument .TimeRequestHistogram (ctx , "DynamoDB.QueryPages" , dynamoRequestDuration , func (_ context.Context ) error {
283
302
return page .Send ()
284
303
})
@@ -290,28 +309,18 @@ func (a awsStorageClient) QueryPages(ctx context.Context, query IndexQuery, call
290
309
291
310
if err != nil {
292
311
recordDynamoError (* input .TableName , err , "DynamoDB.QueryPages" )
293
-
294
312
if awsErr , ok := err .(awserr.Error ); ok && ((awsErr .Code () == dynamodb .ErrCodeProvisionedThroughputExceededException ) || page .Retryable ()) {
295
313
time .Sleep (backoff )
296
314
backoff = nextBackoff (backoff )
297
315
continue
298
316
}
299
-
300
- return fmt .Errorf ("QueryPages error: table=%v, err=%v" , * input .TableName , err )
317
+ return nil , fmt .Errorf ("QueryPage error: table=%v, err=%v" , * input .TableName , err )
301
318
}
302
319
303
320
queryOutput := page .Data ().(* dynamodb.QueryOutput )
304
- if getNextPage := callback (dynamoDBReadResponse (queryOutput .Items ), ! page .HasNextPage ()); ! getNextPage {
305
- if err != nil {
306
- return fmt .Errorf ("QueryPages error: table=%v, err=%v" , * input .TableName , page .Error ())
307
- }
308
- return nil
309
- }
310
-
311
- backoff = minBackoff
321
+ return dynamoDBReadResponse (queryOutput .Items ), nil
312
322
}
313
-
314
- return nil
323
+ return nil , fmt .Errorf ("QueryPage error: maxRetries exceeded for table %v" , * input .TableName )
315
324
}
316
325
317
326
type dynamoDBRequest interface {
0 commit comments