Fix AbstractBulkByScrollRequest slices parameter via Rest (#53068)

Currently the AbstractBulkByScrollRequest accepts slice values of 0 via its
`setSlices` method, denoting the "auto" slicing behaviour that is usable by
settting the "slices=auto" parameter on rest requests. When using the High Level
Rest Client, however, we send the 0 value as an integer, which is then rejected
as invalid by `AbstractBulkByScrollRequest#parseSlices`. Instead of making
parsing of the rest request more lenient, this PR opts for changing the
RequestConverter logic in the client to translate 0 values to "auto" on the rest
requests.

Closes #53044
This commit is contained in:
Christoph Büscher 2020-03-06 14:55:48 +01:00
parent d145b5536f
commit 9e561c2921
3 changed files with 22 additions and 4 deletions

View File

@ -925,6 +925,10 @@ final class RequestConverters {
} }
Params withSlices(int slices) { Params withSlices(int slices) {
if (slices == 0) {
// translate to "auto" value in rest request so the receiving end doesn't throw error
return putParam("slices", AbstractBulkByScrollRequest.AUTO_SLICES_VALUE);
}
return putParam("slices", String.valueOf(slices)); return putParam("slices", String.valueOf(slices));
} }

View File

@ -83,6 +83,7 @@ import org.elasticsearch.index.rankeval.RankEvalRequest;
import org.elasticsearch.index.rankeval.RankEvalSpec; import org.elasticsearch.index.rankeval.RankEvalSpec;
import org.elasticsearch.index.rankeval.RatedRequest; import org.elasticsearch.index.rankeval.RatedRequest;
import org.elasticsearch.index.rankeval.RestRankEvalAction; import org.elasticsearch.index.rankeval.RestRankEvalAction;
import org.elasticsearch.index.reindex.AbstractBulkByScrollRequest;
import org.elasticsearch.index.reindex.DeleteByQueryRequest; import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.index.reindex.ReindexRequest; import org.elasticsearch.index.reindex.ReindexRequest;
import org.elasticsearch.index.reindex.RemoteInfo; import org.elasticsearch.index.reindex.RemoteInfo;
@ -497,9 +498,13 @@ public class RequestConvertersTests extends ESTestCase {
reindexRequest.setSourceQuery(new TermQueryBuilder("foo", "fooval")); reindexRequest.setSourceQuery(new TermQueryBuilder("foo", "fooval"));
} }
if (randomBoolean()) { if (randomBoolean()) {
int slices = randomInt(100); int slices = randomIntBetween(0,4);
reindexRequest.setSlices(slices); reindexRequest.setSlices(slices);
expectedParams.put("slices", String.valueOf(slices)); if (slices == 0) {
expectedParams.put("slices", AbstractBulkByScrollRequest.AUTO_SLICES_VALUE);
} else {
expectedParams.put("slices", Integer.toString(slices));
}
} else { } else {
expectedParams.put("slices", "1"); expectedParams.put("slices", "1");
} }
@ -567,7 +572,11 @@ public class RequestConvertersTests extends ESTestCase {
} }
if (randomBoolean()) { if (randomBoolean()) {
int slices = randomIntBetween(0, 4); int slices = randomIntBetween(0, 4);
if (slices == 0) {
expectedParams.put("slices", AbstractBulkByScrollRequest.AUTO_SLICES_VALUE);
} else {
expectedParams.put("slices", Integer.toString(slices)); expectedParams.put("slices", Integer.toString(slices));
}
updateByQueryRequest.setSlices(slices); updateByQueryRequest.setSlices(slices);
} else { } else {
expectedParams.put("slices", "1"); expectedParams.put("slices", "1");
@ -632,7 +641,11 @@ public class RequestConvertersTests extends ESTestCase {
} }
if (randomBoolean()) { if (randomBoolean()) {
int slices = randomIntBetween(0, 4); int slices = randomIntBetween(0, 4);
if (slices == 0) {
expectedParams.put("slices", AbstractBulkByScrollRequest.AUTO_SLICES_VALUE);
} else {
expectedParams.put("slices", Integer.toString(slices)); expectedParams.put("slices", Integer.toString(slices));
}
deleteByQueryRequest.setSlices(slices); deleteByQueryRequest.setSlices(slices);
} else { } else {
expectedParams.put("slices", "1"); expectedParams.put("slices", "1");

View File

@ -402,6 +402,7 @@ public abstract class AbstractBulkByScrollRequest<Self extends AbstractBulkByScr
/** /**
* The number of slices this task should be divided into. Defaults to 1 meaning the task isn't sliced into subtasks. * The number of slices this task should be divided into. Defaults to 1 meaning the task isn't sliced into subtasks.
* A value of 0 is equivalent to the "auto" slices parameter of the Rest API.
*/ */
public Self setSlices(int slices) { public Self setSlices(int slices) {
if (slices < 0) { if (slices < 0) {