@@ -383,54 +383,6 @@ static BulkItemResponse processUpdateResponse(final UpdateRequest updateRequest,
383
383
return response ;
384
384
}
385
385
386
-
387
- /** Modes for executing item request on replica depending on corresponding primary execution result */
388
- public enum ReplicaItemExecutionMode {
389
-
390
- /**
391
- * When primary execution succeeded
392
- */
393
- NORMAL ,
394
-
395
- /**
396
- * When primary execution failed before sequence no was generated
397
- * or primary execution was a noop (only possible when request is originating from pre-6.0 nodes)
398
- */
399
- NOOP ,
400
-
401
- /**
402
- * When primary execution failed after sequence no was generated
403
- */
404
- FAILURE
405
- }
406
-
407
- /**
408
- * Determines whether a bulk item request should be executed on the replica.
409
- *
410
- * @return {@link ReplicaItemExecutionMode#NORMAL} upon normal primary execution with no failures
411
- * {@link ReplicaItemExecutionMode#FAILURE} upon primary execution failure after sequence no generation
412
- * {@link ReplicaItemExecutionMode#NOOP} upon primary execution failure before sequence no generation or
413
- * when primary execution resulted in noop (only possible for write requests from pre-6.0 nodes)
414
- */
415
- static ReplicaItemExecutionMode replicaItemExecutionMode (final BulkItemRequest request , final int index ) {
416
- final BulkItemResponse primaryResponse = request .getPrimaryResponse ();
417
- assert primaryResponse != null : "expected primary response to be set for item [" + index + "] request [" + request .request () + "]" ;
418
- if (primaryResponse .isFailed ()) {
419
- return primaryResponse .getFailure ().getSeqNo () != SequenceNumbers .UNASSIGNED_SEQ_NO
420
- ? ReplicaItemExecutionMode .FAILURE // we have a seq no generated with the failure, replicate as no-op
421
- : ReplicaItemExecutionMode .NOOP ; // no seq no generated, ignore replication
422
- } else {
423
- // TODO: once we know for sure that every operation that has been processed on the primary is assigned a seq#
424
- // (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
425
- // an operation should be processed or be treated as a noop. This means we could remove this method and the
426
- // ReplicaItemExecutionMode enum and have a simple boolean check for seq != UNASSIGNED_SEQ_NO which will work for
427
- // both failures and indexing operations.
428
- return primaryResponse .getResponse ().getResult () != DocWriteResponse .Result .NOOP
429
- ? ReplicaItemExecutionMode .NORMAL // execution successful on primary
430
- : ReplicaItemExecutionMode .NOOP ; // ignore replication
431
- }
432
- }
433
-
434
386
@ Override
435
387
public WriteReplicaResult <BulkShardRequest > shardOperationOnReplica (BulkShardRequest request , IndexShard replica ) throws Exception {
436
388
final Translog .Location location = performOnReplica (request , replica );
@@ -440,28 +392,23 @@ public WriteReplicaResult<BulkShardRequest> shardOperationOnReplica(BulkShardReq
440
392
public static Translog .Location performOnReplica (BulkShardRequest request , IndexShard replica ) throws Exception {
441
393
Translog .Location location = null ;
442
394
for (int i = 0 ; i < request .items ().length ; i ++) {
443
- BulkItemRequest item = request .items ()[i ];
395
+ final BulkItemRequest item = request .items ()[i ];
396
+ final BulkItemResponse response = item .getPrimaryResponse ();
444
397
final Engine .Result operationResult ;
445
- DocWriteRequest <?> docWriteRequest = item .request ();
446
- switch (replicaItemExecutionMode (item , i )) {
447
- case NORMAL :
448
- final DocWriteResponse primaryResponse = item .getPrimaryResponse ().getResponse ();
449
- operationResult = performOpOnReplica (primaryResponse , docWriteRequest , replica );
450
- assert operationResult != null : "operation result must never be null when primary response has no failure" ;
451
- location = syncOperationResultOrThrow (operationResult , location );
452
- break ;
453
- case NOOP :
454
- break ;
455
- case FAILURE :
456
- final BulkItemResponse .Failure failure = item .getPrimaryResponse ().getFailure ();
457
- assert failure .getSeqNo () != SequenceNumbers .UNASSIGNED_SEQ_NO : "seq no must be assigned" ;
458
- operationResult = replica .markSeqNoAsNoop (failure .getSeqNo (), failure .getMessage ());
459
- assert operationResult != null : "operation result must never be null when primary response has no failure" ;
460
- location = syncOperationResultOrThrow (operationResult , location );
461
- break ;
462
- default :
463
- throw new IllegalStateException ("illegal replica item execution mode for: " + docWriteRequest );
398
+ if (item .getPrimaryResponse ().isFailed ()) {
399
+ if (response .getFailure ().getSeqNo () == SequenceNumbers .UNASSIGNED_SEQ_NO ) {
400
+ continue ; // ignore replication as we didn't generate a sequence number for this request.
401
+ }
402
+ operationResult = replica .markSeqNoAsNoop (response .getFailure ().getSeqNo (), response .getFailure ().getMessage ());
403
+ } else {
404
+ if (response .getResponse ().getResult () == DocWriteResponse .Result .NOOP ) {
405
+ continue ; // ignore replication as it's a noop
406
+ }
407
+ assert response .getResponse ().getSeqNo () != SequenceNumbers .UNASSIGNED_SEQ_NO ;
408
+ operationResult = performOpOnReplica (response .getResponse (), item .request (), replica );
464
409
}
410
+ assert operationResult != null : "operation result must never be null when primary response has no failure" ;
411
+ location = syncOperationResultOrThrow (operationResult , location );
465
412
}
466
413
return location ;
467
414
}
@@ -485,8 +432,8 @@ private static Engine.Result performOpOnReplica(DocWriteResponse primaryResponse
485
432
deleteRequest .type (), deleteRequest .id ());
486
433
break ;
487
434
default :
488
- throw new IllegalStateException ( "Unexpected request operation type on replica: "
489
- + docWriteRequest .opType ().getLowercase ());
435
+ assert false : "Unexpected request operation type on replica: " + docWriteRequest + ";primary result: " + primaryResponse ;
436
+ throw new IllegalStateException ( "Unexpected request operation type on replica: " + docWriteRequest .opType ().getLowercase ());
490
437
}
491
438
if (result .getResultType () == Engine .Result .Type .MAPPING_UPDATE_REQUIRED ) {
492
439
// Even though the primary waits on all nodes to ack the mapping changes to the master
0 commit comments