Skip to content

Commit 391e78d

Browse files
ccs_minimize_roundtrips should default to true for async search for CPS (#135614)
MRT defaults to `true` for `_search` and `false` for `_async_search`. However, we'd want both to default to `true` for CPS. An error is returned should the user try to set the value manually. Fulfils CPS requirement S2D18.
1 parent 3d16a1e commit 391e78d

File tree

6 files changed

+90
-15
lines changed

6 files changed

+90
-15
lines changed

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/RestSearchTemplateAction.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import java.io.IOException;
2525
import java.util.List;
26+
import java.util.Optional;
2627
import java.util.Set;
2728
import java.util.function.Predicate;
2829

@@ -38,10 +39,12 @@ public class RestSearchTemplateAction extends BaseRestHandler {
3839

3940
private final Predicate<NodeFeature> clusterSupportsFeature;
4041
private final Settings settings;
42+
private final boolean inCpsContext;
4143

4244
public RestSearchTemplateAction(Predicate<NodeFeature> clusterSupportsFeature, Settings settings) {
4345
this.clusterSupportsFeature = clusterSupportsFeature;
4446
this.settings = settings;
47+
this.inCpsContext = settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false);
4548
}
4649

4750
@Override
@@ -61,7 +64,7 @@ public String getName() {
6164

6265
@Override
6366
public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
64-
if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) {
67+
if (inCpsContext) {
6568
// accept but drop project_routing param until fully supported
6669
request.param("project_routing");
6770
}
@@ -73,7 +76,9 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
7376
request,
7477
null,
7578
clusterSupportsFeature,
76-
size -> searchRequest.source().size(size)
79+
size -> searchRequest.source().size(size),
80+
// This endpoint is CPS-enabled so propagate the right value.
81+
Optional.of(inCpsContext)
7782
);
7883

7984
// Creates the search template request

modules/reindex/src/main/java/org/elasticsearch/reindex/AbstractBulkByQueryRestHandler.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import java.io.IOException;
2828
import java.util.Map;
29+
import java.util.Optional;
2930
import java.util.function.Consumer;
3031
import java.util.function.Predicate;
3132

@@ -52,7 +53,14 @@ protected void parseInternalRequest(
5253
SearchRequest searchRequest = internal.getSearchRequest();
5354

5455
try (XContentParser parser = extractRequestSpecificFields(restRequest, bodyConsumers)) {
55-
RestSearchAction.parseSearchRequest(searchRequest, restRequest, parser, clusterSupportsFeature, size -> failOnSizeSpecified());
56+
RestSearchAction.parseSearchRequest(
57+
searchRequest,
58+
restRequest,
59+
parser,
60+
clusterSupportsFeature,
61+
size -> failOnSizeSpecified(),
62+
Optional.empty()
63+
);
5664
}
5765

5866
searchRequest.source().size(restRequest.paramAsInt("scroll_size", searchRequest.source().size()));

server/src/main/java/org/elasticsearch/rest/action/search/RestSearchAction.java

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.Arrays;
4444
import java.util.List;
4545
import java.util.Locale;
46+
import java.util.Optional;
4647
import java.util.Set;
4748
import java.util.function.IntConsumer;
4849
import java.util.function.Predicate;
@@ -68,6 +69,7 @@ public class RestSearchAction extends BaseRestHandler {
6869
private final SearchUsageHolder searchUsageHolder;
6970
private final Predicate<NodeFeature> clusterSupportsFeature;
7071
private final Settings settings;
72+
private final boolean inCpsContext;
7173

7274
public RestSearchAction(SearchUsageHolder searchUsageHolder, Predicate<NodeFeature> clusterSupportsFeature) {
7375
this(searchUsageHolder, clusterSupportsFeature, null);
@@ -77,6 +79,7 @@ public RestSearchAction(SearchUsageHolder searchUsageHolder, Predicate<NodeFeatu
7779
this.searchUsageHolder = searchUsageHolder;
7880
this.clusterSupportsFeature = clusterSupportsFeature;
7981
this.settings = settings;
82+
this.inCpsContext = settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false);
8083
}
8184

8285
@Override
@@ -109,7 +112,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
109112
// this might be set by old clients
110113
request.param("min_compatible_shard_node");
111114

112-
if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) {
115+
if (inCpsContext) {
113116
// accept but drop project_routing param until fully supported
114117
request.param("project_routing");
115118
}
@@ -128,7 +131,16 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
128131
*/
129132
IntConsumer setSize = size -> searchRequest.source().size(size);
130133
request.withContentOrSourceParamParserOrNull(
131-
parser -> parseSearchRequest(searchRequest, request, parser, clusterSupportsFeature, setSize, searchUsageHolder)
134+
parser -> parseSearchRequest(
135+
searchRequest,
136+
request,
137+
parser,
138+
clusterSupportsFeature,
139+
setSize,
140+
searchUsageHolder,
141+
// This endpoint is CPS-enabled so propagate the right value.
142+
Optional.of(inCpsContext)
143+
)
132144
);
133145

134146
return channel -> {
@@ -146,15 +158,23 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
146158
* parameter
147159
* @param clusterSupportsFeature used to check if certain features are available in this cluster
148160
* @param setSize how the size url parameter is handled. {@code udpate_by_query} and regular search differ here.
161+
* @param inCpsContext specifies if we're in CPS context.
162+
* <br>
163+
* true - the endpoint that's invoking this method is CPS-enabled and in a CPS/Serverless context.
164+
* <br>
165+
* false - the endpoint that's invoking this method is CPS-enabled but not in a CPS/Serverless context.
166+
* <br>
167+
* Optional.empty - the endpoint is not CPS-enabled irrespective of the environment.
149168
*/
150169
public static void parseSearchRequest(
151170
SearchRequest searchRequest,
152171
RestRequest request,
153172
XContentParser requestContentParser,
154173
Predicate<NodeFeature> clusterSupportsFeature,
155-
IntConsumer setSize
174+
IntConsumer setSize,
175+
Optional<Boolean> inCpsContext
156176
) throws IOException {
157-
parseSearchRequest(searchRequest, request, requestContentParser, clusterSupportsFeature, setSize, null);
177+
parseSearchRequest(searchRequest, request, requestContentParser, clusterSupportsFeature, setSize, null, inCpsContext);
158178
}
159179

160180
/**
@@ -167,14 +187,22 @@ public static void parseSearchRequest(
167187
* @param clusterSupportsFeature used to check if certain features are available in this cluster
168188
* @param setSize how the size url parameter is handled. {@code udpate_by_query} and regular search differ here.
169189
* @param searchUsageHolder the holder of search usage stats
190+
* @param inCpsContext specifies if we're in CPS context.
191+
* <br>
192+
* true - the endpoint that's invoking this method is CPS-enabled and in a CPS/Serverless context.
193+
* <br>
194+
* false - the endpoint that's invoking this method is CPS-enabled but not in a CPS/Serverless context.
195+
* <br>
196+
* Optional.empty - the endpoint is not CPS-enabled irrespective of the environment.
170197
*/
171198
public static void parseSearchRequest(
172199
SearchRequest searchRequest,
173200
RestRequest request,
174201
@Nullable XContentParser requestContentParser,
175202
Predicate<NodeFeature> clusterSupportsFeature,
176203
IntConsumer setSize,
177-
@Nullable SearchUsageHolder searchUsageHolder
204+
@Nullable SearchUsageHolder searchUsageHolder,
205+
Optional<Boolean> inCpsContext
178206
) throws IOException {
179207
if (searchRequest.source() == null) {
180208
searchRequest.source(new SearchSourceBuilder());
@@ -229,9 +257,17 @@ public static void parseSearchRequest(
229257
if (searchRequest.pointInTimeBuilder() != null) {
230258
preparePointInTime(searchRequest, request);
231259
} else {
232-
searchRequest.setCcsMinimizeRoundtrips(
233-
request.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips())
234-
);
260+
if (inCpsContext.orElse(false)) {
261+
// We're in CPS environment. MRT should not be settable by the user.
262+
if (request.hasParam("ccs_minimize_roundtrips")) {
263+
throw new IllegalArgumentException("Setting ccs_minimize_roundtrips is not supported in cross-project search context");
264+
}
265+
} else {
266+
// Either we're in non-CPS environment or the endpoint isn't CPS enabled, so parse what's in the request.
267+
searchRequest.setCcsMinimizeRoundtrips(
268+
request.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips())
269+
);
270+
}
235271
}
236272
if (request.paramAsBoolean("force_synthetic_source", false)) {
237273
searchRequest.setForceSyntheticSource(true);

x-pack/plugin/async-search/src/main/java/org/elasticsearch/xpack/search/RestSubmitAsyncSearchAction.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.io.IOException;
2525
import java.util.Collections;
2626
import java.util.List;
27+
import java.util.Optional;
2728
import java.util.Set;
2829
import java.util.function.IntConsumer;
2930
import java.util.function.Predicate;
@@ -39,6 +40,7 @@ public final class RestSubmitAsyncSearchAction extends BaseRestHandler {
3940
private final SearchUsageHolder searchUsageHolder;
4041
private final Predicate<NodeFeature> clusterSupportsFeature;
4142
private final Settings settings;
43+
private final boolean inCpsContext;
4244

4345
public RestSubmitAsyncSearchAction(SearchUsageHolder searchUsageHolder, Predicate<NodeFeature> clusterSupportsFeature) {
4446
this(searchUsageHolder, clusterSupportsFeature, null);
@@ -52,6 +54,7 @@ public RestSubmitAsyncSearchAction(
5254
this.searchUsageHolder = searchUsageHolder;
5355
this.clusterSupportsFeature = clusterSupportsFeature;
5456
this.settings = settings;
57+
this.inCpsContext = settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false);
5558
}
5659

5760
@Override
@@ -71,9 +74,10 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
7174
}
7275
SubmitAsyncSearchRequest submit = new SubmitAsyncSearchRequest();
7376

74-
if (settings != null && settings.getAsBoolean("serverless.cross_project.enabled", false)) {
77+
if (inCpsContext) {
7578
// accept but drop project_routing param until fully supported
7679
request.param("project_routing");
80+
submit.getSearchRequest().setCcsMinimizeRoundtrips(true);
7781
}
7882

7983
IntConsumer setSize = size -> submit.getSearchRequest().source().size(size);
@@ -82,7 +86,16 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
8286
// them as supported. We rely on SubmitAsyncSearchRequest#validate to fail in case they are set.
8387
// Note that ccs_minimize_roundtrips is also set this way, which is a supported option.
8488
request.withContentOrSourceParamParserOrNull(
85-
parser -> parseSearchRequest(submit.getSearchRequest(), request, parser, clusterSupportsFeature, setSize, searchUsageHolder)
89+
parser -> parseSearchRequest(
90+
submit.getSearchRequest(),
91+
request,
92+
parser,
93+
clusterSupportsFeature,
94+
setSize,
95+
searchUsageHolder,
96+
// This endpoint is CPS-enabled so propagate the right value.
97+
Optional.of(inCpsContext)
98+
)
8699
);
87100

88101
if (request.hasParam("wait_for_completion_timeout")) {

x-pack/plugin/fleet/src/main/java/org/elasticsearch/xpack/fleet/rest/RestFleetSearchAction.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Arrays;
2727
import java.util.Collections;
2828
import java.util.List;
29+
import java.util.Optional;
2930
import java.util.Set;
3031
import java.util.function.IntConsumer;
3132
import java.util.function.Predicate;
@@ -70,7 +71,16 @@ protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient cli
7071

7172
IntConsumer setSize = size -> searchRequest.source().size(size);
7273
request.withContentOrSourceParamParserOrNull(parser -> {
73-
RestSearchAction.parseSearchRequest(searchRequest, request, parser, clusterSupportsFeature, setSize, searchUsageHolder);
74+
RestSearchAction.parseSearchRequest(
75+
searchRequest,
76+
request,
77+
parser,
78+
clusterSupportsFeature,
79+
setSize,
80+
searchUsageHolder,
81+
// This endpoint is not CPS-enabled.
82+
Optional.empty()
83+
);
7484
String[] stringWaitForCheckpoints = request.paramAsStringArray("wait_for_checkpoints", Strings.EMPTY_ARRAY);
7585
final long[] waitForCheckpoints = new long[stringWaitForCheckpoints.length];
7686
for (int i = 0; i < stringWaitForCheckpoints.length; ++i) {

x-pack/plugin/rollup/src/main/java/org/elasticsearch/xpack/rollup/rest/RestRollupSearchAction.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.io.IOException;
1919
import java.util.List;
20+
import java.util.Optional;
2021
import java.util.Set;
2122
import java.util.function.Predicate;
2223

@@ -52,7 +53,9 @@ protected RestChannelConsumer prepareRequest(RestRequest restRequest, NodeClient
5253
restRequest,
5354
parser,
5455
clusterSupportsFeature,
55-
size -> searchRequest.source().size(size)
56+
size -> searchRequest.source().size(size),
57+
// This endpoint is not CPS-enabled.
58+
Optional.empty()
5659
)
5760
);
5861
RestSearchAction.validateSearchRequest(restRequest, searchRequest);

0 commit comments

Comments
 (0)