|
@@ -54,6 +54,7 @@ import org.elasticsearch.common.xcontent.XContentType;
|
|
|
import org.elasticsearch.index.VersionType;
|
|
|
import org.elasticsearch.index.engine.Engine;
|
|
|
import org.elasticsearch.index.engine.VersionConflictEngineException;
|
|
|
+import org.elasticsearch.index.get.GetResult;
|
|
|
import org.elasticsearch.index.mapper.MapperParsingException;
|
|
|
import org.elasticsearch.index.mapper.Mapping;
|
|
|
import org.elasticsearch.index.mapper.SourceToParse;
|
|
@@ -142,7 +143,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
return new BulkItemResultHolder(null, indexResult, bulkItemRequest);
|
|
|
} else {
|
|
|
IndexResponse response = new IndexResponse(primary.shardId(), indexRequest.type(), indexRequest.id(),
|
|
|
- indexResult.getSeqNo(), indexResult.getVersion(), indexResult.isCreated());
|
|
|
+ indexResult.getSeqNo(), primary.getPrimaryTerm(), indexResult.getVersion(), indexResult.isCreated());
|
|
|
return new BulkItemResultHolder(response, indexResult, bulkItemRequest);
|
|
|
}
|
|
|
}
|
|
@@ -155,7 +156,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
return new BulkItemResultHolder(null, deleteResult, bulkItemRequest);
|
|
|
} else {
|
|
|
DeleteResponse response = new DeleteResponse(primary.shardId(), deleteRequest.type(), deleteRequest.id(),
|
|
|
- deleteResult.getSeqNo(), deleteResult.getVersion(), deleteResult.isFound());
|
|
|
+ deleteResult.getSeqNo(), primary.getPrimaryTerm(), deleteResult.getVersion(), deleteResult.isFound());
|
|
|
return new BulkItemResultHolder(response, deleteResult, bulkItemRequest);
|
|
|
}
|
|
|
}
|
|
@@ -276,7 +277,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
int requestIndex, UpdateHelper updateHelper,
|
|
|
LongSupplier nowInMillis,
|
|
|
final MappingUpdatePerformer mappingUpdater) throws Exception {
|
|
|
- Engine.Result updateOperationResult = null;
|
|
|
+ Engine.Result result = null;
|
|
|
UpdateResponse updateResponse = null;
|
|
|
BulkItemRequest replicaRequest = request.items()[requestIndex];
|
|
|
int maxAttempts = updateRequest.retryOnConflict();
|
|
@@ -288,7 +289,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
} catch (Exception failure) {
|
|
|
// we may fail translating a update to index or delete operation
|
|
|
// we use index result to communicate failure while translating update request
|
|
|
- updateOperationResult = new Engine.IndexResult(failure, updateRequest.version(), SequenceNumbersService.UNASSIGNED_SEQ_NO);
|
|
|
+ result = new Engine.IndexResult(failure, updateRequest.version(), SequenceNumbersService.UNASSIGNED_SEQ_NO);
|
|
|
break; // out of retry loop
|
|
|
}
|
|
|
// execute translated update request
|
|
@@ -298,34 +299,46 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
IndexRequest indexRequest = translate.action();
|
|
|
MappingMetaData mappingMd = metaData.mappingOrDefault(indexRequest.type());
|
|
|
indexRequest.process(mappingMd, request.index());
|
|
|
- updateOperationResult = executeIndexRequestOnPrimary(indexRequest, primary, mappingUpdater);
|
|
|
+ result = executeIndexRequestOnPrimary(indexRequest, primary, mappingUpdater);
|
|
|
break;
|
|
|
case DELETED:
|
|
|
DeleteRequest deleteRequest = translate.action();
|
|
|
- updateOperationResult = executeDeleteRequestOnPrimary(deleteRequest, primary);
|
|
|
+ result = executeDeleteRequestOnPrimary(deleteRequest, primary);
|
|
|
break;
|
|
|
case NOOP:
|
|
|
primary.noopUpdate(updateRequest.type());
|
|
|
break;
|
|
|
default: throw new IllegalStateException("Illegal update operation " + translate.getResponseResult());
|
|
|
}
|
|
|
- if (updateOperationResult == null) {
|
|
|
+ if (result == null) {
|
|
|
// this is a noop operation
|
|
|
updateResponse = translate.action();
|
|
|
break; // out of retry loop
|
|
|
- } else if (updateOperationResult.hasFailure() == false) {
|
|
|
+ } else if (result.hasFailure() == false) {
|
|
|
// enrich update response and
|
|
|
// set translated update (index/delete) request for replica execution in bulk items
|
|
|
- switch (updateOperationResult.getOperationType()) {
|
|
|
+ switch (result.getOperationType()) {
|
|
|
case INDEX:
|
|
|
+ assert result instanceof Engine.IndexResult : result.getClass();
|
|
|
IndexRequest updateIndexRequest = translate.action();
|
|
|
- final IndexResponse indexResponse = new IndexResponse(primary.shardId(),
|
|
|
- updateIndexRequest.type(), updateIndexRequest.id(), updateOperationResult.getSeqNo(),
|
|
|
- updateOperationResult.getVersion(), ((Engine.IndexResult) updateOperationResult).isCreated());
|
|
|
+ final IndexResponse indexResponse = new IndexResponse(
|
|
|
+ primary.shardId(),
|
|
|
+ updateIndexRequest.type(),
|
|
|
+ updateIndexRequest.id(),
|
|
|
+ result.getSeqNo(),
|
|
|
+ primary.getPrimaryTerm(),
|
|
|
+ result.getVersion(),
|
|
|
+ ((Engine.IndexResult) result).isCreated());
|
|
|
BytesReference indexSourceAsBytes = updateIndexRequest.source();
|
|
|
- updateResponse = new UpdateResponse(indexResponse.getShardInfo(),
|
|
|
- indexResponse.getShardId(), indexResponse.getType(), indexResponse.getId(), indexResponse.getSeqNo(),
|
|
|
- indexResponse.getVersion(), indexResponse.getResult());
|
|
|
+ updateResponse = new UpdateResponse(
|
|
|
+ indexResponse.getShardInfo(),
|
|
|
+ indexResponse.getShardId(),
|
|
|
+ indexResponse.getType(),
|
|
|
+ indexResponse.getId(),
|
|
|
+ indexResponse.getSeqNo(),
|
|
|
+ indexResponse.getPrimaryTerm(),
|
|
|
+ indexResponse.getVersion(),
|
|
|
+ indexResponse.getResult());
|
|
|
if ((updateRequest.fetchSource() != null && updateRequest.fetchSource().fetchSource()) ||
|
|
|
(updateRequest.fields() != null && updateRequest.fields().length > 0)) {
|
|
|
Tuple<XContentType, Map<String, Object>> sourceAndContent =
|
|
@@ -337,29 +350,46 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
replicaRequest = new BulkItemRequest(request.items()[requestIndex].id(), updateIndexRequest);
|
|
|
break;
|
|
|
case DELETE:
|
|
|
+ assert result instanceof Engine.DeleteResult : result.getClass();
|
|
|
DeleteRequest updateDeleteRequest = translate.action();
|
|
|
- DeleteResponse deleteResponse = new DeleteResponse(primary.shardId(),
|
|
|
- updateDeleteRequest.type(), updateDeleteRequest.id(), updateOperationResult.getSeqNo(),
|
|
|
- updateOperationResult.getVersion(), ((Engine.DeleteResult) updateOperationResult).isFound());
|
|
|
- updateResponse = new UpdateResponse(deleteResponse.getShardInfo(),
|
|
|
- deleteResponse.getShardId(), deleteResponse.getType(), deleteResponse.getId(), deleteResponse.getSeqNo(),
|
|
|
- deleteResponse.getVersion(), deleteResponse.getResult());
|
|
|
- updateResponse.setGetResult(updateHelper.extractGetResult(updateRequest,
|
|
|
- request.index(), deleteResponse.getVersion(), translate.updatedSourceAsMap(),
|
|
|
- translate.updateSourceContentType(), null));
|
|
|
+ DeleteResponse deleteResponse = new DeleteResponse(
|
|
|
+ primary.shardId(),
|
|
|
+ updateDeleteRequest.type(),
|
|
|
+ updateDeleteRequest.id(),
|
|
|
+ result.getSeqNo(),
|
|
|
+ primary.getPrimaryTerm(),
|
|
|
+ result.getVersion(),
|
|
|
+ ((Engine.DeleteResult) result).isFound());
|
|
|
+ updateResponse = new UpdateResponse(
|
|
|
+ deleteResponse.getShardInfo(),
|
|
|
+ deleteResponse.getShardId(),
|
|
|
+ deleteResponse.getType(),
|
|
|
+ deleteResponse.getId(),
|
|
|
+ deleteResponse.getSeqNo(),
|
|
|
+ deleteResponse.getPrimaryTerm(),
|
|
|
+ deleteResponse.getVersion(),
|
|
|
+ deleteResponse.getResult());
|
|
|
+ final GetResult getResult = updateHelper.extractGetResult(
|
|
|
+ updateRequest,
|
|
|
+ request.index(),
|
|
|
+ deleteResponse.getVersion(),
|
|
|
+ translate.updatedSourceAsMap(),
|
|
|
+ translate.updateSourceContentType(),
|
|
|
+ null);
|
|
|
+ updateResponse.setGetResult(getResult);
|
|
|
// set translated request as replica request
|
|
|
replicaRequest = new BulkItemRequest(request.items()[requestIndex].id(), updateDeleteRequest);
|
|
|
break;
|
|
|
}
|
|
|
- assert updateOperationResult.getSeqNo() != SequenceNumbersService.UNASSIGNED_SEQ_NO;
|
|
|
+ assert result.getSeqNo() != SequenceNumbersService.UNASSIGNED_SEQ_NO;
|
|
|
// successful operation
|
|
|
break; // out of retry loop
|
|
|
- } else if (updateOperationResult.getFailure() instanceof VersionConflictEngineException == false) {
|
|
|
+ } else if (result.getFailure() instanceof VersionConflictEngineException == false) {
|
|
|
// not a version conflict exception
|
|
|
break; // out of retry loop
|
|
|
}
|
|
|
}
|
|
|
- return new BulkItemResultHolder(updateResponse, updateOperationResult, replicaRequest);
|
|
|
+ return new BulkItemResultHolder(updateResponse, result, replicaRequest);
|
|
|
}
|
|
|
|
|
|
/** Modes for executing item request on replica depending on corresponding primary execution result */
|
|
@@ -513,8 +543,7 @@ public class TransportShardBulkAction extends TransportWriteAction<BulkShardRequ
|
|
|
try {
|
|
|
operation = prepareIndexOperationOnReplica(primaryResponse, request, replica);
|
|
|
} catch (MapperParsingException e) {
|
|
|
- return new Engine.IndexResult(e, primaryResponse.getVersion(),
|
|
|
- primaryResponse.getSeqNo());
|
|
|
+ return new Engine.IndexResult(e, primaryResponse.getVersion(), primaryResponse.getSeqNo());
|
|
|
}
|
|
|
|
|
|
Mapping update = operation.parsedDoc().dynamicMappingsUpdate();
|