@@ -162,24 +162,43 @@ private async Task<BulkAllResponse> BulkAsync(IList<T> buffer, long page, int ba
162162
163163 var retryableDocuments = new List < T > ( ) ;
164164 var droppedDocuments = new List < Tuple < BulkResponseItemBase , T > > ( ) ;
165+ var retryableDocsRemainingAfterRetriesExceeded = false ;
165166
166167 foreach ( var documentWithResponse in response . Items . Zip ( buffer , Tuple . Create ) )
167168 {
168- if ( documentWithResponse . Item1 . IsValid ) continue ;
169+ if ( documentWithResponse . Item1 . IsValid )
170+ continue ;
169171
170172 if ( _retryPredicate ( documentWithResponse . Item1 , documentWithResponse . Item2 ) )
171- retryableDocuments . Add ( documentWithResponse . Item2 ) ;
173+ {
174+ if ( backOffRetries < _backOffRetries )
175+ {
176+ retryableDocuments . Add ( documentWithResponse . Item2 ) ;
177+ }
178+ else
179+ {
180+ // We still have retriable documents but have exceeded all retries, so we mark these as
181+ // dropped so they get handled correctly.
182+ retryableDocsRemainingAfterRetriesExceeded = true ;
183+ droppedDocuments . Add ( documentWithResponse ) ;
184+ }
185+ }
172186 else
187+ {
173188 droppedDocuments . Add ( documentWithResponse ) ;
189+ }
174190 }
175191
176192 HandleDroppedDocuments ( droppedDocuments , response ) ;
177193
178- if ( retryableDocuments . Count > 0 && backOffRetries < _backOffRetries )
194+ if ( retryableDocsRemainingAfterRetriesExceeded )
195+ {
196+ throw ThrowOnBadBulk ( response , $ "Bulk indexing failed and after retrying { backOffRetries } times.") ;
197+ }
198+ else if ( retryableDocuments . Count > 0 )
199+ {
179200 return await RetryDocuments ( page , ++ backOffRetries , retryableDocuments ) . ConfigureAwait ( false ) ;
180-
181- if ( retryableDocuments . Count > 0 )
182- throw ThrowOnBadBulk ( response , $ "Bulk indexing failed and after retrying { backOffRetries } times") ;
201+ }
183202
184203 request . BackPressure ? . Release ( ) ;
185204
0 commit comments