Skip to content

Commit 43efcff

Browse files
authored
Adds check for negative search request size (#25397)
* Adds check for negative search request size This change adds a check to `SearchSourceBuilder` to throw and exception if the size set on it is set to a negative value. Closes #22530 * fix error in reindex * update re-index tests * Addresses review comment * Fixed tests * Added random negative size test * Fixes test
1 parent 1c63c82 commit 43efcff

File tree

11 files changed

+38
-10
lines changed

11 files changed

+38
-10
lines changed

core/src/main/java/org/elasticsearch/index/reindex/AbstractBulkByScrollRequest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ public int getSize() {
171171
* documents.
172172
*/
173173
public Self setSize(int size) {
174+
if (size < 0) {
175+
throw new IllegalArgumentException("[size] parameter cannot be negative, found [" + size + "]");
176+
}
174177
this.size = size;
175178
return self();
176179
}
@@ -367,10 +370,13 @@ protected Self doForSlice(Self request, TaskId slicingTask) {
367370
.setShouldStoreResult(false)
368371
// Split requests per second between all slices
369372
.setRequestsPerSecond(requestsPerSecond / slices)
370-
// Size is split between workers. This means the size might round down!
371-
.setSize(size == SIZE_ALL_MATCHES ? SIZE_ALL_MATCHES : size / slices)
372373
// Sub requests don't have workers
373374
.setSlices(1);
375+
if (size != -1) {
376+
// Size is split between workers. This means the size might round
377+
// down!
378+
request.setSize(size == SIZE_ALL_MATCHES ? SIZE_ALL_MATCHES : size / slices);
379+
}
374380
// Set the parent task so this task is cancelled if we cancel the parent
375381
request.setParentTask(slicingTask);
376382
// TODO It'd be nice not to refresh on every slice. Instead we should refresh after the sub requests finish.

core/src/main/java/org/elasticsearch/search/builder/SearchSourceBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,9 @@ public int from() {
345345
* The number of search hits to return. Defaults to <tt>10</tt>.
346346
*/
347347
public SearchSourceBuilder size(int size) {
348+
if (size < 0) {
349+
throw new IllegalArgumentException("[size] parameter cannot be negative, found [" + size + "]");
350+
}
348351
this.size = size;
349352
return this;
350353
}

core/src/test/java/org/elasticsearch/index/reindex/AbstractBulkByScrollRequestTestCase.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ public void testForSlice() {
4242
original.setSlices(between(2, 1000));
4343
original.setRequestsPerSecond(
4444
randomBoolean() ? Float.POSITIVE_INFINITY : randomValueOtherThanMany(r -> r < 0, ESTestCase::randomFloat));
45-
original.setSize(randomBoolean() ? AbstractBulkByScrollRequest.SIZE_ALL_MATCHES : between(0, Integer.MAX_VALUE));
45+
if (randomBoolean()) {
46+
original.setSize(between(0, Integer.MAX_VALUE));
47+
}
4648

4749
TaskId slicingTask = new TaskId(randomAlphaOfLength(5), randomLong());
4850
SearchRequest sliceRequest = new SearchRequest();

core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,15 @@ public void testNegativeFromErrors() {
359359
assertEquals("[from] parameter cannot be negative", expected.getMessage());
360360
}
361361

362+
public void testNegativeSizeErrors() {
363+
int randomSize = randomIntBetween(-100000, -2);
364+
IllegalArgumentException expected = expectThrows(IllegalArgumentException.class,
365+
() -> new SearchSourceBuilder().size(randomSize));
366+
assertEquals("[size] parameter cannot be negative, found [" + randomSize + "]", expected.getMessage());
367+
expected = expectThrows(IllegalArgumentException.class, () -> new SearchSourceBuilder().size(-1));
368+
assertEquals("[size] parameter cannot be negative, found [-1]", expected.getMessage());
369+
}
370+
362371
private void assertIndicesBoostParseErrorMessage(String restContent, String expectedErrorMessage) throws IOException {
363372
try (XContentParser parser = createParser(JsonXContent.jsonXContent, restContent)) {
364373
ParsingException e = expectThrows(ParsingException.class, () -> SearchSourceBuilder.fromXContent(parser));

docs/reference/migration/migrate_6_0.asciidoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ way to reindex old indices is to use the `reindex` API.
3131
* <<breaking_60_aggregations_changes>>
3232
* <<breaking_60_mappings_changes>>
3333
* <<breaking_60_docs_changes>>
34+
* <<breaking_60_reindex_changes>>
3435
* <<breaking_60_cluster_changes>>
3536
* <<breaking_60_settings_changes>>
3637
* <<breaking_60_plugins_changes>>
@@ -55,6 +56,8 @@ include::migrate_6_0/mappings.asciidoc[]
5556

5657
include::migrate_6_0/docs.asciidoc[]
5758

59+
include::migrate_6_0/reindex.asciidoc[]
60+
5861
include::migrate_6_0/cluster.asciidoc[]
5962

6063
include::migrate_6_0/settings.asciidoc[]
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[[breaking_60_reindex_changes]]
2+
=== Reindex changes
3+
4+
==== `size` parameter
5+
6+
The `size` parameter can no longer be explicitly set to `-1`. If all documents are required then the `size` parameter should not be set.

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@
3232
import java.util.Map;
3333
import java.util.function.Consumer;
3434

35-
import static org.elasticsearch.index.reindex.AbstractBulkByScrollRequest.SIZE_ALL_MATCHES;
36-
3735
/**
3836
* Rest handler for reindex actions that accepts a search request like Update-By-Query or Delete-By-Query
3937
*/
@@ -52,7 +50,6 @@ protected void parseInternalRequest(Request internal, RestRequest restRequest,
5250

5351
SearchRequest searchRequest = internal.getSearchRequest();
5452
int scrollSize = searchRequest.source().size();
55-
searchRequest.source().size(SIZE_ALL_MATCHES);
5653

5754
try (XContentParser parser = extractRequestSpecificFields(restRequest, bodyConsumers)) {
5855
RestSearchAction.parseSearchRequest(searchRequest, restRequest, parser);

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ public void testDeleteByQueryRequest() throws IOException {
131131
private void randomRequest(AbstractBulkByScrollRequest<?> request) {
132132
request.getSearchRequest().indices("test");
133133
request.getSearchRequest().source().size(between(1, 1000));
134-
request.setSize(random().nextBoolean() ? between(1, Integer.MAX_VALUE) : -1);
134+
if (randomBoolean()) {
135+
request.setSize(between(1, Integer.MAX_VALUE));
136+
}
135137
request.setAbortOnVersionConflict(random().nextBoolean());
136138
request.setRefresh(rarely());
137139
request.setTimeout(TimeValue.parseTimeValue(randomTimeValue(), null, "test"));

modules/reindex/src/test/resources/rest-api-spec/test/delete_by_query/20_validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
id: 1
4545
body: { "text": "test" }
4646
- do:
47-
catch: /size should be greater than 0 if the request is limited to some number of documents or -1 if it isn't but it was \[-4\]/
47+
catch: /\[size\] parameter cannot be negative, found \[-4\]/
4848
delete_by_query:
4949
index: test
5050
size: -4

modules/reindex/src/test/resources/rest-api-spec/test/reindex/20_validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
id: 1
105105
body: { "text": "test" }
106106
- do:
107-
catch: /size should be greater than 0 if the request is limited to some number of documents or -1 if it isn't but it was \[-4\]/
107+
catch: /\[size\] parameter cannot be negative, found \[-4\]/
108108
reindex:
109109
body:
110110
source:

modules/reindex/src/test/resources/rest-api-spec/test/update_by_query/20_validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
id: 1
2222
body: { "text": "test" }
2323
- do:
24-
catch: /size should be greater than 0 if the request is limited to some number of documents or -1 if it isn't but it was \[-4\]/
24+
catch: /\[size\] parameter cannot be negative, found \[-4\]/
2525
update_by_query:
2626
index: test
2727
size: -4

0 commit comments

Comments
 (0)