Skip to content

Commit 74f7074

Browse files
[9.1] fix: Correctly pickup MRT value for msearch's search requests (#138583) (#139585)
1 parent ef0b540 commit 74f7074

File tree

3 files changed

+99
-4
lines changed

3 files changed

+99
-4
lines changed

docs/changelog/138583.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 138583
2+
summary: "Fix: Correctly pickup MRT value for `msearch`'s search requests"
3+
area: CCS
4+
type: bug
5+
issues: []

server/src/internalClusterTest/java/org/elasticsearch/search/msearch/MultiSearchIT.java

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,23 @@
1212
import org.elasticsearch.TransportVersion;
1313
import org.elasticsearch.action.search.MultiSearchRequest;
1414
import org.elasticsearch.action.search.MultiSearchResponse.Item;
15+
import org.elasticsearch.action.search.SearchRequest;
16+
import org.elasticsearch.common.bytes.BytesArray;
1517
import org.elasticsearch.common.settings.Settings;
1618
import org.elasticsearch.index.query.QueryBuilders;
19+
import org.elasticsearch.rest.RestRequest;
20+
import org.elasticsearch.rest.action.search.RestMultiSearchAction;
1721
import org.elasticsearch.search.DummyQueryBuilder;
1822
import org.elasticsearch.search.SearchService;
1923
import org.elasticsearch.test.ESIntegTestCase;
2024
import org.elasticsearch.test.TransportVersionUtils;
25+
import org.elasticsearch.test.rest.FakeRestRequest;
26+
import org.elasticsearch.usage.UsageService;
2127
import org.elasticsearch.xcontent.XContentType;
28+
import org.hamcrest.Matchers;
29+
30+
import java.io.IOException;
31+
import java.util.Map;
2232

2333
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertFirstHit;
2434
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
@@ -119,4 +129,88 @@ public TransportVersion getMinimalSupportedVersion() {
119129
}
120130
);
121131
}
132+
133+
public void testMrtValuesArePickedCorrectly() throws IOException {
134+
135+
{
136+
// If no MRT is specified, all searches should default to true.
137+
String body = """
138+
{"index": "index-1" }
139+
{"query" : {"match" : { "message": "this is a test"}}}
140+
{"index": "index-2" }
141+
{"query" : {"match_all" : {}}}
142+
""";
143+
144+
MultiSearchRequest mreq = parseRequest(body, Map.of());
145+
for (SearchRequest req : mreq.requests()) {
146+
assertTrue(req.isCcsMinimizeRoundtrips());
147+
}
148+
}
149+
150+
{
151+
// MRT query param is false, so all searches should use this value.
152+
String body = """
153+
{"index": "index-1" }
154+
{"query" : {"match" : { "message": "this is a test"}}}
155+
{"index": "index-2" }
156+
{"query" : {"match_all" : {}}}
157+
""";
158+
159+
MultiSearchRequest mreq = parseRequest(body, Map.of("ccs_minimize_roundtrips", "false"));
160+
for (SearchRequest req : mreq.requests()) {
161+
assertFalse(req.isCcsMinimizeRoundtrips());
162+
}
163+
}
164+
165+
{
166+
// Query param is absent but MRT is specified for each request.
167+
String body = """
168+
{"index": "index-1", "ccs_minimize_roundtrips": false }
169+
{"query" : {"match" : { "message": "this is a test"}}}
170+
{"index": "index-2", "ccs_minimize_roundtrips": false }
171+
{"query" : {"match_all" : {}}}
172+
""";
173+
174+
MultiSearchRequest mreq = parseRequest(body, Map.of());
175+
for (SearchRequest req : mreq.requests()) {
176+
assertFalse(req.isCcsMinimizeRoundtrips());
177+
}
178+
}
179+
180+
{
181+
/*
182+
* The first request overrides the query param and should use MRT=true.
183+
* The second request should use the query param value.
184+
*/
185+
String body = """
186+
{"index": "index-1", "ccs_minimize_roundtrips": true }
187+
{"query" : {"match" : { "message": "this is a test"}}}
188+
{"index": "index-2" }
189+
{"query" : {"match_all" : {}}}
190+
""";
191+
192+
MultiSearchRequest mreq = parseRequest(body, Map.of("ccs_minimize_roundtrips", "false"));
193+
194+
assertThat(mreq.requests().size(), Matchers.is(2));
195+
assertTrue(mreq.requests().getFirst().isCcsMinimizeRoundtrips());
196+
assertFalse(mreq.requests().getLast().isCcsMinimizeRoundtrips());
197+
}
198+
}
199+
200+
private RestRequest mkRequest(String body, Map<String, String> params) {
201+
return new FakeRestRequest.Builder(xContentRegistry()).withMethod(RestRequest.Method.POST)
202+
.withPath("/index*/_msearch")
203+
.withParams(params)
204+
.withContent(new BytesArray(body), XContentType.JSON)
205+
.build();
206+
}
207+
208+
private MultiSearchRequest parseRequest(String body, Map<String, String> params) throws IOException {
209+
return RestMultiSearchAction.parseRequest(
210+
mkRequest(body, params),
211+
true,
212+
new UsageService().getSearchUsageHolder(),
213+
(ignored) -> true
214+
);
215+
}
122216
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,6 @@ public static MultiSearchRequest parseRequest(
135135
RestSearchAction.validateSearchRequest(restRequest, searchRequest);
136136
if (searchRequest.pointInTimeBuilder() != null) {
137137
RestSearchAction.preparePointInTime(searchRequest, restRequest);
138-
} else {
139-
searchRequest.setCcsMinimizeRoundtrips(
140-
restRequest.paramAsBoolean("ccs_minimize_roundtrips", searchRequest.isCcsMinimizeRoundtrips())
141-
);
142138
}
143139
multiRequest.add(searchRequest);
144140
}, extraParamParser);

0 commit comments

Comments
 (0)