@@ -338,9 +338,8 @@ private static boolean isConflictException(final Exception e) {
338
338
/**
339
339
* Creates a new bulk item result from the given requests and result of performing the update operation on the shard.
340
340
*/
341
- static BulkItemResponse processUpdateResponse (final UpdateRequest updateRequest , final String concreteIndex ,
342
- BulkItemResponse operationResponse ,
343
- final UpdateHelper .Result translate ) {
341
+ private static BulkItemResponse processUpdateResponse (final UpdateRequest updateRequest , final String concreteIndex ,
342
+ BulkItemResponse operationResponse , final UpdateHelper .Result translate ) {
344
343
final BulkItemResponse response ;
345
344
DocWriteResponse .Result translatedResult = translate .getResponseResult ();
346
345
if (operationResponse .isFailed ()) {
@@ -382,54 +381,6 @@ static BulkItemResponse processUpdateResponse(final UpdateRequest updateRequest,
382
381
return response ;
383
382
}
384
383
385
-
386
- /** Modes for executing item request on replica depending on corresponding primary execution result */
387
- public enum ReplicaItemExecutionMode {
388
-
389
- /**
390
- * When primary execution succeeded
391
- */
392
- NORMAL ,
393
-
394
- /**
395
- * When primary execution failed before sequence no was generated
396
- * or primary execution was a noop (only possible when request is originating from pre-6.0 nodes)
397
- */
398
- NOOP ,
399
-
400
- /**
401
- * When primary execution failed after sequence no was generated
402
- */
403
- FAILURE
404
- }
405
-
406
- /**
407
- * Determines whether a bulk item request should be executed on the replica.
408
- *
409
- * @return {@link ReplicaItemExecutionMode#NORMAL} upon normal primary execution with no failures
410
- * {@link ReplicaItemExecutionMode#FAILURE} upon primary execution failure after sequence no generation
411
- * {@link ReplicaItemExecutionMode#NOOP} upon primary execution failure before sequence no generation or
412
- * when primary execution resulted in noop (only possible for write requests from pre-6.0 nodes)
413
- */
414
- static ReplicaItemExecutionMode replicaItemExecutionMode (final BulkItemRequest request , final int index ) {
415
- final BulkItemResponse primaryResponse = request .getPrimaryResponse ();
416
- assert primaryResponse != null : "expected primary response to be set for item [" + index + "] request [" + request .request () + "]" ;
417
- if (primaryResponse .isFailed ()) {
418
- return primaryResponse .getFailure ().getSeqNo () != SequenceNumbers .UNASSIGNED_SEQ_NO
419
- ? ReplicaItemExecutionMode .FAILURE // we have a seq no generated with the failure, replicate as no-op
420
- : ReplicaItemExecutionMode .NOOP ; // no seq no generated, ignore replication
421
- } else {
422
- // TODO: once we know for sure that every operation that has been processed on the primary is assigned a seq#
423
- // (i.e., all nodes on the cluster are on v6.0.0 or higher) we can use the existence of a seq# to indicate whether
424
- // an operation should be processed or be treated as a noop. This means we could remove this method and the
425
- // ReplicaItemExecutionMode enum and have a simple boolean check for seq != UNASSIGNED_SEQ_NO which will work for
426
- // both failures and indexing operations.
427
- return primaryResponse .getResponse ().getResult () != DocWriteResponse .Result .NOOP
428
- ? ReplicaItemExecutionMode .NORMAL // execution successful on primary
429
- : ReplicaItemExecutionMode .NOOP ; // ignore replication
430
- }
431
- }
432
-
433
384
@ Override
434
385
public WriteReplicaResult <BulkShardRequest > shardOperationOnReplica (BulkShardRequest request , IndexShard replica ) throws Exception {
435
386
final Translog .Location location = performOnReplica (request , replica );
@@ -442,25 +393,22 @@ public static Translog.Location performOnReplica(BulkShardRequest request, Index
442
393
BulkItemRequest item = request .items ()[i ];
443
394
final Engine .Result operationResult ;
444
395
DocWriteRequest <?> docWriteRequest = item .request ();
445
- switch (replicaItemExecutionMode (item , i )) {
446
- case NORMAL :
447
- final DocWriteResponse primaryResponse = item .getPrimaryResponse ().getResponse ();
448
- operationResult = performOpOnReplica (primaryResponse , docWriteRequest , replica );
449
- assert operationResult != null : "operation result must never be null when primary response has no failure" ;
450
- location = syncOperationResultOrThrow (operationResult , location );
451
- break ;
452
- case NOOP :
453
- break ;
454
- case FAILURE :
455
- final BulkItemResponse .Failure failure = item .getPrimaryResponse ().getFailure ();
456
- assert failure .getSeqNo () != SequenceNumbers .UNASSIGNED_SEQ_NO : "seq no must be assigned" ;
457
- operationResult = replica .markSeqNoAsNoop (failure .getSeqNo (), failure .getMessage ());
458
- assert operationResult != null : "operation result must never be null when primary response has no failure" ;
459
- location = syncOperationResultOrThrow (operationResult , location );
460
- break ;
461
- default :
462
- throw new IllegalStateException ("illegal replica item execution mode for: " + docWriteRequest );
396
+ final BulkItemResponse response = item .getPrimaryResponse ();
397
+ final BulkItemResponse .Failure failure = response .getFailure ();
398
+ final DocWriteResponse writeResponse = response .getResponse ();
399
+ final long seqNum = failure == null ? writeResponse .getSeqNo () : failure .getSeqNo ();
400
+ if (seqNum == SequenceNumbers .UNASSIGNED_SEQ_NO ) {
401
+ assert failure != null || writeResponse .getResult () == DocWriteResponse .Result .NOOP
402
+ || writeResponse .getResult () == DocWriteResponse .Result .NOT_FOUND ;
403
+ continue ;
404
+ }
405
+ if (failure == null ) {
406
+ operationResult = performOpOnReplica (writeResponse , docWriteRequest , replica );
407
+ } else {
408
+ operationResult = replica .markSeqNoAsNoop (seqNum , failure .getMessage ());
463
409
}
410
+ assert operationResult != null : "operation result must never be null when primary response has no failure" ;
411
+ location = syncOperationResultOrThrow (operationResult , location );
464
412
}
465
413
return location ;
466
414
}
0 commit comments