Skip to content

Commit 3d0a647

Browse files
fix: Correctly pickup MRT value for msearch's search requests (elastic#138583)
Do not override MRT from the request's body with the query param value.
1 parent 1102beb commit 3d0a647

File tree

3 files changed

+102
-4
lines changed

3 files changed

+102
-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: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,24 @@
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;
32+
import java.util.Optional;
2233

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

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
@@ -165,10 +165,6 @@ public static MultiSearchRequest parseRequest(
165165
RestSearchAction.validateSearchRequest(restRequest, searchRequest);
166166
if (searchRequest.pointInTimeBuilder() != null) {
167167
RestSearchAction.preparePointInTime(searchRequest, restRequest);
168-
} else {
169-
searchRequest.setCcsMinimizeRoundtrips(
170-
SearchParamsParser.parseCcsMinimizeRoundtrips(crossProjectEnabled, restRequest, searchRequest.isCcsMinimizeRoundtrips())
171-
);
172168
}
173169
multiRequest.add(searchRequest);
174170
}, extraParamParser, crossProjectEnabled, multiRequest.getProjectRouting());

0 commit comments

Comments
 (0)