@@ -363,51 +363,22 @@ public void flush() {
363
363
364
364
if (failedRequestsCanRetry .isEmpty () || backoffPolicy .equals (BackoffPolicy .noBackoff ())) {
365
365
// Total success! ...or there's no retry policy implemented. Either way, can call
366
- // listener after bulk
367
- if (listener != null ) {
368
- listenerInProgressCount .incrementAndGet ();
369
- scheduler .submit (() -> {
370
- try {
371
- listener .afterBulk (exec .id , exec .request , exec .contexts , resp );
372
- } finally {
373
- if (listenerInProgressCount .decrementAndGet () == 0 ) {
374
- closeCondition .signalIfReady ();
375
- }
376
- }
377
- });
378
- }
366
+ listenerAfterBulkSuccess (resp , exec );
379
367
} else {
380
368
// Partial success, retrying failed requests if policy allows it
381
- // Keeping list of retryables, to exclude them for calling listener later
369
+ // Keeping list of retryable requests/responses, to exclude them for calling
370
+ // listener later
382
371
List <BulkOperationRepeatable <Context >> retryableReq = new ArrayList <>();
383
372
List <BulkOperationRepeatable <Context >> refires = new ArrayList <>();
384
373
List <BulkResponseItem > retryableResp = new ArrayList <>();
374
+
385
375
for (BulkResponseItem bulkItemResponse : failedRequestsCanRetry ) {
386
376
int index = resp .items ().indexOf (bulkItemResponse );
387
- // Getting original failed, requests and keeping successful ones to send to the
388
- // listener
389
- BulkOperationRepeatable <Context > original = sentRequests .get (index );
390
- if (original .canRetry ()) {
391
- retryableResp .add (bulkItemResponse );
392
- Iterator <Long > retries =
393
- Optional .ofNullable (original .getRetries ()).orElse (backoffPolicy .iterator ());
394
- BulkOperationRepeatable <Context > refire =
395
- new BulkOperationRepeatable <>(original .getOperation (),
396
- original .getContext (), retries );
397
- retryableReq .add (original );
398
- refires .add (refire );
399
- addRetry (refire );
400
- logger .warn ("Added failed request back in queue, retrying in : " + refire .getCurrentRetryTimeDelay () + " ms" );
401
- // TODO remove after checking
402
- assert (bulkItemResponse .operationType ().toString ().equals (sentRequests .get (index ).getOperation ()._kind ().toString ()));
403
- } else {
404
- logger .warn ("Retries finished for request: " + original .getOperation ()._kind ().toString ());
405
- }
377
+ selectingRetries (index , bulkItemResponse , sentRequests , retryableResp ,
378
+ retryableReq , refires );
406
379
}
407
380
// Scheduling flushes for just sent out retryable requests
408
381
if (!refires .isEmpty ()) {
409
- // if size <= 3, all times
410
- // if size > 3, schedule just first, last and median
411
382
scheduleRetries (refires );
412
383
}
413
384
// Retrieving list of remaining successful or not retryable requests
@@ -450,18 +421,7 @@ public void flush() {
450
421
}
451
422
} else {
452
423
// Failure
453
- if (listener != null ) {
454
- listenerInProgressCount .incrementAndGet ();
455
- scheduler .submit (() -> {
456
- try {
457
- listener .afterBulk (exec .id , exec .request , exec .contexts , thr );
458
- } finally {
459
- if (listenerInProgressCount .decrementAndGet () == 0 ) {
460
- closeCondition .signalIfReady ();
461
- }
462
- }
463
- });
464
- }
424
+ listenerAfterBulkException (thr , exec );
465
425
}
466
426
467
427
sendRequestCondition .signalIfReadyAfter (() -> {
@@ -473,6 +433,58 @@ public void flush() {
473
433
}
474
434
}
475
435
436
+ private void selectingRetries (int index , BulkResponseItem bulkItemResponse ,
437
+ List <BulkOperationRepeatable <Context >> sentRequests ,
438
+ List <BulkResponseItem > retryableResp ,
439
+ List <BulkOperationRepeatable <Context >> retryableReq ,
440
+ List <BulkOperationRepeatable <Context >> refires ) {
441
+
442
+ // Getting original failed, requests and keeping successful ones to send to the listener
443
+ BulkOperationRepeatable <Context > original = sentRequests .get (index );
444
+ if (original .canRetry ()) {
445
+ retryableResp .add (bulkItemResponse );
446
+ Iterator <Long > retries =
447
+ Optional .ofNullable (original .getRetries ()).orElse (backoffPolicy .iterator ());
448
+ BulkOperationRepeatable <Context > refire = new BulkOperationRepeatable <>(original .getOperation (), original .getContext (), retries );
449
+ retryableReq .add (original );
450
+ refires .add (refire );
451
+ addRetry (refire );
452
+ logger .warn ("Added failed request back in queue, retrying in : " + refire .getCurrentRetryTimeDelay () + " ms" );
453
+ } else {
454
+ logger .warn ("Retries finished for request: " + original .getOperation ()._kind ().toString ());
455
+ }
456
+ }
457
+
458
+ private void listenerAfterBulkException (Throwable thr , RequestExecution <Context > exec ) {
459
+ if (listener != null ) {
460
+ listenerInProgressCount .incrementAndGet ();
461
+ scheduler .submit (() -> {
462
+ try {
463
+ listener .afterBulk (exec .id , exec .request , exec .contexts , thr );
464
+ } finally {
465
+ if (listenerInProgressCount .decrementAndGet () == 0 ) {
466
+ closeCondition .signalIfReady ();
467
+ }
468
+ }
469
+ });
470
+ }
471
+ }
472
+
473
+ private void listenerAfterBulkSuccess (BulkResponse resp , RequestExecution <Context > exec ) {
474
+ if (listener != null ) {
475
+ listenerInProgressCount .incrementAndGet ();
476
+ scheduler .submit (() -> {
477
+ try {
478
+ listener .afterBulk (exec .id , exec .request , exec .contexts , resp );
479
+ } finally {
480
+ if (listenerInProgressCount .decrementAndGet () == 0 ) {
481
+ closeCondition .signalIfReady ();
482
+ }
483
+ }
484
+ });
485
+ }
486
+ }
487
+
476
488
private void scheduleRetries (List <BulkOperationRepeatable <Context >> retryableReq ) {
477
489
List <Long > sortedDelays = retryableReq .stream ()
478
490
.map (BulkOperationRepeatable ::getCurrentRetryTimeDelay )
@@ -696,7 +708,10 @@ public Builder<Context> listener(BulkListener<Context> listener) {
696
708
return this ;
697
709
}
698
710
699
-
711
+ /**
712
+ * Sets the backoff policy that will handle retries for error 429: too many requests.
713
+ * All the times are defined in milliseconds.
714
+ */
700
715
public Builder <Context > backoffPolicy (BackoffPolicy backoffPolicy ) {
701
716
this .backoffPolicy = backoffPolicy ;
702
717
return this ;
0 commit comments