Skip to content

Commit 035f063

Browse files
committed
Support point in time in async_search (#61560)
This commit integrates point in time into async search and ensures that it works correctly with security enabled. Relates #61062
1 parent 063a6d0 commit 035f063

File tree

19 files changed

+344
-65
lines changed

19 files changed

+344
-65
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ public String getName() {
6969
public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
7070
// Creates the search request with all required params
7171
SearchRequest searchRequest = new SearchRequest();
72-
RestSearchAction.parseSearchRequest(searchRequest, request, null, size -> searchRequest.source().size(size));
72+
RestSearchAction.parseSearchRequest(
73+
searchRequest, request, null, client.getNamedWriteableRegistry(), size -> searchRequest.source().size(size));
7374

7475
// Creates the search template request
7576
SearchTemplateRequest searchTemplateRequest;

modules/reindex/src/main/java/org/elasticsearch/index/reindex/AbstractBaseReindexRestHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.action.ActionType;
2424
import org.elasticsearch.action.support.ActiveShardCount;
2525
import org.elasticsearch.client.node.NodeClient;
26+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2627
import org.elasticsearch.common.xcontent.XContentBuilder;
2728
import org.elasticsearch.rest.BaseRestHandler;
2829
import org.elasticsearch.rest.BytesRestResponse;
@@ -49,7 +50,7 @@ protected AbstractBaseReindexRestHandler(A action) {
4950
protected RestChannelConsumer doPrepareRequest(RestRequest request, NodeClient client,
5051
boolean includeCreated, boolean includeUpdated) throws IOException {
5152
// Build the internal request
52-
Request internal = setCommonOptions(request, buildRequest(request));
53+
Request internal = setCommonOptions(request, buildRequest(request, client.getNamedWriteableRegistry()));
5354

5455
// Executes the request and waits for completion
5556
if (request.paramAsBoolean("wait_for_completion", true)) {
@@ -77,7 +78,7 @@ protected RestChannelConsumer doPrepareRequest(RestRequest request, NodeClient c
7778
/**
7879
* Build the Request based on the RestRequest.
7980
*/
80-
protected abstract Request buildRequest(RestRequest request) throws IOException;
81+
protected abstract Request buildRequest(RestRequest request, NamedWriteableRegistry namedWriteableRegistry) throws IOException;
8182

8283
/**
8384
* Sets common options of {@link AbstractBulkByScrollRequest} requests.

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.elasticsearch.action.ActionType;
2323
import org.elasticsearch.action.search.SearchRequest;
2424
import org.elasticsearch.common.bytes.BytesReference;
25+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2526
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
2627
import org.elasticsearch.common.xcontent.XContentBuilder;
2728
import org.elasticsearch.common.xcontent.XContentFactory;
@@ -44,15 +45,16 @@ protected AbstractBulkByQueryRestHandler(A action) {
4445
super(action);
4546
}
4647

47-
protected void parseInternalRequest(Request internal, RestRequest restRequest,
48+
protected void parseInternalRequest(Request internal, RestRequest restRequest, NamedWriteableRegistry namedWriteableRegistry,
4849
Map<String, Consumer<Object>> bodyConsumers) throws IOException {
4950
assert internal != null : "Request should not be null";
5051
assert restRequest != null : "RestRequest should not be null";
5152

5253
SearchRequest searchRequest = internal.getSearchRequest();
5354

5455
try (XContentParser parser = extractRequestSpecificFields(restRequest, bodyConsumers)) {
55-
RestSearchAction.parseSearchRequest(searchRequest, restRequest, parser, size -> setMaxDocsFromSearchSize(internal, size));
56+
RestSearchAction.parseSearchRequest(
57+
searchRequest, restRequest, parser, namedWriteableRegistry, size -> setMaxDocsFromSearchSize(internal, size));
5658
}
5759

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

modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestDeleteByQueryAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.reindex;
2121

2222
import org.elasticsearch.client.node.NodeClient;
23+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2324
import org.elasticsearch.rest.RestRequest;
2425

2526
import java.io.IOException;
@@ -56,7 +57,7 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
5657
}
5758

5859
@Override
59-
protected DeleteByQueryRequest buildRequest(RestRequest request) throws IOException {
60+
protected DeleteByQueryRequest buildRequest(RestRequest request, NamedWriteableRegistry namedWriteableRegistry) throws IOException {
6061
/*
6162
* Passing the search request through DeleteByQueryRequest first allows
6263
* it to set its own defaults which differ from SearchRequest's
@@ -68,7 +69,7 @@ protected DeleteByQueryRequest buildRequest(RestRequest request) throws IOExcept
6869
consumers.put("conflicts", o -> internal.setConflicts((String) o));
6970
consumers.put("max_docs", s -> setMaxDocsValidateIdentical(internal, ((Number) s).intValue()));
7071

71-
parseInternalRequest(internal, request, consumers);
72+
parseInternalRequest(internal, request, namedWriteableRegistry, consumers);
7273

7374
return internal;
7475
}

modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.elasticsearch.action.DocWriteRequest;
2323
import org.elasticsearch.client.node.NodeClient;
24+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2425
import org.elasticsearch.common.xcontent.XContentParser;
2526
import org.elasticsearch.rest.RestRequest;
2627

@@ -56,7 +57,7 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
5657
}
5758

5859
@Override
59-
protected ReindexRequest buildRequest(RestRequest request) throws IOException {
60+
protected ReindexRequest buildRequest(RestRequest request, NamedWriteableRegistry namedWriteableRegistry) throws IOException {
6061
if (request.hasParam("pipeline")) {
6162
throw new IllegalArgumentException("_reindex doesn't support [pipeline] as a query parameter. "
6263
+ "Specify it in the [dest] object instead.");

modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestUpdateByQueryAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.reindex;
2121

2222
import org.elasticsearch.client.node.NodeClient;
23+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2324
import org.elasticsearch.rest.RestRequest;
2425
import org.elasticsearch.script.Script;
2526

@@ -57,7 +58,7 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client
5758
}
5859

5960
@Override
60-
protected UpdateByQueryRequest buildRequest(RestRequest request) throws IOException {
61+
protected UpdateByQueryRequest buildRequest(RestRequest request, NamedWriteableRegistry namedWriteableRegistry) throws IOException {
6162
/*
6263
* Passing the search request through UpdateByQueryRequest first allows
6364
* it to set its own defaults which differ from SearchRequest's
@@ -70,7 +71,7 @@ protected UpdateByQueryRequest buildRequest(RestRequest request) throws IOExcept
7071
consumers.put("script", o -> internal.setScript(Script.parse(o)));
7172
consumers.put("max_docs", s -> setMaxDocsValidateIdentical(internal, ((Number) s).intValue()));
7273

73-
parseInternalRequest(internal, request, consumers);
74+
parseInternalRequest(internal, request, namedWriteableRegistry, consumers);
7475

7576
internal.setPipeline(request.param("pipeline"));
7677
return internal;

modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestDeleteByQueryActionTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void testTypeInPath() throws IOException {
4848

4949
// checks the type in the URL is propagated correctly to the request object
5050
// only works after the request is dispatched, so its params are filled from url.
51-
DeleteByQueryRequest dbqRequest = action.buildRequest(request);
51+
DeleteByQueryRequest dbqRequest = action.buildRequest(request, DEFAULT_NAMED_WRITABLE_REGISTRY);
5252
assertArrayEquals(new String[]{"some_type"}, dbqRequest.getDocTypes());
5353

5454
// RestDeleteByQueryAction itself doesn't check for a deprecated type usage
@@ -57,7 +57,8 @@ public void testTypeInPath() throws IOException {
5757
}
5858

5959
public void testParseEmpty() throws IOException {
60-
DeleteByQueryRequest request = action.buildRequest(new FakeRestRequest.Builder(new NamedXContentRegistry(emptyList())).build());
60+
final FakeRestRequest restRequest = new FakeRestRequest.Builder(new NamedXContentRegistry(emptyList())).build();
61+
DeleteByQueryRequest request = action.buildRequest(restRequest, DEFAULT_NAMED_WRITABLE_REGISTRY);
6162
assertEquals(AbstractBulkByScrollRequest.SIZE_ALL_MATCHES, request.getSize());
6263
assertEquals(AbstractBulkByScrollRequest.DEFAULT_SCROLL_SIZE, request.getSearchRequest().source().size());
6364
}

modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestReindexActionTests.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.elasticsearch.common.bytes.BytesArray;
2323
import org.elasticsearch.common.bytes.BytesReference;
24+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2425
import org.elasticsearch.common.xcontent.XContentBuilder;
2526
import org.elasticsearch.common.xcontent.XContentType;
2627
import org.elasticsearch.common.xcontent.json.JsonXContent;
@@ -30,6 +31,7 @@
3031
import org.junit.Before;
3132

3233
import java.io.IOException;
34+
import java.util.Collections;
3335
import java.util.Arrays;
3436

3537
import static java.util.Collections.singletonMap;
@@ -61,7 +63,8 @@ public void testPipelineQueryParameterIsError() throws IOException {
6163
request.withContent(BytesReference.bytes(body), body.contentType());
6264
}
6365
request.withParams(singletonMap("pipeline", "doesn't matter"));
64-
Exception e = expectThrows(IllegalArgumentException.class, () -> action.buildRequest(request.build()));
66+
Exception e = expectThrows(IllegalArgumentException.class, () ->
67+
action.buildRequest(request.build(), new NamedWriteableRegistry(Collections.emptyList())));
6568

6669
assertEquals("_reindex doesn't support [pipeline] as a query parameter. Specify it in the [dest] object instead.", e.getMessage());
6770
}
@@ -70,14 +73,14 @@ public void testSetScrollTimeout() throws IOException {
7073
{
7174
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry());
7275
requestBuilder.withContent(new BytesArray("{}"), XContentType.JSON);
73-
ReindexRequest request = action.buildRequest(requestBuilder.build());
76+
ReindexRequest request = action.buildRequest(requestBuilder.build(), new NamedWriteableRegistry(Collections.emptyList()));
7477
assertEquals(AbstractBulkByScrollRequest.DEFAULT_SCROLL_TIMEOUT, request.getScrollTime());
7578
}
7679
{
7780
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry());
7881
requestBuilder.withParams(singletonMap("scroll", "10m"));
7982
requestBuilder.withContent(new BytesArray("{}"), XContentType.JSON);
80-
ReindexRequest request = action.buildRequest(requestBuilder.build());
83+
ReindexRequest request = action.buildRequest(requestBuilder.build(), new NamedWriteableRegistry(Collections.emptyList()));
8184
assertEquals("10m", request.getScrollTime().toString());
8285
}
8386
}

modules/reindex/src/test/java/org/elasticsearch/index/reindex/RestUpdateByQueryActionTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void testTypeInPath() throws IOException {
4949

5050
// checks the type in the URL is propagated correctly to the request object
5151
// only works after the request is dispatched, so its params are filled from url.
52-
UpdateByQueryRequest ubqRequest = action.buildRequest(request);
52+
UpdateByQueryRequest ubqRequest = action.buildRequest(request, DEFAULT_NAMED_WRITABLE_REGISTRY);
5353
assertArrayEquals(new String[]{"some_type"}, ubqRequest.getDocTypes());
5454

5555
// RestUpdateByQueryAction itself doesn't check for a deprecated type usage
@@ -58,7 +58,8 @@ public void testTypeInPath() throws IOException {
5858
}
5959

6060
public void testParseEmpty() throws IOException {
61-
UpdateByQueryRequest request = action.buildRequest(new FakeRestRequest.Builder(new NamedXContentRegistry(emptyList())).build());
61+
final FakeRestRequest restRequest = new FakeRestRequest.Builder(new NamedXContentRegistry(emptyList())).build();
62+
UpdateByQueryRequest request = action.buildRequest(restRequest, DEFAULT_NAMED_WRITABLE_REGISTRY);
6263
assertEquals(AbstractBulkByScrollRequest.SIZE_ALL_MATCHES, request.getSize());
6364
assertEquals(AbstractBulkByScrollRequest.DEFAULT_SCROLL_SIZE, request.getSearchRequest().source().size());
6465
}

server/src/main/java/org/elasticsearch/action/search/SearchRequest.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,6 @@ public ActionRequestValidationException validate() {
295295
if (scroll) {
296296
validationException = addValidationError("using [point in time] is not allowed in a scroll context", validationException);
297297
}
298-
if (routing() != null) {
299-
validationException = addValidationError("[routing] cannot be used with point in time", validationException);
300-
}
301-
if (preference() != null) {
302-
validationException = addValidationError("[preference] cannot be used with point in time", validationException);
303-
}
304298
}
305299
return validationException;
306300
}

0 commit comments

Comments
 (0)