Selaa lähdekoodia

Reindex and friends fail nicely when max_docs < slices (#54901)

When the parameter `max_docs` is less than `slices` in update_by_query, delete_by_query or reindex API, `max_docs ` is set to 0 and we throw an action_request_validation_exception with confused error message: "maxDocs should be greater than 0...". 
This change checks that whether `max_docs` is less than `slices` and throw an illegal_argument_exception with clear message.

Relates to #52786.
bellengao 5 vuotta sitten
vanhempi
commit
6e643626df

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

@@ -50,6 +50,27 @@
           query:
             match_all: {}
 
+---
+"max_docs shoule be greater than slices":
+  - skip:
+      version: " - 7.2.99"
+      reason: "max_docs introduced in 7.3.0"
+
+  - do:
+      index:
+        index:   test
+        id:      1
+        body:    { "text": "test" }
+  - do:
+      catch: /\[max_docs\] should be >= \[slices\]/
+      delete_by_query:
+        index: test
+        max_docs: 1
+        slices: 2
+        body:
+          query:
+            match_all: {}
+
 ---
 "invalid scroll_size fails":
   - do:

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

@@ -137,6 +137,28 @@
             index: dest
           max_docs: -4
 
+---
+"max_docs shoule be greater than slices":
+  - skip:
+      version: " - 7.2.99"
+      reason: "max_docs introduced in 7.3.0"
+
+  - do:
+      index:
+        index:   test
+        id:      1
+        body:    { "text": "test" }
+  - do:
+      catch: /\[max_docs\] should be >= \[slices\]/
+      reindex:
+        max_docs: 1
+        slices: 2
+        body:
+          source:
+            index: test
+          dest:
+            index: dest
+
 ---
 "invalid max_docs in URL fails":
   - skip:

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

@@ -67,6 +67,24 @@
           query:
             match_all: {}
 
+---
+"max_docs shoule be greater than slices":
+  - skip:
+      version: " - 7.2.99"
+      reason: "max_docs introduced in 7.3.0"
+
+  - do:
+      index:
+        index:   test
+        id:      1
+        body:    { "text": "test" }
+  - do:
+      catch: /\[max_docs\] should be >= \[slices\]/
+      update_by_query:
+        index: test
+        max_docs: 1
+        slices: 2
+
 ---
 "invalid scroll_size fails":
   - do:

+ 3 - 0
server/src/main/java/org/elasticsearch/index/reindex/AbstractBulkByScrollRequest.java

@@ -187,6 +187,9 @@ public abstract class AbstractBulkByScrollRequest<Self extends AbstractBulkByScr
         if (maxDocs < 0) {
             throw new IllegalArgumentException("[max_docs] parameter cannot be negative, found [" + maxDocs + "]");
         }
+        if (maxDocs < slices) {
+            throw new IllegalArgumentException("[max_docs] should be >= [slices]");
+        }
         this.maxDocs = maxDocs;
         return self();
     }