private void setupElasticsearchToFail() throws IOException { final String errorMessage = "error message"; final Exception cause = new Exception("test exception"); final boolean isFailed = true; final int itemID = 0; // define the item failure BulkItemResponse.Failure failure = mock(BulkItemResponse.Failure.class); when(failure.getCause()).thenReturn(cause); when(failure.getMessage()).thenReturn(errorMessage); // define the item level response BulkItemResponse itemResponse = mock(BulkItemResponse.class); when(itemResponse.isFailed()).thenReturn(isFailed); when(itemResponse.getItemId()).thenReturn(itemID); when(itemResponse.getFailure()).thenReturn(failure); when(itemResponse.getFailureMessage()).thenReturn("error message"); List<BulkItemResponse> itemsResponses = Collections.singletonList(itemResponse); // define the bulk response to indicate failure BulkResponse response = mock(BulkResponse.class); when(response.iterator()).thenReturn(itemsResponses.iterator()); when(response.hasFailures()).thenReturn(isFailed); // have the client return the mock response when(highLevelClient.bulk(any(BulkRequest.class))).thenReturn(response); }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.startObject(opType.getLowercase()); if (failure == null) { response.innerToXContent(builder, params); builder.field(STATUS, response.status().getStatus()); } else { builder.field(_INDEX, failure.getIndex()); builder.field(_TYPE, failure.getType()); builder.field(_ID, failure.getId()); builder.field(STATUS, failure.getStatus().getStatus()); builder.startObject(ERROR); ElasticsearchException.generateThrowableXContent(builder, params, failure.getCause()); builder.endObject(); } builder.endObject(); builder.endObject(); return builder; }
/** * Abort this request, and store a {@link org.elasticsearch.action.bulk.BulkItemResponse.Failure} response. * * @param index The concrete index that was resolved for this request * @param cause The cause of the rejection (may not be null) * @throws IllegalStateException If a response already exists for this request */ public void abort(String index, Exception cause) { if (primaryResponse == null) { final BulkItemResponse.Failure failure = new BulkItemResponse.Failure(index, request.type(), request.id(), Objects.requireNonNull(cause), true); setPrimaryResponse(new BulkItemResponse(id, request.opType(), failure)); } else { assert primaryResponse.isFailed() && primaryResponse.getFailure().isAborted() : "response [" + Strings.toString(primaryResponse) + "]; cause [" + cause + "]"; if (primaryResponse.isFailed() && primaryResponse.getFailure().isAborted()) { primaryResponse.getFailure().getCause().addSuppressed(cause); } else { throw new IllegalStateException( "aborting item that with response [" + primaryResponse + "] that was previously processed", cause); } } }
public static <Response extends ReplicationResponse & WriteResponse> ActionListener<BulkResponse> wrapBulkResponse(ActionListener<Response> listener) { return ActionListener.wrap(bulkItemResponses -> { assert bulkItemResponses.getItems().length == 1 : "expected only one item in bulk request"; BulkItemResponse bulkItemResponse = bulkItemResponses.getItems()[0]; if (bulkItemResponse.isFailed() == false) { final DocWriteResponse response = bulkItemResponse.getResponse(); listener.onResponse((Response) response); } else { listener.onFailure(bulkItemResponse.getFailure().getCause()); } }, listener::onFailure); }
@Override public void writeTo(StreamOutput out) throws IOException { out.writeString(getIndex()); out.writeString(getType()); out.writeOptionalString(getId()); out.writeException(getCause()); if (out.getVersion().onOrAfter(Version.V_6_0_0_alpha1)) { out.writeZLong(getSeqNo()); } if (supportsAbortedFlag(out.getVersion())) { out.writeBoolean(aborted); } }
public static <Response extends ReplicationResponse & WriteResponse> ActionListener<BulkResponse> wrapBulkResponse(ActionListener<Response> listener) { return ActionListener.wrap(bulkItemResponses -> { assert bulkItemResponses.getItems().length == 1 : "expected only one item in bulk request"; BulkItemResponse bulkItemResponse = bulkItemResponses.getItems()[0]; if (bulkItemResponse.isFailed() == false) { final DocWriteResponse response = bulkItemResponse.getResponse(); listener.onResponse((Response) response); } else { listener.onFailure(bulkItemResponse.getFailure().getCause()); } }, listener::onFailure); }
@Override public void writeTo(StreamOutput out) throws IOException { out.writeString(getIndex()); out.writeString(getType()); out.writeOptionalString(getId()); out.writeException(getCause()); }
private ActionListener<BulkResponse> wrapBulkResponse(ActionListener<Response> listener) { return ActionListener.wrap(bulkItemResponses -> { assert bulkItemResponses.getItems().length == 1 : "expected only one item in bulk request"; BulkItemResponse bulkItemResponse = bulkItemResponses.getItems()[0]; if (bulkItemResponse.isFailed() == false) { final DocWriteResponse response = bulkItemResponse.getResponse(); listener.onResponse((Response) response); } else { listener.onFailure(bulkItemResponse.getFailure().getCause()); } }, listener::onFailure); }
@Override public Throwable extractFailureCauseFromBulkItemResponse(BulkItemResponse bulkItemResponse) { if (!bulkItemResponse.isFailed()) { return null; } else { return bulkItemResponse.getFailure().getCause(); } }
@Override public void writeTo(StreamOutput out) throws IOException { out.writeString(getIndex()); out.writeString(getType()); out.writeOptionalString(getId()); out.writeThrowable(getCause()); }
/** * Checks if is index avaialble. * * @param bulkItemResponses the bulk item responses * @return the boolean */ private Boolean isIndexAvaialble(BulkItemResponse[] bulkItemResponses) { // System.out.println(bulkItemResponses[0].getFailureMessage()); // System.out.println(bulkItemResponses[0].getFailure().getMessage()); return null == Arrays.stream(bulkItemResponses) .filter(x -> x.getFailure().getCause().getMessage().contains("no such index")).findAny().orElse(null); }
isConflictException(context.getExecutionResult().getFailure().getCause())) { final UpdateRequest updateRequest = (UpdateRequest) context.getCurrent(); if (context.getRetryCounter() < updateRequest.retryOnConflict()) {
/** * Handles the {@link BulkResponse} received from Elasticsearch. * @param bulkResponse The response received from Elasticsearch. * @param documents The documents included in the bulk request. * @param results The writer results. */ private void handleBulkResponse(BulkResponse bulkResponse, List<Indexable> documents, BulkDocumentWriterResults<D> results) { if (bulkResponse.hasFailures()) { // interrogate the response to distinguish between those that succeeded and those that failed for(BulkItemResponse response: bulkResponse) { if(response.isFailed()) { // request failed D failed = getDocument(response.getItemId()); Exception cause = response.getFailure().getCause(); String message = response.getFailureMessage(); results.addFailure(failed, cause, message); } else { // request succeeded D success = getDocument(response.getItemId()); success.setDocumentID(response.getResponse().getId()); results.addSuccess(success); } } } else { // all requests succeeded for(Indexable success: documents) { results.addSuccess(success.document); } } }
processUpdateResponse(updateRequest, context.getConcreteIndex(), executionResult, updateResult)); } else if (executionResult.isFailed()) { final Exception failure = executionResult.getFailure().getCause(); final DocWriteRequest docWriteRequest = context.getCurrent(); if (TransportShardBulkAction.isConflictException(failure)) {
@Override protected WritePrimaryResult<Request, Response> shardOperationOnPrimary( Request request, final IndexShard primary) throws Exception { BulkItemRequest[] itemRequests = new BulkItemRequest[1]; WriteRequest.RefreshPolicy refreshPolicy = request.getRefreshPolicy(); request.setRefreshPolicy(WriteRequest.RefreshPolicy.NONE); itemRequests[0] = new BulkItemRequest(0, ((DocWriteRequest) request)); BulkShardRequest bulkShardRequest = new BulkShardRequest(request.shardId(), refreshPolicy, itemRequests); WritePrimaryResult<BulkShardRequest, BulkShardResponse> bulkResult = shardBulkAction.shardOperationOnPrimary(bulkShardRequest, primary); assert bulkResult.finalResponseIfSuccessful.getResponses().length == 1 : "expected only one bulk shard response"; BulkItemResponse itemResponse = bulkResult.finalResponseIfSuccessful.getResponses()[0]; final Response response; final Exception failure; if (itemResponse.isFailed()) { failure = itemResponse.getFailure().getCause(); response = null; } else { response = (Response) itemResponse.getResponse(); failure = null; } return new WritePrimaryResult<>(request, response, bulkResult.location, failure, primary, logger); }
public static <Response extends ReplicationResponse & WriteResponse> ActionListener<BulkResponse> wrapBulkResponse(ActionListener<Response> listener) { return ActionListener.wrap(bulkItemResponses -> { assert bulkItemResponses.getItems().length == 1 : "expected only one item in bulk request"; BulkItemResponse bulkItemResponse = bulkItemResponses.getItems()[0]; if (bulkItemResponse.isFailed() == false) { final DocWriteResponse response = bulkItemResponse.getResponse(); listener.onResponse((Response) response); } else { listener.onFailure(bulkItemResponse.getFailure().getCause()); } }, listener::onFailure); }
@Override public void writeTo(StreamOutput out) throws IOException { out.writeString(getIndex()); out.writeString(getType()); out.writeOptionalString(getId()); out.writeException(getCause()); if (out.getVersion().onOrAfter(Version.V_6_0_0_alpha1)) { out.writeZLong(getSeqNo()); } if (supportsAbortedFlag(out.getVersion())) { out.writeBoolean(aborted); } }
@Override public Throwable extractFailureCauseFromBulkItemResponse(BulkItemResponse bulkItemResponse) { if (!bulkItemResponse.isFailed()) { return null; } else { return bulkItemResponse.getFailure().getCause(); } }
@Override public Throwable extractFailureCauseFromBulkItemResponse(BulkItemResponse bulkItemResponse) { if (!bulkItemResponse.isFailed()) { return null; } else { return bulkItemResponse.getFailure().getCause(); } }
@Override public Throwable extractFailureCauseFromBulkItemResponse(BulkItemResponse bulkItemResponse) { if (!bulkItemResponse.isFailed()) { return null; } else { return bulkItemResponse.getFailure().getCause(); } }