Deprecate use of type in reindex request body (#36823)

Types can be used both in the source and dest section of the body which will
be translated to search and index requests respectively. Adding a deprecation warning
for those cases and removing examples using more than one type in reindex since
support for this is going to be removed.
This commit is contained in:
Christoph Büscher 2019-01-03 10:29:14 +01:00 committed by GitHub
parent e21054d176
commit 046f86f274
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 83 additions and 27 deletions

View File

@ -48,8 +48,8 @@ public class ReindexIT extends ESRestHighLevelClientTestCase {
createIndex(sourceIndex, settings);
createIndex(destinationIndex, settings);
BulkRequest bulkRequest = new BulkRequest()
.add(new IndexRequest(sourceIndex, "type", "1").source(Collections.singletonMap("foo", "bar"), XContentType.JSON))
.add(new IndexRequest(sourceIndex, "type", "2").source(Collections.singletonMap("foo2", "bar2"), XContentType.JSON))
.add(new IndexRequest(sourceIndex).id("1").source(Collections.singletonMap("foo", "bar"), XContentType.JSON))
.add(new IndexRequest(sourceIndex).id("2").source(Collections.singletonMap("foo2", "bar2"), XContentType.JSON))
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
assertEquals(
RestStatus.OK,
@ -64,7 +64,7 @@ public class ReindexIT extends ESRestHighLevelClientTestCase {
ReindexRequest reindexRequest = new ReindexRequest();
reindexRequest.setSourceIndices(sourceIndex);
reindexRequest.setDestIndex(destinationIndex);
reindexRequest.setSourceQuery(new IdsQueryBuilder().addIds("1").types("type"));
reindexRequest.setSourceQuery(new IdsQueryBuilder().addIds("1"));
reindexRequest.setRefresh(true);
BulkByScrollResponse bulkResponse = execute(reindexRequest, highLevelClient()::reindex, highLevelClient()::reindexAsync);
@ -94,8 +94,8 @@ public class ReindexIT extends ESRestHighLevelClientTestCase {
createIndex(sourceIndex, settings);
createIndex(destinationIndex, settings);
BulkRequest bulkRequest = new BulkRequest()
.add(new IndexRequest(sourceIndex, "type", "1").source(Collections.singletonMap("foo", "bar"), XContentType.JSON))
.add(new IndexRequest(sourceIndex, "type", "2").source(Collections.singletonMap("foo2", "bar2"), XContentType.JSON))
.add(new IndexRequest(sourceIndex).id("1").source(Collections.singletonMap("foo", "bar"), XContentType.JSON))
.add(new IndexRequest(sourceIndex).id("2").source(Collections.singletonMap("foo2", "bar2"), XContentType.JSON))
.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
assertEquals(
RestStatus.OK,

View File

@ -138,8 +138,8 @@ POST _reindex
// CONSOLE
// TEST[setup:twitter]
You can limit the documents by adding a type to the `source` or by adding a
query. This will only copy tweets made by `kimchy` into `new_twitter`:
You can limit the documents by adding a query to the `source`.
This will only copy tweets made by `kimchy` into `new_twitter`:
[source,js]
--------------------------------------------------
@ -147,7 +147,6 @@ POST _reindex
{
"source": {
"index": "twitter",
"type": "_doc",
"query": {
"term": {
"user": "kimchy"
@ -162,21 +161,19 @@ POST _reindex
// CONSOLE
// TEST[setup:twitter]
`index` and `type` in `source` can both be lists, allowing you to copy from
lots of sources in one request. This will copy documents from the `_doc` and
`post` types in the `twitter` and `blog` indices.
`index` in `source` can be a list, allowing you to copy from lots
of sources in one request. This will copy documents from the
`twitter` and `blog` indices:
[source,js]
--------------------------------------------------
POST _reindex
{
"source": {
"index": ["twitter", "blog"],
"type": ["_doc", "post"]
"index": ["twitter", "blog"]
},
"dest": {
"index": "all_together",
"type": "_doc"
"index": "all_together"
}
}
--------------------------------------------------
@ -299,7 +296,6 @@ Think of the possibilities! Just be careful; you are able to
change:
* `_id`
* `_type`
* `_index`
* `_version`
* `_routing`

View File

@ -19,11 +19,13 @@
package org.elasticsearch.index.reindex;
import org.apache.logging.log4j.LogManager;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.ObjectParser;
@ -56,6 +58,8 @@ import static org.elasticsearch.rest.RestRequest.Method.POST;
*/
public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexRequest, ReindexAction> {
static final ObjectParser<ReindexRequest, Void> PARSER = new ObjectParser<>("reindex");
static final String TYPES_DEPRECATION_MESSAGE = "[types removal] Specifying types in reindex requests is deprecated.";
private static final DeprecationLogger deprecationLogger = new DeprecationLogger(LogManager.getLogger(RestReindexAction.class));
static {
ObjectParser.Parser<ReindexRequest, Void> sourceParser = (parser, request, context) -> {
@ -67,6 +71,7 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
}
String[] types = extractStringArray(source, "type");
if (types != null) {
deprecationLogger.deprecatedAndMaybeLog("reindex_with_types", TYPES_DEPRECATION_MESSAGE);
request.getSearchRequest().types(types);
}
request.setRemoteInfo(buildRemoteInfo(source));
@ -81,7 +86,10 @@ public class RestReindexAction extends AbstractBaseReindexRestHandler<ReindexReq
ObjectParser<IndexRequest, Void> destParser = new ObjectParser<>("dest");
destParser.declareString(IndexRequest::index, new ParseField("index"));
destParser.declareString(IndexRequest::type, new ParseField("type"));
destParser.declareString((request, type) -> {
deprecationLogger.deprecatedAndMaybeLog("reindex_with_types", TYPES_DEPRECATION_MESSAGE);
request.type(type);
}, new ParseField("type"));
destParser.declareString(IndexRequest::routing, new ParseField("routing"));
destParser.declareString(IndexRequest::opType, new ParseField("op_type"));
destParser.declareString(IndexRequest::setPipeline, new ParseField("pipeline"));

View File

@ -26,19 +26,28 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.rest.RestRequest.Method;
import org.elasticsearch.test.rest.FakeRestRequest;
import org.elasticsearch.test.rest.RestActionTestCase;
import org.junit.Before;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static java.util.Collections.singletonMap;
import static org.elasticsearch.common.unit.TimeValue.timeValueSeconds;
import static org.mockito.Mockito.mock;
public class RestReindexActionTests extends ESTestCase {
public class RestReindexActionTests extends RestActionTestCase {
private RestReindexAction action;
@Before
public void setUpAction() {
action = new RestReindexAction(Settings.EMPTY, controller());
}
public void testBuildRemoteInfoNoRemote() throws IOException {
assertNull(RestReindexAction.buildRemoteInfo(new HashMap<>()));
}
@ -160,8 +169,6 @@ public class RestReindexActionTests extends ESTestCase {
}
public void testPipelineQueryParameterIsError() throws IOException {
RestReindexAction action = new RestReindexAction(Settings.EMPTY, mock(RestController.class));
FakeRestRequest.Builder request = new FakeRestRequest.Builder(xContentRegistry());
try (XContentBuilder body = JsonXContent.contentBuilder().prettyPrint()) {
body.startObject(); {
@ -185,14 +192,12 @@ public class RestReindexActionTests extends ESTestCase {
public void testSetScrollTimeout() throws IOException {
{
RestReindexAction action = new RestReindexAction(Settings.EMPTY, mock(RestController.class));
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry());
requestBuilder.withContent(new BytesArray("{}"), XContentType.JSON);
ReindexRequest request = action.buildRequest(requestBuilder.build());
assertEquals(AbstractBulkByScrollRequest.DEFAULT_SCROLL_TIMEOUT, request.getScrollTime());
}
{
RestReindexAction action = new RestReindexAction(Settings.EMPTY, mock(RestController.class));
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry());
requestBuilder.withParams(singletonMap("scroll", "10m"));
requestBuilder.withContent(new BytesArray("{}"), XContentType.JSON);
@ -210,4 +215,46 @@ public class RestReindexActionTests extends ESTestCase {
return RestReindexAction.buildRemoteInfo(source);
}
/**
* test deprecation is logged if one or more types are used in source search request inside reindex
*/
public void testTypeInSource() throws IOException {
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry())
.withMethod(Method.POST)
.withPath("/_reindex");
XContentBuilder b = JsonXContent.contentBuilder().startObject();
{
b.startObject("source");
{
b.field("type", randomFrom(Arrays.asList("\"t1\"", "[\"t1\", \"t2\"]", "\"_doc\"")));
}
b.endObject();
}
b.endObject();
requestBuilder.withContent(new BytesArray(BytesReference.bytes(b).toBytesRef()), XContentType.JSON);
dispatchRequest(requestBuilder.build());
assertWarnings(RestReindexAction.TYPES_DEPRECATION_MESSAGE);
}
/**
* test deprecation is logged if a type is used in the destination index request inside reindex
*/
public void testTypeInDestination() throws IOException {
FakeRestRequest.Builder requestBuilder = new FakeRestRequest.Builder(xContentRegistry())
.withMethod(Method.POST)
.withPath("/_reindex");
XContentBuilder b = JsonXContent.contentBuilder().startObject();
{
b.startObject("dest");
{
b.field("type", (randomBoolean() ? "_doc" : randomAlphaOfLength(4)));
}
b.endObject();
}
b.endObject();
requestBuilder.withContent(new BytesArray(BytesReference.bytes(b).toBytesRef()), XContentType.JSON);
dispatchRequest(requestBuilder.build());
assertWarnings(RestReindexAction.TYPES_DEPRECATION_MESSAGE);
}
}

View File

@ -29,6 +29,7 @@ import org.elasticsearch.common.lucene.uid.Versions;
import org.elasticsearch.common.xcontent.ToXContentObject;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.tasks.TaskId;
@ -294,7 +295,10 @@ public class ReindexRequest extends AbstractBulkIndexByScrollRequest<ReindexRequ
builder.field("remote", remoteInfo);
}
builder.array("index", getSearchRequest().indices());
builder.array("type", getSearchRequest().types());
String[] types = getSearchRequest().types();
if (types.length > 0) {
builder.array("type", types);
}
getSearchRequest().source().innerToXContent(builder, params);
builder.endObject();
}
@ -302,7 +306,8 @@ public class ReindexRequest extends AbstractBulkIndexByScrollRequest<ReindexRequ
// build destination
builder.startObject("dest");
builder.field("index", getDestination().index());
if (getDestination().type() != null) {
String type = getDestination().type();
if (type != null && type.equals(MapperService.SINGLE_MAPPING_NAME) == false) {
builder.field("type", getDestination().type());
}
if (getDestination().routing() != null) {