Skip to content

Commit 08993af

Browse files
authored
Validate PIT on _msearch (elastic#63167) (elastic#74460)
This change ensures that we validate point in times provided by individual search requests in _msearch. Relates elastic#63132
1 parent 1b2e072 commit 08993af

File tree

4 files changed

+23
-17
lines changed

4 files changed

+23
-17
lines changed

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/search/350_point_in_time.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@ setup:
171171
---
172172
"msearch":
173173
- skip:
174-
version: " - 7.99.99"
175-
reason: "After backport: 7.9.99 => point in time is introduced in 7.10"
174+
version: " - 7.9.99"
175+
reason: "point in time is introduced in 7.10"
176176
- do:
177177
open_point_in_time:
178178
index: "t*"

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.common.Strings;
1818
import org.elasticsearch.common.bytes.BytesReference;
1919
import org.elasticsearch.common.collect.Tuple;
20+
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
2021
import org.elasticsearch.common.logging.DeprecationCategory;
2122
import org.elasticsearch.common.logging.DeprecationLogger;
2223
import org.elasticsearch.common.settings.Settings;
@@ -80,7 +81,7 @@ public String getName() {
8081

8182
@Override
8283
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
83-
MultiSearchRequest multiSearchRequest = parseRequest(request, allowExplicitIndex);
84+
MultiSearchRequest multiSearchRequest = parseRequest(request, client.getNamedWriteableRegistry(), allowExplicitIndex);
8485

8586
// Emit a single deprecation message if any search request contains types.
8687
for (SearchRequest searchRequest : multiSearchRequest.requests()) {
@@ -98,7 +99,9 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
9899
/**
99100
* Parses a {@link RestRequest} body and returns a {@link MultiSearchRequest}
100101
*/
101-
public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean allowExplicitIndex) throws IOException {
102+
public static MultiSearchRequest parseRequest(RestRequest restRequest,
103+
NamedWriteableRegistry namedWriteableRegistry,
104+
boolean allowExplicitIndex) throws IOException {
102105
MultiSearchRequest multiRequest = new MultiSearchRequest();
103106
IndicesOptions indicesOptions = IndicesOptions.fromRequest(restRequest, multiRequest.indicesOptions());
104107
multiRequest.indicesOptions(indicesOptions);
@@ -123,6 +126,13 @@ public static MultiSearchRequest parseRequest(RestRequest restRequest, boolean a
123126
parseMultiLineRequest(restRequest, multiRequest.indicesOptions(), allowExplicitIndex, (searchRequest, parser) -> {
124127
searchRequest.source(SearchSourceBuilder.fromXContent(parser, false));
125128
RestSearchAction.checkRestTotalHits(restRequest, searchRequest);
129+
if (searchRequest.pointInTimeBuilder() != null) {
130+
RestSearchAction.preparePointInTime(searchRequest, restRequest, namedWriteableRegistry);
131+
} else {
132+
searchRequest.setCcsMinimizeRoundtrips(
133+
restRequest.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips())
134+
);
135+
}
126136
multiRequest.add(searchRequest);
127137
});
128138
List<SearchRequest> requests = multiRequest.requests();

server/src/test/java/org/elasticsearch/action/search/MultiSearchRequestTests.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void testFailWithUnknownKey() {
9595
FakeRestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry())
9696
.withContent(new BytesArray(requestContent), XContentType.JSON).build();
9797
IllegalArgumentException ex = expectThrows(IllegalArgumentException.class,
98-
() -> RestMultiSearchAction.parseRequest(restRequest, true));
98+
() -> RestMultiSearchAction.parseRequest(restRequest, null, true));
9999
assertEquals("key [unknown_key] is not supported in the metadata section", ex.getMessage());
100100
}
101101

@@ -104,7 +104,7 @@ public void testSimpleAddWithCarriageReturn() throws Exception {
104104
"{\"query\" : {\"match_all\" :{}}}\r\n";
105105
FakeRestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry())
106106
.withContent(new BytesArray(requestContent), XContentType.JSON).build();
107-
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, true);
107+
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, null, true);
108108
assertThat(request.requests().size(), equalTo(1));
109109
assertThat(request.requests().get(0).indices()[0], equalTo("test"));
110110
assertThat(request.requests().get(0).indicesOptions(),
@@ -119,7 +119,7 @@ public void testDefaultIndicesOptions() throws IOException {
119119
.withContent(new BytesArray(requestContent), XContentType.JSON)
120120
.withParams(Collections.singletonMap("ignore_unavailable", "true"))
121121
.build();
122-
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, true);
122+
MultiSearchRequest request = RestMultiSearchAction.parseRequest(restRequest, null, true);
123123
assertThat(request.requests().size(), equalTo(1));
124124
assertThat(request.requests().get(0).indices()[0], equalTo("test"));
125125
assertThat(request.requests().get(0).indicesOptions(),
@@ -254,13 +254,13 @@ public void testMsearchTerminatedByNewline() throws Exception {
254254
RestRequest restRequest = new FakeRestRequest.Builder(xContentRegistry())
255255
.withContent(new BytesArray(mserchAction.getBytes(StandardCharsets.UTF_8)), XContentType.JSON).build();
256256
IllegalArgumentException expectThrows = expectThrows(IllegalArgumentException.class,
257-
() -> RestMultiSearchAction.parseRequest(restRequest, true));
257+
() -> RestMultiSearchAction.parseRequest(restRequest, null, true));
258258
assertEquals("The msearch request must be terminated by a newline [\n]", expectThrows.getMessage());
259259

260260
String mserchActionWithNewLine = mserchAction + "\n";
261261
RestRequest restRequestWithNewLine = new FakeRestRequest.Builder(xContentRegistry())
262262
.withContent(new BytesArray(mserchActionWithNewLine.getBytes(StandardCharsets.UTF_8)), XContentType.JSON).build();
263-
MultiSearchRequest msearchRequest = RestMultiSearchAction.parseRequest(restRequestWithNewLine, true);
263+
MultiSearchRequest msearchRequest = RestMultiSearchAction.parseRequest(restRequestWithNewLine, null, true);
264264
assertEquals(3, msearchRequest.requests().size());
265265
}
266266

x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/data_stream/10_data_stream_resolvability.yml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,6 @@
664664

665665
- do:
666666
search:
667-
rest_total_hits_as_int: true
668667
body:
669668
size: 1
670669
query:
@@ -675,7 +674,7 @@
675674
id: "$point_in_time_id"
676675
keep_alive: 1m
677676

678-
- match: {hits.total: 3 }
677+
- match: {hits.total.value: 3 }
679678
- length: {hits.hits: 1 }
680679
- match: {hits.hits.0._index: "/\\.ds-simple-data-stream1-(\\d{4}\\.\\d{2}\\.\\d{2}-)?000001/" }
681680
- match: {hits.hits.0._id: "123" }
@@ -684,7 +683,6 @@
684683

685684
- do:
686685
search:
687-
rest_total_hits_as_int: true
688686
body:
689687
size: 1
690688
query:
@@ -695,7 +693,7 @@
695693
pit:
696694
id: "$point_in_time_id"
697695

698-
- match: {hits.total: 3}
696+
- match: {hits.total.value: 3}
699697
- length: {hits.hits: 1 }
700698
- match: {hits.hits.0._index: "/\\.ds-simple-data-stream1-(\\d{4}\\.\\d{2}\\.\\d{2}-)?000001/" }
701699
- match: {hits.hits.0._id: "5" }
@@ -704,7 +702,6 @@
704702

705703
- do:
706704
search:
707-
rest_total_hits_as_int: true
708705
body:
709706
size: 1
710707
query:
@@ -716,7 +713,7 @@
716713
id: "$point_in_time_id"
717714
keep_alive: 1m
718715

719-
- match: {hits.total: 3}
716+
- match: {hits.total.value: 3}
720717
- length: {hits.hits: 1 }
721718
- match: {hits.hits.0._index: "/\\.ds-simple-data-stream1-(\\d{4}\\.\\d{2}\\.\\d{2}-)?000001/" }
722719
- match: {hits.hits.0._id: "1" }
@@ -725,7 +722,6 @@
725722

726723
- do:
727724
search:
728-
rest_total_hits_as_int: true
729725
body:
730726
size: 1
731727
query:
@@ -737,7 +733,7 @@
737733
id: "$point_in_time_id"
738734
keep_alive: 1m
739735

740-
- match: {hits.total: 3}
736+
- match: {hits.total.value: 3}
741737
- length: {hits.hits: 0 }
742738

743739
- do:

0 commit comments

Comments
 (0)