diff --git a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java index 72e58b651e486..cd9172fc1aff1 100644 --- a/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java +++ b/modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.Predicate; @@ -38,10 +39,12 @@ public class RestSearchTemplateAction extends BaseRestHandler { private final Predicate clusterSupportsFeature; private final Settings settings; + private final boolean inCpsContext; public RestSearchTemplateAction(Predicate clusterSupportsFeature, Settings settings) { this.clusterSupportsFeature = clusterSupportsFeature; this.settings = settings; + this.inCpsContext = settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false); } @Override @@ -61,7 +64,7 @@ public String getName() { @Override public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException { - if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) { + if (inCpsContext) { // accept but drop project_routing param until fully supported request.param("project_routing"); } @@ -73,7 +76,9 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client request, null, clusterSupportsFeature, - size -> searchRequest.source().size(size) + size -> searchRequest.source().size(size), + // This endpoint is CPS-enabled so propagate the right value. + Optional.of(inCpsContext) ); // Creates the search template request diff --git a/modules/reindex/src/main/java/org/elasticsearch/reindex/AbstractBulkByQueryRestHandler.java b/modules/reindex/src/main/java/org/elasticsearch/reindex/AbstractBulkByQueryRestHandler.java index 095d119bf2719..36dcc30986e8f 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/reindex/AbstractBulkByQueryRestHandler.java +++ b/modules/reindex/src/main/java/org/elasticsearch/reindex/AbstractBulkByQueryRestHandler.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.util.Map; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; @@ -52,7 +53,14 @@ protected void parseInternalRequest( SearchRequest searchRequest = internal.getSearchRequest(); try (XContentParser parser = extractRequestSpecificFields(restRequest, bodyConsumers)) { - RestSearchAction.parseSearchRequest(searchRequest, restRequest, parser, clusterSupportsFeature, size -> failOnSizeSpecified()); + RestSearchAction.parseSearchRequest( + searchRequest, + restRequest, + parser, + clusterSupportsFeature, + size -> failOnSizeSpecified(), + Optional.empty() + ); } searchRequest.source().size(restRequest.paramAsInt("scroll_size", searchRequest.source().size())); diff --git a/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java b/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java index a31640fab8ebd..30f3aa566c537 100644 --- a/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java +++ b/server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java @@ -43,6 +43,7 @@ import java.util.Arrays; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.Set; import java.util.function.IntConsumer; import java.util.function.Predicate; @@ -68,6 +69,7 @@ public class RestSearchAction extends BaseRestHandler { private final SearchUsageHolder searchUsageHolder; private final Predicate clusterSupportsFeature; private final Settings settings; + private final boolean inCpsContext; public RestSearchAction(SearchUsageHolder searchUsageHolder, Predicate clusterSupportsFeature) { this(searchUsageHolder, clusterSupportsFeature, null); @@ -77,6 +79,7 @@ public RestSearchAction(SearchUsageHolder searchUsageHolder, Predicate searchRequest.source().size(size); request.withContentOrSourceParamParserOrNull( - parser -> parseSearchRequest(searchRequest, request, parser, clusterSupportsFeature, setSize, searchUsageHolder) + parser -> parseSearchRequest( + searchRequest, + request, + parser, + clusterSupportsFeature, + setSize, + searchUsageHolder, + // This endpoint is CPS-enabled so propagate the right value. + Optional.of(inCpsContext) + ) ); return channel -> { @@ -146,15 +158,23 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC * parameter * @param clusterSupportsFeature used to check if certain features are available in this cluster * @param setSize how the size url parameter is handled. {@code udpate_by_query} and regular search differ here. + * @param inCpsContext specifies if we're in CPS context. + *
+ * true - the endpoint that's invoking this method is CPS-enabled and in a CPS/Serverless context. + *
+ * false - the endpoint that's invoking this method is CPS-enabled but not in a CPS/Serverless context. + *
+ * Optional.empty - the endpoint is not CPS-enabled irrespective of the environment. */ public static void parseSearchRequest( SearchRequest searchRequest, RestRequest request, XContentParser requestContentParser, Predicate clusterSupportsFeature, - IntConsumer setSize + IntConsumer setSize, + Optional inCpsContext ) throws IOException { - parseSearchRequest(searchRequest, request, requestContentParser, clusterSupportsFeature, setSize, null); + parseSearchRequest(searchRequest, request, requestContentParser, clusterSupportsFeature, setSize, null, inCpsContext); } /** @@ -167,6 +187,13 @@ public static void parseSearchRequest( * @param clusterSupportsFeature used to check if certain features are available in this cluster * @param setSize how the size url parameter is handled. {@code udpate_by_query} and regular search differ here. * @param searchUsageHolder the holder of search usage stats + * @param inCpsContext specifies if we're in CPS context. + *
+ * true - the endpoint that's invoking this method is CPS-enabled and in a CPS/Serverless context. + *
+ * false - the endpoint that's invoking this method is CPS-enabled but not in a CPS/Serverless context. + *
+ * Optional.empty - the endpoint is not CPS-enabled irrespective of the environment. */ public static void parseSearchRequest( SearchRequest searchRequest, @@ -174,7 +201,8 @@ public static void parseSearchRequest( @Nullable XContentParser requestContentParser, Predicate clusterSupportsFeature, IntConsumer setSize, - @Nullable SearchUsageHolder searchUsageHolder + @Nullable SearchUsageHolder searchUsageHolder, + Optional inCpsContext ) throws IOException { if (searchRequest.source() == null) { searchRequest.source(new SearchSourceBuilder()); @@ -229,9 +257,17 @@ public static void parseSearchRequest( if (searchRequest.pointInTimeBuilder() != null) { preparePointInTime(searchRequest, request); } else { - searchRequest.setCcsMinimizeRoundtrips( - request.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips()) - ); + if (inCpsContext.orElse(false)) { + // We're in CPS environment. MRT should not be settable by the user. + if (request.hasParam("ccs_minimize_roundtrips")) { + throw new IllegalArgumentException("Setting ccs_minimize_roundtrips is not supported in cross-project search context"); + } + } else { + // Either we're in non-CPS environment or the endpoint isn't CPS enabled, so parse what's in the request. + searchRequest.setCcsMinimizeRoundtrips( + request.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips()) + ); + } } if (request.paramAsBoolean("force_synthetic_source", false)) { searchRequest.setForceSyntheticSource(true); diff --git a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java index 39f2539dbd791..565ad19927570 100644 --- a/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java +++ b/x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java @@ -24,6 +24,7 @@ import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.IntConsumer; import java.util.function.Predicate; @@ -39,6 +40,7 @@ public final class RestSubmitAsyncSearchAction extends BaseRestHandler { private final SearchUsageHolder searchUsageHolder; private final Predicate clusterSupportsFeature; private final Settings settings; + private final boolean inCpsContext; public RestSubmitAsyncSearchAction(SearchUsageHolder searchUsageHolder, Predicate clusterSupportsFeature) { this(searchUsageHolder, clusterSupportsFeature, null); @@ -52,6 +54,7 @@ public RestSubmitAsyncSearchAction( this.searchUsageHolder = searchUsageHolder; this.clusterSupportsFeature = clusterSupportsFeature; this.settings = settings; + this.inCpsContext = settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false); } @Override @@ -71,9 +74,10 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli } SubmitAsyncSearchRequest submit = new SubmitAsyncSearchRequest(); - if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) { + if (inCpsContext) { // accept but drop project_routing param until fully supported request.param("project_routing"); + submit.getSearchRequest().setCcsMinimizeRoundtrips(true); } IntConsumer setSize = size -> submit.getSearchRequest().source().size(size); @@ -82,7 +86,16 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli // them as supported. We rely on SubmitAsyncSearchRequest#validate to fail in case they are set. // Note that ccs_minimize_roundtrips is also set this way, which is a supported option. request.withContentOrSourceParamParserOrNull( - parser -> parseSearchRequest(submit.getSearchRequest(), request, parser, clusterSupportsFeature, setSize, searchUsageHolder) + parser -> parseSearchRequest( + submit.getSearchRequest(), + request, + parser, + clusterSupportsFeature, + setSize, + searchUsageHolder, + // This endpoint is CPS-enabled so propagate the right value. + Optional.of(inCpsContext) + ) ); if (request.hasParam("wait_for_completion_timeout")) { diff --git a/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/rest/RestFleetSearchAction.java b/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/rest/RestFleetSearchAction.java index a79424b8b7d59..72df39814525f 100644 --- a/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/rest/RestFleetSearchAction.java +++ b/x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/rest/RestFleetSearchAction.java @@ -26,6 +26,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.IntConsumer; import java.util.function.Predicate; @@ -70,7 +71,16 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli IntConsumer setSize = size -> searchRequest.source().size(size); request.withContentOrSourceParamParserOrNull(parser -> { - RestSearchAction.parseSearchRequest(searchRequest, request, parser, clusterSupportsFeature, setSize, searchUsageHolder); + RestSearchAction.parseSearchRequest( + searchRequest, + request, + parser, + clusterSupportsFeature, + setSize, + searchUsageHolder, + // This endpoint is not CPS-enabled. + Optional.empty() + ); String[] stringWaitForCheckpoints = request.paramAsStringArray("wait_for_checkpoints", Strings.EMPTY_ARRAY); final long[] waitForCheckpoints = new long[stringWaitForCheckpoints.length]; for (int i = 0; i < stringWaitForCheckpoints.length; ++i) { diff --git a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/rest/RestRollupSearchAction.java b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/rest/RestRollupSearchAction.java index a2e795d07aaf2..24e0c0400f189 100644 --- a/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/rest/RestRollupSearchAction.java +++ b/x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/rest/RestRollupSearchAction.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.Predicate; @@ -52,7 +53,9 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient restRequest, parser, clusterSupportsFeature, - size -> searchRequest.source().size(size) + size -> searchRequest.source().size(size), + // This endpoint is not CPS-enabled. + Optional.empty() ) ); RestSearchAction.validateSearchRequest(restRequest, searchRequest);