Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/changelog/104778.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 104778
summary: Adding a `RequestBuilder` interface
area: Ingest Node
type: enhancement
issues: []
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
import org.elasticsearch.ElasticsearchStatusException;
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.admin.cluster.state.ClusterStateRequest;
import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
Expand Down Expand Up @@ -1831,16 +1831,11 @@ public void onFailure(Exception e) {
assertThat(indicesStatsResponse.getIndices().size(), equalTo(2));
}

private static void verifyResolvability(String dataStream, ActionRequestBuilder<?, ?> requestBuilder, boolean fail) {
private static void verifyResolvability(String dataStream, RequestBuilder<?, ?> requestBuilder, boolean fail) {
verifyResolvability(dataStream, requestBuilder, fail, 0);
}

private static void verifyResolvability(
String dataStream,
ActionRequestBuilder<?, ?> requestBuilder,
boolean fail,
long expectedCount
) {
private static void verifyResolvability(String dataStream, RequestBuilder<?, ?> requestBuilder, boolean fail, long expectedCount) {
if (fail) {
String expectedErrorMessage = "no such index [" + dataStream + "]";
if (requestBuilder instanceof MultiSearchRequestBuilder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

package org.elasticsearch.cluster;

import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.admin.cluster.configuration.AddVotingConfigExclusionsRequest;
import org.elasticsearch.action.admin.cluster.configuration.TransportAddVotingConfigExclusionsAction;
import org.elasticsearch.action.admin.cluster.state.ClusterStateResponse;
Expand Down Expand Up @@ -189,7 +189,7 @@ public void testNoMasterActions() throws Exception {
internalCluster().clearDisruptionScheme(true);
}

void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, ActionRequestBuilder<?, ?> builder) {
void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, RequestBuilder<?, ?> builder) {
// we clean the metadata when loosing a master, therefore all operations on indices will auto create it, if allowed
try {
builder.get();
Expand All @@ -204,7 +204,7 @@ void checkUpdateAction(boolean autoCreateIndex, TimeValue timeout, ActionRequest
}
}

void checkWriteAction(ActionRequestBuilder<?, ?> builder) {
void checkWriteAction(RequestBuilder<?, ?> builder) {
try {
builder.get();
fail("Expected ClusterBlockException");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.PlainActionFuture;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
Expand Down Expand Up @@ -130,7 +130,7 @@ public void onFailure(Exception e) {}
}

private <Req extends ActionRequest, Res extends ActionResponse> ActionFuture<Res> executeAndCancelCommittedPublication(
ActionRequestBuilder<Req, Res> req
RequestBuilder<Req, Res> req
) throws Exception {
// Wait for no publication in progress to not accidentally cancel a publication different from the one triggered by the given
// request.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
package org.elasticsearch.indices;

import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.index.IndexNotFoundException;
Expand Down Expand Up @@ -47,10 +47,7 @@ public void setNow() {
* of failing when index resolution with `now` is one day off, this method wraps calls with the assumption that
* the day did not change during the test run.
*/
public <Q extends ActionRequest, R extends ActionResponse> void dateSensitiveGet(
ActionRequestBuilder<Q, R> builder,
Consumer<R> consumer
) {
public <Q extends ActionRequest, R extends ActionResponse> void dateSensitiveGet(RequestBuilder<Q, R> builder, Consumer<R> consumer) {
Runnable dayChangeAssumption = () -> assumeTrue(
"day changed between requests",
ZonedDateTime.now(ZoneOffset.UTC).getDayOfYear() == now.getDayOfYear()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

package org.elasticsearch.indices.settings;

import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse;
import org.elasticsearch.cluster.ClusterState;
Expand Down Expand Up @@ -378,10 +378,7 @@ public void testEngineGCDeletesSetting() throws Exception {
prepareIndex("test").setId("1").setSource("f", 1).setVersionType(VersionType.EXTERNAL).setVersion(1).get();
client().prepareDelete("test", "1").setVersionType(VersionType.EXTERNAL).setVersion(2).get();
// delete is still in cache this should fail
ActionRequestBuilder<?, ?> builder = prepareIndex("test").setId("1")
.setSource("f", 3)
.setVersionType(VersionType.EXTERNAL)
.setVersion(1);
RequestBuilder<?, ?> builder = prepareIndex("test").setId("1").setSource("f", 3).setVersionType(VersionType.EXTERNAL).setVersion(1);
expectThrows(VersionConflictEngineException.class, builder);

assertAcked(indicesAdmin().prepareUpdateSettings("test").setSettings(Settings.builder().put("index.gc_deletes", 0)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
package org.elasticsearch.versioning;

import org.apache.lucene.tests.util.TestUtil;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
Expand Down Expand Up @@ -88,7 +88,7 @@ public void testExternalGTE() throws Exception {
.get();
assertThat(indexResponse.getVersion(), equalTo(14L));

ActionRequestBuilder<?, ?> builder1 = prepareIndex("test").setId("1")
RequestBuilder<?, ?> builder1 = prepareIndex("test").setId("1")
.setSource("field1", "value1_1")
.setVersion(13)
.setVersionType(VersionType.EXTERNAL_GTE);
Expand All @@ -103,7 +103,7 @@ public void testExternalGTE() throws Exception {
}

// deleting with a lower version fails.
ActionRequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setVersion(2).setVersionType(VersionType.EXTERNAL_GTE);
RequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setVersion(2).setVersionType(VersionType.EXTERNAL_GTE);
expectThrows(VersionConflictEngineException.class, builder);

// Delete with a higher or equal version deletes all versions up to the given one.
Expand Down Expand Up @@ -259,11 +259,11 @@ public void testCompareAndSet() {
VersionConflictEngineException.class
);

ActionRequestBuilder<?, ?> builder6 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(1);
RequestBuilder<?, ?> builder6 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(1);
expectThrows(VersionConflictEngineException.class, builder6);
ActionRequestBuilder<?, ?> builder5 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(2);
RequestBuilder<?, ?> builder5 = client().prepareDelete("test", "1").setIfSeqNo(10).setIfPrimaryTerm(2);
expectThrows(VersionConflictEngineException.class, builder5);
ActionRequestBuilder<?, ?> builder4 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2);
RequestBuilder<?, ?> builder4 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2);
expectThrows(VersionConflictEngineException.class, builder4);

client().admin().indices().prepareRefresh().get();
Expand Down Expand Up @@ -295,15 +295,15 @@ public void testCompareAndSet() {
assertThat(deleteResponse.getSeqNo(), equalTo(2L));
assertThat(deleteResponse.getPrimaryTerm(), equalTo(1L));

ActionRequestBuilder<?, ?> builder3 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(1);
RequestBuilder<?, ?> builder3 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(1);
expectThrows(VersionConflictEngineException.class, builder3);
ActionRequestBuilder<?, ?> builder2 = client().prepareDelete("test", "1").setIfSeqNo(3).setIfPrimaryTerm(12);
RequestBuilder<?, ?> builder2 = client().prepareDelete("test", "1").setIfSeqNo(3).setIfPrimaryTerm(12);
expectThrows(VersionConflictEngineException.class, builder2);
ActionRequestBuilder<?, ?> builder1 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2);
RequestBuilder<?, ?> builder1 = client().prepareDelete("test", "1").setIfSeqNo(1).setIfPrimaryTerm(2);
expectThrows(VersionConflictEngineException.class, builder1);

// the doc is deleted. Even when we hit the deleted seqNo, a conditional delete should fail.
ActionRequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setIfSeqNo(2).setIfPrimaryTerm(1);
RequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setIfSeqNo(2).setIfPrimaryTerm(1);
expectThrows(VersionConflictEngineException.class, builder);
}

Expand All @@ -319,16 +319,13 @@ public void testSimpleVersioningWithFlush() throws Exception {
assertThat(indexResponse.getSeqNo(), equalTo(1L));

client().admin().indices().prepareFlush().get();
ActionRequestBuilder<?, ?> builder2 = prepareIndex("test").setId("1")
.setSource("field1", "value1_1")
.setIfSeqNo(0)
.setIfPrimaryTerm(1);
RequestBuilder<?, ?> builder2 = prepareIndex("test").setId("1").setSource("field1", "value1_1").setIfSeqNo(0).setIfPrimaryTerm(1);
expectThrows(VersionConflictEngineException.class, builder2);

ActionRequestBuilder<?, ?> builder1 = prepareIndex("test").setId("1").setCreate(true).setSource("field1", "value1_1");
RequestBuilder<?, ?> builder1 = prepareIndex("test").setId("1").setCreate(true).setSource("field1", "value1_1");
expectThrows(VersionConflictEngineException.class, builder1);

ActionRequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setIfSeqNo(0).setIfPrimaryTerm(1);
RequestBuilder<?, ?> builder = client().prepareDelete("test", "1").setIfSeqNo(0).setIfPrimaryTerm(1);
expectThrows(VersionConflictEngineException.class, builder);

for (int i = 0; i < 10; i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@

import java.util.Objects;

public abstract class ActionRequestBuilder<Request extends ActionRequest, Response extends ActionResponse> {
public abstract class ActionRequestBuilder<Request extends ActionRequest, Response extends ActionResponse>
implements
RequestBuilder<Request, Response> {

protected final ActionType<Response> action;
protected final Request request;
Expand Down
28 changes: 28 additions & 0 deletions server/src/main/java/org/elasticsearch/action/RequestBuilder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

package org.elasticsearch.action;

import org.elasticsearch.core.RefCounted;
import org.elasticsearch.core.TimeValue;

public interface RequestBuilder<Request, Response extends RefCounted> {
/**
* This method returns the request that this builder builds. Depending on the implementation, it might return a new request with each
* call or the same request with each call.
*/
Request request();

ActionFuture<Response> execute();

Response get();

Response get(TimeValue timeout);

void execute(ActionListener<Response> listener);
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import org.apache.lucene.util.SetOnce;
import org.elasticsearch.TransportVersion;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.support.PlainActionFuture;
import org.elasticsearch.action.support.SubscribableListener;
import org.elasticsearch.bootstrap.BootstrapForTesting;
Expand Down Expand Up @@ -2145,7 +2145,7 @@ public static <T extends Throwable> T expectThrows(Class<T> expectedType, Action
);
}

public static <T extends Throwable> T expectThrows(Class<T> expectedType, ActionRequestBuilder<?, ?> builder) {
public static <T extends Throwable> T expectThrows(Class<T> expectedType, RequestBuilder<?, ?> builder) {
return expectThrows(
expectedType,
"Expected exception " + expectedType.getSimpleName() + " but no exception was thrown",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestBuilder;
import org.elasticsearch.action.ActionResponse;
import org.elasticsearch.action.RequestBuilder;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequestBuilder;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
Expand Down Expand Up @@ -99,15 +99,15 @@

public class ElasticsearchAssertions {

public static void assertAcked(ActionRequestBuilder<?, ? extends IsAcknowledgedSupplier> builder) {
public static void assertAcked(RequestBuilder<?, ? extends IsAcknowledgedSupplier> builder) {
assertAcked(builder, TimeValue.timeValueSeconds(30));
}

public static void assertAcked(ActionFuture<? extends IsAcknowledgedSupplier> future) {
assertAcked(future.actionGet());
}

public static void assertAcked(ActionRequestBuilder<?, ? extends IsAcknowledgedSupplier> builder, TimeValue timeValue) {
public static void assertAcked(RequestBuilder<?, ? extends IsAcknowledgedSupplier> builder, TimeValue timeValue) {
assertAcked(builder.get(timeValue));
}

Expand Down Expand Up @@ -141,7 +141,7 @@ public static void assertAcked(CreateIndexResponse response) {
*
* @param builder the request builder
*/
public static void assertBlocked(ActionRequestBuilder<?, ?> builder) {
public static void assertBlocked(RequestBuilder<?, ?> builder) {
assertBlocked(builder, (ClusterBlock) null);
}

Expand Down Expand Up @@ -179,7 +179,7 @@ public static void assertBlocked(BaseBroadcastResponse replicatedBroadcastRespon
* @param builder the request builder
* @param expectedBlockId the expected block id
*/
public static void assertBlocked(final ActionRequestBuilder<?, ?> builder, @Nullable final Integer expectedBlockId) {
public static void assertBlocked(final RequestBuilder<?, ?> builder, @Nullable final Integer expectedBlockId) {
var e = ESTestCase.expectThrows(ClusterBlockException.class, builder);
assertThat(e.blocks(), not(empty()));
RestStatus status = checkRetryableBlock(e.blocks()) ? RestStatus.TOO_MANY_REQUESTS : RestStatus.FORBIDDEN;
Expand All @@ -200,7 +200,7 @@ public static void assertBlocked(final ActionRequestBuilder<?, ?> builder, @Null
* @param builder the request builder
* @param expectedBlock the expected block
*/
public static void assertBlocked(final ActionRequestBuilder<?, ?> builder, @Nullable final ClusterBlock expectedBlock) {
public static void assertBlocked(final RequestBuilder<?, ?> builder, @Nullable final ClusterBlock expectedBlock) {
assertBlocked(builder, expectedBlock != null ? expectedBlock.id() : null);
}

Expand Down Expand Up @@ -340,12 +340,12 @@ public static void assertSearchHit(SearchResponse searchResponse, int number, Ma
assertThat(searchResponse.getHits().getAt(number - 1), matcher);
}

public static void assertNoFailures(ActionRequestBuilder<?, SearchResponse> searchRequestBuilder) {
public static void assertNoFailures(RequestBuilder<? extends ActionRequest, SearchResponse> searchRequestBuilder) {
assertNoFailuresAndResponse(searchRequestBuilder, r -> {});
}

public static void assertNoFailuresAndResponse(
ActionRequestBuilder<?, SearchResponse> searchRequestBuilder,
RequestBuilder<? extends ActionRequest, SearchResponse> searchRequestBuilder,
Consumer<SearchResponse> consumer
) {
assertResponse(searchRequestBuilder, res -> {
Expand All @@ -366,7 +366,7 @@ public static void assertNoFailuresAndResponse(ActionFuture<SearchResponse> resp
}

public static <Q extends ActionRequest, R extends ActionResponse> void assertResponse(
ActionRequestBuilder<Q, R> searchRequestBuilder,
RequestBuilder<Q, R> searchRequestBuilder,
Consumer<R> consumer
) {
var res = searchRequestBuilder.get();
Expand Down Expand Up @@ -430,7 +430,7 @@ public static <R extends ActionResponse> void assertResponse(ActionFuture<R> res
}

public static void assertCheckedResponse(
ActionRequestBuilder<?, SearchResponse> searchRequestBuilder,
RequestBuilder<?, SearchResponse> searchRequestBuilder,
CheckedConsumer<SearchResponse, IOException> consumer
) throws IOException {
var res = searchRequestBuilder.get();
Expand Down Expand Up @@ -692,7 +692,7 @@ public static <T extends Query> T assertBooleanSubQuery(Query query, Class<T> su
* Run the request from a given builder and check that it throws an exception of the right type, with a given {@link RestStatus}
*/
public static <E extends Throwable> void assertRequestBuilderThrows(
ActionRequestBuilder<?, ?> builder,
RequestBuilder<?, ?> builder,
Class<E> exceptionClass,
RestStatus status
) {
Expand All @@ -705,7 +705,7 @@ public static <E extends Throwable> void assertRequestBuilderThrows(
* @param extraInfo extra information to add to the failure message
*/
public static <E extends Throwable> void assertRequestBuilderThrows(
ActionRequestBuilder<?, ?> builder,
RequestBuilder<?, ?> builder,
Class<E> exceptionClass,
String extraInfo
) {
Expand Down Expand Up @@ -767,11 +767,11 @@ public static <E extends Throwable> void assertFutureThrows(
}
}

public static void assertRequestBuilderThrows(ActionRequestBuilder<?, ?> builder, RestStatus status) {
public static void assertRequestBuilderThrows(RequestBuilder<?, ?> builder, RestStatus status) {
assertFutureThrows(builder.execute(), status);
}

public static void assertRequestBuilderThrows(ActionRequestBuilder<?, ?> builder, RestStatus status, String extraInfo) {
public static void assertRequestBuilderThrows(RequestBuilder<?, ?> builder, RestStatus status, String extraInfo) {
assertFutureThrows(builder.execute(), status, extraInfo);
}

Expand Down