[7.x] Add prefer_v2_templates flag and index setting (#55411) (#55476)

This commit adds a new querystring parameter on the following APIs:
- Index
- Update
- Bulk
- Create Index
- Rollover

These APIs now support a `?prefer_v2_templates=true|false` flag. This flag changes the preference
creation to use either V2 index templates or V1 templates. This flag defaults to `false` and will be
changed to `true` for 8.0+ in subsequent work.

Additionally, setting this flag internally sets the `index.prefer_v2_templates` index-level setting.
This setting is used so that actions that automatically create a new index (things like rollover
initiated by ILM) will inherit the preference from the original index. This setting is dynamic so
that a transition from v1 to v2 templates can occur for long-running indices grouped by an alias
performing periodic rollover.

This also adds support for sending this parameter to the High Level Rest Client.

Relates to #53101
This commit is contained in:
Lee Hinman 2020-04-20 12:05:42 -06:00 committed by GitHub
parent a0763d958d
commit 9eddd2bcc9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 530 additions and 50 deletions

View File

@ -116,6 +116,9 @@ final class IndicesRequestConverters {
parameters.withTimeout(createIndexRequest.timeout());
parameters.withMasterTimeout(createIndexRequest.masterNodeTimeout());
parameters.withWaitForActiveShards(createIndexRequest.waitForActiveShards());
if (createIndexRequest.preferV2Templates() != null) {
parameters.putParam(IndexMetadata.PREFER_V2_TEMPLATES_FLAG, Boolean.toString(createIndexRequest.preferV2Templates()));
}
request.addParameters(parameters.asMap());
request.setEntity(RequestConverters.createEntity(createIndexRequest, RequestConverters.REQUEST_BODY_CONTENT_TYPE));
return request;

View File

@ -56,6 +56,7 @@ import org.elasticsearch.client.indices.AnalyzeRequest;
import org.elasticsearch.client.security.RefreshPolicy;
import org.elasticsearch.client.tasks.TaskId;
import org.elasticsearch.cluster.health.ClusterHealthStatus;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.Priority;
import org.elasticsearch.common.Strings;
@ -132,6 +133,9 @@ final class RequestConverters {
parameters.withRefreshPolicy(bulkRequest.getRefreshPolicy());
parameters.withPipeline(bulkRequest.pipeline());
parameters.withRouting(bulkRequest.routing());
if (bulkRequest.preferV2Templates() != null) {
parameters.putParam(IndexMetadata.PREFER_V2_TEMPLATES_FLAG, Boolean.toString(bulkRequest.preferV2Templates()));
}
// Bulk API only supports newline delimited JSON or Smile. Before executing
// the bulk, we need to check that all requests have the same content-type
// and this content-type is supported by the Bulk API.
@ -345,6 +349,9 @@ final class RequestConverters {
parameters.withPipeline(indexRequest.getPipeline());
parameters.withRefreshPolicy(indexRequest.getRefreshPolicy());
parameters.withWaitForActiveShards(indexRequest.waitForActiveShards());
if (indexRequest.preferV2Templates() != null) {
parameters.putParam(IndexMetadata.PREFER_V2_TEMPLATES_FLAG, Boolean.toString(indexRequest.preferV2Templates()));
}
BytesRef source = indexRequest.source().toBytesRef();
ContentType contentType = createContentType(indexRequest.getContentType());
@ -373,6 +380,9 @@ final class RequestConverters {
parameters.withRetryOnConflict(updateRequest.retryOnConflict());
parameters.withVersion(updateRequest.version());
parameters.withVersionType(updateRequest.versionType());
if (updateRequest.preferV2Templates() != null) {
parameters.putParam(IndexMetadata.PREFER_V2_TEMPLATES_FLAG, Boolean.toString(updateRequest.preferV2Templates()));
}
// The Java API allows update requests with different content types
// set for the partial document and the upsert document. This client

View File

@ -25,6 +25,7 @@ import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.client.TimedRequest;
import org.elasticsearch.client.Validatable;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesArray;
@ -62,6 +63,7 @@ public class CreateIndexRequest extends TimedRequest implements Validatable, ToX
private BytesReference mappings;
private XContentType mappingsXContentType;
private Boolean preferV2Templates;
private final Set<Alias> aliases = new HashSet<>();
@ -265,6 +267,16 @@ public class CreateIndexRequest extends TimedRequest implements Validatable, ToX
return this;
}
public CreateIndexRequest preferV2Templates(Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
@Nullable
public Boolean preferV2Templates() {
return this.preferV2Templates;
}
/**
* Sets the settings and mappings as a single source.
*

View File

@ -385,6 +385,7 @@ Returns:
"settings": {
"index.number_of_replicas": "1",
"index.number_of_shards": "1",
"index.prefer_v2_templates": "false",
"index.creation_date": "1474389951325",
"index.uuid": "n6gzFZTgS664GUfx0Xrpjw",
"index.version.created": ...,
@ -421,7 +422,8 @@ Returns:
"version": {
"created": ...
},
"provided_name" : "twitter"
"provided_name" : "twitter",
"prefer_v2_templates": "false"
}
}
}

View File

@ -87,6 +87,10 @@
"pipeline":{
"type":"string",
"description":"The pipeline id to preprocess incoming documents with"
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during automatic index creation"
}
},
"body":{

View File

@ -90,6 +90,10 @@
"pipeline":{
"type":"string",
"description":"The pipeline id to preprocess incoming documents with"
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during automatic index creation"
}
},
"body":{

View File

@ -139,6 +139,10 @@
"pipeline":{
"type":"string",
"description":"The pipeline id to preprocess incoming documents with"
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during automatic index creation"
}
},
"body":{

View File

@ -37,6 +37,10 @@
"master_timeout":{
"type":"time",
"description":"Specify timeout for connection to master"
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during index creation"
}
},
"body":{

View File

@ -57,6 +57,10 @@
"wait_for_active_shards":{
"type":"string",
"description":"Set the number of active shards to wait for on the newly created rollover index before the operation returns."
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during automatic index creation"
}
},
"body":{

View File

@ -99,6 +99,10 @@
"if_primary_term":{
"type":"number",
"description":"only perform the update operation if the last operation that has changed the document has the specified primary term"
},
"prefer_v2_templates": {
"type": "boolean",
"description": "favor V2 templates instead of V1 templates during automatic index creation"
}
},
"body":{

View File

@ -61,6 +61,7 @@
- do:
indices.create:
index: bar-baz
prefer_v2_templates: true
body:
settings:
index.priority: 17
@ -120,6 +121,7 @@
- do:
indices.create:
prefer_v2_templates: true
index: bar-baz
- do:
@ -164,6 +166,7 @@
- do:
indices.create:
prefer_v2_templates: true
index: bazfoo
- do:
@ -193,6 +196,7 @@
- do:
indices.create:
prefer_v2_templates: true
index: eggplant
- do:
@ -200,3 +204,32 @@
index: eggplant
- match: {eggplant.settings.index.number_of_shards: "3"}
---
"Version 1 templates are preferred if the flag is set":
- skip:
version: " - 7.7.99"
reason: "index template v2 API unavailable before 7.8"
features: allowed_warnings
- do:
allowed_warnings:
- "index template [my-template] has index patterns [eggplant] matching patterns from existing older templates [global] with patterns (global => [*]); this template [my-template] will take precedence during new index creation"
indices.put_index_template:
name: my-template
body:
index_patterns: ["eggplant"]
template:
settings:
number_of_replicas: 2
- do:
indices.create:
prefer_v2_templates: false
index: eggplant
- do:
indices.get:
index: eggplant
- match: {eggplant.settings.index.number_of_replicas: "1"}

View File

@ -25,6 +25,7 @@ import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.cluster.ack.ClusterStateUpdateRequest;
import org.elasticsearch.cluster.block.ClusterBlock;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.index.Index;
@ -44,6 +45,7 @@ public class CreateIndexClusterStateUpdateRequest extends ClusterStateUpdateRequ
private Index recoverFrom;
private ResizeType resizeType;
private boolean copySettings;
private Boolean preferV2Templates;
private Settings settings = Settings.Builder.EMPTY_SETTINGS;
@ -96,6 +98,11 @@ public class CreateIndexClusterStateUpdateRequest extends ClusterStateUpdateRequ
return this;
}
public CreateIndexClusterStateUpdateRequest preferV2Templates(@Nullable Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
public String cause() {
return cause;
}
@ -147,4 +154,8 @@ public class CreateIndexClusterStateUpdateRequest extends ClusterStateUpdateRequ
return copySettings;
}
@Nullable
public Boolean preferV2Templates() {
return preferV2Templates;
}
}

View File

@ -29,6 +29,7 @@ import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.master.AcknowledgedRequest;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.bytes.BytesArray;
@ -83,6 +84,8 @@ public class CreateIndexRequest extends AcknowledgedRequest<CreateIndexRequest>
private final Map<String, String> mappings = new HashMap<>();
private Boolean preferV2Templates;
private final Set<Alias> aliases = new HashSet<>();
private ActiveShardCount waitForActiveShards = ActiveShardCount.DEFAULT;
@ -118,6 +121,9 @@ public class CreateIndexRequest extends AcknowledgedRequest<CreateIndexRequest>
in.readBoolean(); // updateAllTypes
}
waitForActiveShards = ActiveShardCount.readFrom(in);
if (in.getVersion().onOrAfter(Version.V_7_8_0)) {
preferV2Templates = in.readOptionalBoolean();
}
}
public CreateIndexRequest() {
@ -169,6 +175,16 @@ public class CreateIndexRequest extends AcknowledgedRequest<CreateIndexRequest>
return this;
}
public CreateIndexRequest preferV2Templates(@Nullable Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
@Nullable
public Boolean preferV2Templates() {
return this.preferV2Templates;
}
/**
* The settings to create the index with.
*/
@ -459,7 +475,7 @@ public class CreateIndexRequest extends AcknowledgedRequest<CreateIndexRequest>
public CreateIndexRequest waitForActiveShards(final int waitForActiveShards) {
return waitForActiveShards(ActiveShardCount.from(waitForActiveShards));
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
@ -483,6 +499,9 @@ public class CreateIndexRequest extends AcknowledgedRequest<CreateIndexRequest>
out.writeBoolean(true); // updateAllTypes
}
waitForActiveShards.writeTo(out);
if (out.getVersion().onOrAfter(Version.V_7_8_0)) {
out.writeOptionalBoolean(preferV2Templates);
}
}
@Override

View File

@ -81,6 +81,7 @@ public class TransportCreateIndexAction extends TransportMasterNodeAction<Create
.ackTimeout(request.timeout()).masterNodeTimeout(request.masterNodeTimeout())
.settings(request.settings()).mappings(request.mappings())
.aliases(request.aliases())
.preferV2Templates(request.preferV2Templates())
.waitForActiveShards(request.waitForActiveShards());
createIndexService.createIndex(updateRequest, ActionListener.map(listener, response ->

View File

@ -140,7 +140,8 @@ public class MetadataRolloverService {
.settings(createIndexRequest.settings())
.aliases(createIndexRequest.aliases())
.waitForActiveShards(ActiveShardCount.NONE) // not waiting for shards here, will wait on the alias switch operation
.mappings(createIndexRequest.mappings());
.mappings(createIndexRequest.mappings())
.preferV2Templates(createIndexRequest.preferV2Templates());
}
/**

View File

@ -40,6 +40,7 @@ import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.index.shard.DocsStats;
import org.elasticsearch.tasks.Task;
@ -133,6 +134,13 @@ public class TransportRolloverAction extends TransportMasterNodeAction<RolloverR
+ rolloverIndexName + "]", new ClusterStateUpdateTask() {
@Override
public ClusterState execute(ClusterState currentState) throws Exception {
// If they haven't explicitly specified whether to use V2 or V1 templates, inherit their preference
// from the existing index (the source index) settings.
if (rolloverRequest.getCreateIndexRequest().preferV2Templates() == null) {
Settings originalIndexSettings = currentState.metadata().index(sourceIndexName).getSettings();
rolloverRequest.getCreateIndexRequest()
.preferV2Templates(IndexMetadata.PREFER_V2_TEMPLATES_SETTING.get(originalIndexSettings));
}
MetadataRolloverService.RolloverResult rolloverResult = rolloverService.rolloverClusterState(currentState,
rolloverRequest.getAlias(), rolloverRequest.getNewIndexName(), rolloverRequest.getCreateIndexRequest(),
metConditions, false);

View File

@ -19,6 +19,7 @@
package org.elasticsearch.action.bulk;
import org.elasticsearch.Version;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.CompositeIndicesRequest;
@ -75,6 +76,7 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
private String globalRouting;
private String globalIndex;
private String globalType;
private Boolean preferV2Templates;
private long sizeInBytes = 0;
@ -89,11 +91,14 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
}
refreshPolicy = RefreshPolicy.readFrom(in);
timeout = in.readTimeValue();
if (in.getVersion().onOrAfter(Version.V_7_8_0)) {
this.preferV2Templates = in.readOptionalBoolean();
}
}
public BulkRequest(@Nullable String globalIndex) {
this.globalIndex = globalIndex;
}
}
/**
* @deprecated Types are in the process of being removed. Use {@link #BulkRequest(String)} instead
@ -207,6 +212,16 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
return this.requests;
}
public BulkRequest preferV2Templates(@Nullable Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
@Nullable
public Boolean preferV2Templates() {
return this.preferV2Templates;
}
/**
* The number of actions in the bulk request.
*/
@ -242,11 +257,11 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
/**
* Adds a framed data in binary format
*/
public BulkRequest add(byte[] data, int from, int length, @Nullable String defaultIndex,
public BulkRequest add(byte[] data, int from, int length, @Nullable String defaultIndex,
XContentType xContentType) throws IOException {
return add(new BytesArray(data, from, length), defaultIndex, MapperService.SINGLE_MAPPING_NAME, xContentType);
}
/**
* Adds a framed data in binary format
* @deprecated use {@link #add(BytesReference, String, XContentType)} instead
@ -256,14 +271,14 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
XContentType xContentType) throws IOException {
return add(data, defaultIndex, defaultType, null, null, null, true, xContentType);
}
/**
* Adds a framed data in binary format
*/
public BulkRequest add(BytesReference data, @Nullable String defaultIndex,
public BulkRequest add(BytesReference data, @Nullable String defaultIndex,
XContentType xContentType) throws IOException {
return add(data, defaultIndex, MapperService.SINGLE_MAPPING_NAME, null, null, null, true, xContentType);
}
}
/**
* Adds a framed data in binary format
@ -274,19 +289,19 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
XContentType xContentType) throws IOException {
return add(data, defaultIndex, defaultType, null, null, null, allowExplicitIndex, xContentType);
}
/**
* Adds a framed data in binary format
*/
public BulkRequest add(BytesReference data, @Nullable String defaultIndex, boolean allowExplicitIndex,
XContentType xContentType) throws IOException {
return add(data, defaultIndex, MapperService.SINGLE_MAPPING_NAME, null, null, null, allowExplicitIndex, xContentType);
}
public BulkRequest add(BytesReference data, @Nullable String defaultIndex,
}
public BulkRequest add(BytesReference data, @Nullable String defaultIndex,
@Nullable String defaultRouting, @Nullable FetchSourceContext defaultFetchSourceContext,
@Nullable String defaultPipeline, boolean allowExplicitIndex,
XContentType xContentType) throws IOException {
XContentType xContentType) throws IOException {
return add(data, defaultIndex, MapperService.SINGLE_MAPPING_NAME, defaultRouting, defaultFetchSourceContext,
defaultPipeline, allowExplicitIndex, xContentType);
}
@ -409,6 +424,9 @@ public class BulkRequest extends ActionRequest implements CompositeIndicesReques
}
refreshPolicy.writeTo(out);
out.writeTimeValue(timeout);
if (out.getVersion().onOrAfter(Version.V_7_8_0)) {
out.writeOptionalBoolean(preferV2Templates);
}
}
@Override

View File

@ -168,7 +168,9 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
IndexRequest indexRequest = getIndexWriteRequest(actionRequest);
if (indexRequest != null) {
// Each index request needs to be evaluated, because this method also modifies the IndexRequest
boolean indexRequestHasPipeline = resolvePipelines(actionRequest, indexRequest, metadata);
boolean preferV2Templates = bulkRequest.preferV2Templates() == null ?
IndexMetadata.PREFER_V2_TEMPLATES_SETTING.getDefault(Settings.EMPTY) : bulkRequest.preferV2Templates();
boolean indexRequestHasPipeline = resolvePipelines(actionRequest, indexRequest, preferV2Templates, metadata);
hasIndexRequestsWithPipelines |= indexRequestHasPipeline;
}
@ -239,7 +241,7 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
} else {
final AtomicInteger counter = new AtomicInteger(autoCreateIndices.size());
for (String index : autoCreateIndices) {
createIndex(index, bulkRequest.timeout(), new ActionListener<CreateIndexResponse>() {
createIndex(index, bulkRequest.preferV2Templates(), bulkRequest.timeout(), new ActionListener<CreateIndexResponse>() {
@Override
public void onResponse(CreateIndexResponse result) {
if (counter.decrementAndGet() == 0) {
@ -274,7 +276,8 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
}
}
static boolean resolvePipelines(final DocWriteRequest<?> originalRequest, final IndexRequest indexRequest, final Metadata metadata) {
static boolean resolvePipelines(final DocWriteRequest<?> originalRequest, final IndexRequest indexRequest,
final boolean preferV2Templates, final Metadata metadata) {
if (indexRequest.isPipelineResolved() == false) {
final String requestPipeline = indexRequest.getPipeline();
indexRequest.setPipeline(IngestService.NOOP_PIPELINE_NAME);
@ -314,7 +317,7 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
// templates to look for pipelines in either a matching V2 template (which takes
// precedence), or if a V2 template does not match, any V1 templates
String v2Template = MetadataIndexTemplateService.findV2Template(metadata, indexRequest.index(), false);
if (v2Template != null) {
if (v2Template != null && preferV2Templates) {
Settings settings = MetadataIndexTemplateService.resolveSettings(metadata, v2Template);
if (defaultPipeline == null && IndexSettings.DEFAULT_PIPELINE.exists(settings)) {
defaultPipeline = IndexSettings.DEFAULT_PIPELINE.get(settings);
@ -382,11 +385,12 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
return autoCreateIndex.shouldAutoCreate(index, state);
}
void createIndex(String index, TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
void createIndex(String index, Boolean preferV2Templates, TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
CreateIndexRequest createIndexRequest = new CreateIndexRequest();
createIndexRequest.index(index);
createIndexRequest.cause("auto(bulk api)");
createIndexRequest.masterNodeTimeout(timeout);
createIndexRequest.preferV2Templates(preferV2Templates);
client.admin().indices().create(createIndexRequest, listener);
}

View File

@ -22,6 +22,7 @@ package org.elasticsearch.action.bulk;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.HandledTransportAction;
import org.elasticsearch.action.support.WriteRequest;
@ -72,6 +73,9 @@ public abstract class TransportSingleItemBulkWriteAction<
bulkRequest.setRefreshPolicy(request.getRefreshPolicy());
bulkRequest.timeout(request.timeout());
bulkRequest.waitForActiveShards(request.waitForActiveShards());
if (request instanceof IndexRequest) {
bulkRequest.preferV2Templates(((IndexRequest) request).preferV2Templates());
}
request.setRefreshPolicy(WriteRequest.RefreshPolicy.NONE);
return bulkRequest;
}

View File

@ -117,6 +117,7 @@ public class IndexRequest extends ReplicatedWriteRequest<IndexRequest> implement
private boolean isRetry = false;
private long ifSeqNo = UNASSIGNED_SEQ_NO;
private long ifPrimaryTerm = UNASSIGNED_PRIMARY_TERM;
private Boolean preferV2Templates;
public IndexRequest(StreamInput in) throws IOException {
super(in);
@ -155,6 +156,9 @@ public class IndexRequest extends ReplicatedWriteRequest<IndexRequest> implement
ifSeqNo = UNASSIGNED_SEQ_NO;
ifPrimaryTerm = UNASSIGNED_PRIMARY_TERM;
}
if (in.getVersion().onOrAfter(Version.V_7_8_0)) {
this.preferV2Templates = in.readOptionalBoolean();
}
}
public IndexRequest() {
@ -643,6 +647,16 @@ public class IndexRequest extends ReplicatedWriteRequest<IndexRequest> implement
return ifSeqNo;
}
public IndexRequest preferV2Templates(@Nullable Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
@Nullable
public Boolean preferV2Templates() {
return this.preferV2Templates;
}
/**
* If set, only perform this indexing request if the document was last modification was assigned this primary term.
*
@ -746,6 +760,9 @@ public class IndexRequest extends ReplicatedWriteRequest<IndexRequest> implement
"sequence number based compare and write is not supported until all nodes are on version 7.0 or higher. " +
"Stream version [" + out.getVersion() + "]");
}
if (out.getVersion().onOrAfter(Version.V_7_8_0)) {
out.writeOptionalBoolean(preferV2Templates);
}
}
@Override

View File

@ -117,8 +117,11 @@ public class TransportUpdateAction extends TransportInstanceSingleOperationActio
protected void doExecute(Task task, final UpdateRequest request, final ActionListener<UpdateResponse> listener) {
// if we don't have a master, we don't have metadata, that's fine, let it find a master using create index API
if (autoCreateIndex.shouldAutoCreate(request.index(), clusterService.state())) {
client.admin().indices().create(new CreateIndexRequest().index(request.index()).cause("auto(update api)")
.masterNodeTimeout(request.timeout()), new ActionListener<CreateIndexResponse>() {
client.admin().indices().create(new CreateIndexRequest()
.index(request.index())
.cause("auto(update api)")
.preferV2Templates(request.preferV2Templates())
.masterNodeTimeout(request.timeout()), new ActionListener<CreateIndexResponse>() {
@Override
public void onResponse(CreateIndexResponse result) {
innerExecute(task, request, listener);

View File

@ -122,6 +122,7 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
private boolean scriptedUpsert = false;
private boolean docAsUpsert = false;
private boolean detectNoop = true;
private Boolean preferV2Templates;
@Nullable
private IndexRequest doc;
@ -168,6 +169,9 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
ifPrimaryTerm = in.readVLong();
detectNoop = in.readBoolean();
scriptedUpsert = in.readBoolean();
if (in.getVersion().onOrAfter(Version.V_7_8_0)) {
preferV2Templates = in.readOptionalBoolean();
}
}
public UpdateRequest(String index, String id) {
@ -235,7 +239,7 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
@Override
public String type() {
if (type == null) {
return MapperService.SINGLE_MAPPING_NAME;
return MapperService.SINGLE_MAPPING_NAME;
}
return type;
}
@ -264,8 +268,8 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
type = defaultType;
}
return this;
}
}
/**
* The id of the indexed document.
*/
@ -869,12 +873,22 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
return this;
}
@Nullable
public Boolean preferV2Templates() {
return this.preferV2Templates;
}
public UpdateRequest preferV2Templates(@Nullable Boolean preferV2Templates) {
this.preferV2Templates = preferV2Templates;
return this;
}
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
waitForActiveShards.writeTo(out);
// A 7.x request allows null types but if deserialized in a 6.x node will cause nullpointer exceptions.
// So we use the type accessor method here to make the type non-null (will default it to "_doc").
// A 7.x request allows null types but if deserialized in a 6.x node will cause nullpointer exceptions.
// So we use the type accessor method here to make the type non-null (will default it to "_doc").
out.writeString(type());
out.writeString(id);
out.writeOptionalString(routing);
@ -922,6 +936,9 @@ public class UpdateRequest extends InstanceShardOperationRequest<UpdateRequest>
out.writeVLong(ifPrimaryTerm);
out.writeBoolean(detectNoop);
out.writeBoolean(scriptedUpsert);
if (out.getVersion().onOrAfter(Version.V_7_8_0)) {
out.writeOptionalBoolean(preferV2Templates);
}
}
@Override

View File

@ -815,7 +815,7 @@ public interface IndicesAdminClient extends ElasticsearchClient {
/**
* Swaps the index pointed to by an alias given all provided conditions are satisfied
*/
ActionFuture<RolloverResponse> rolloversIndex(RolloverRequest request);
ActionFuture<RolloverResponse> rolloverIndex(RolloverRequest request);
/**
* Swaps the index pointed to by an alias given all provided conditions are satisfied

View File

@ -1727,7 +1727,7 @@ public abstract class AbstractClient implements Client {
}
@Override
public ActionFuture<RolloverResponse> rolloversIndex(RolloverRequest request) {
public ActionFuture<RolloverResponse> rolloverIndex(RolloverRequest request) {
return execute(RolloverAction.INSTANCE, request);
}

View File

@ -247,6 +247,10 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
public static final Setting.AffixSetting<String> INDEX_ROUTING_INITIAL_RECOVERY_GROUP_SETTING =
Setting.prefixKeySetting("index.routing.allocation.initial_recovery.", key -> Setting.simpleString(key));
// this is only setable internally not a registered setting!!
public static final String PREFER_V2_TEMPLATES_FLAG = "prefer_v2_templates";
public static final String SETTING_PREFER_V2_TEMPLATES = "index." + PREFER_V2_TEMPLATES_FLAG;
public static final Setting<Boolean> PREFER_V2_TEMPLATES_SETTING = Setting.boolSetting(SETTING_PREFER_V2_TEMPLATES, false,
Property.Dynamic, Property.IndexScope);
/**
* The number of active shard copies to check for before proceeding with a write operation.
@ -1162,7 +1166,6 @@ public class IndexMetadata implements Diffable<IndexMetadata>, ToXContentFragmen
Arrays.fill(primaryTerms, SequenceNumbers.UNASSIGNED_PRIMARY_TERM);
}
public IndexMetadata build() {
ImmutableOpenMap.Builder<String, AliasMetadata> tmpAliases = aliases;
Settings tmpSettings = settings;

View File

@ -325,14 +325,19 @@ public class MetadataCreateIndexService {
// Check to see if a v2 template matched
final String v2Template = MetadataIndexTemplateService.findV2Template(currentState.metadata(),
request.index(), isHiddenFromRequest == null ? false : isHiddenFromRequest);
final boolean preferV2Templates = resolvePreferV2Templates(request);
if (v2Template != null) {
if (v2Template != null && preferV2Templates) {
// If a v2 template was found, it takes precedence over all v1 templates, so create
// the index using that template and the request's specified settings
return applyCreateIndexRequestWithV2Template(currentState, request, silent, v2Template, metadataTransformer);
} else {
// A v2 template wasn't found, check the v1 templates, in the event no templates are
// found creation still works using the request's specified index settings
if (v2Template != null) {
logger.debug("ignoring matching index template [{}] as [prefer_v2_templates] is set to false", v2Template);
}
// A v2 template wasn't found (or is not preferred), check the v1 templates, in the
// event no templates are found creation still works using the request's specified
// index settings
final List<IndexTemplateMetadata> v1Templates = MetadataIndexTemplateService.findV1Templates(currentState.metadata(),
request.index(), isHiddenFromRequest);
@ -341,6 +346,11 @@ public class MetadataCreateIndexService {
}
}
private static boolean resolvePreferV2Templates(CreateIndexClusterStateUpdateRequest request) {
return request.preferV2Templates() == null ?
IndexMetadata.PREFER_V2_TEMPLATES_SETTING.get(request.settings()) : request.preferV2Templates();
}
public ClusterState applyCreateIndexRequest(ClusterState currentState, CreateIndexClusterStateUpdateRequest request,
boolean silent) throws Exception {
return applyCreateIndexRequest(currentState, request, silent, null);
@ -410,7 +420,8 @@ public class MetadataCreateIndexService {
private IndexMetadata buildAndValidateTemporaryIndexMetadata(final ClusterState currentState,
final Settings aggregatedIndexSettings,
final CreateIndexClusterStateUpdateRequest request,
final int routingNumShards) {
final int routingNumShards,
final boolean preferV2Templates) {
final boolean isHiddenAfterTemplates = IndexMetadata.INDEX_HIDDEN_SETTING.get(aggregatedIndexSettings);
validateDotIndex(request.index(), currentState, isHiddenAfterTemplates);
@ -418,6 +429,7 @@ public class MetadataCreateIndexService {
// remove the setting it's temporary and is only relevant once we create the index
final Settings.Builder settingsBuilder = Settings.builder().put(aggregatedIndexSettings);
settingsBuilder.remove(IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING.getKey());
settingsBuilder.put(IndexMetadata.PREFER_V2_TEMPLATES_SETTING.getKey(), preferV2Templates);
final Settings indexSettings = settingsBuilder.build();
final IndexMetadata.Builder tmpImdBuilder = IndexMetadata.builder(request.index());
@ -437,7 +449,8 @@ public class MetadataCreateIndexService {
final List<IndexTemplateMetadata> templates,
final BiConsumer<Metadata.Builder, IndexMetadata> metadataTransformer)
throws Exception {
logger.info("applying create index request using v1 templates {}", templates);
logger.info("applying create index request using v1 templates {}",
templates.stream().map(IndexTemplateMetadata::name).collect(Collectors.toList()));
final Map<String, Map<String, Object>> mappings = Collections.unmodifiableMap(parseMappings(request.mappings(),
templates.stream().map(IndexTemplateMetadata::getMappings)
@ -456,7 +469,8 @@ public class MetadataCreateIndexService {
aggregateIndexSettings(currentState, request, MetadataIndexTemplateService.resolveSettings(templates), mappings,
null, settings, indexScopedSettings);
int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards,
resolvePreferV2Templates(request));
return applyCreateIndexWithTemporaryService(currentState, request, silent, null, tmpImd, mappings,
indexService -> resolveAndValidateAliases(request.index(), request.aliases(),
@ -486,7 +500,8 @@ public class MetadataCreateIndexService {
MetadataIndexTemplateService.resolveSettings(currentState.metadata(), templateName),
mappings, null, settings, indexScopedSettings);
int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards,
resolvePreferV2Templates(request));
return applyCreateIndexWithTemporaryService(currentState, request, silent, null, tmpImd, mappings,
indexService -> resolveAndValidateAliases(request.index(), request.aliases(),
@ -518,7 +533,8 @@ public class MetadataCreateIndexService {
final Settings aggregatedIndexSettings =
aggregateIndexSettings(currentState, request, Settings.EMPTY, mappings, sourceMetadata, settings, indexScopedSettings);
final int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, sourceMetadata);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(currentState, aggregatedIndexSettings, request, routingNumShards,
IndexMetadata.PREFER_V2_TEMPLATES_SETTING.get(sourceMetadata.getSettings()));
return applyCreateIndexWithTemporaryService(currentState, request, silent, sourceMetadata, tmpImd, mappings,
indexService -> resolveAndValidateAliases(request.index(), request.aliases(), Collections.emptyList(),

View File

@ -82,6 +82,7 @@ public final class IndexScopedSettings extends AbstractScopedSettings {
IndexMetadata.INDEX_DATA_PATH_SETTING,
IndexMetadata.INDEX_FORMAT_SETTING,
IndexMetadata.INDEX_HIDDEN_SETTING,
IndexMetadata.PREFER_V2_TEMPLATES_SETTING,
SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_DEBUG_SETTING,
SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_WARN_SETTING,
SearchSlowLog.INDEX_SEARCH_SLOWLOG_THRESHOLD_FETCH_INFO_SETTING,

View File

@ -23,6 +23,8 @@ import org.apache.logging.log4j.LogManager;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.support.ActiveShardCount;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.xcontent.LoggingDeprecationHandler;
import org.elasticsearch.common.xcontent.XContentHelper;
@ -56,6 +58,11 @@ public class RestCreateIndexAction extends BaseRestHandler {
return "create_index_action";
}
@Nullable
public static Boolean preferV2Templates(final RestRequest request) {
return request.paramAsBoolean(IndexMetadata.PREFER_V2_TEMPLATES_FLAG, null);
}
@Override
public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException {
final boolean includeTypeName = request.paramAsBoolean(INCLUDE_TYPE_NAME_PARAMETER,
@ -66,6 +73,7 @@ public class RestCreateIndexAction extends BaseRestHandler {
}
CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index"));
createIndexRequest.preferV2Templates(preferV2Templates(request));
if (request.hasContent()) {
Map<String, Object> sourceAsMap = XContentHelper.convertToMap(request.requiredContent(), false,

View File

@ -67,6 +67,7 @@ public class RestRolloverIndexAction extends BaseRestHandler {
rolloverIndexRequest.masterNodeTimeout(request.paramAsTime("master_timeout", rolloverIndexRequest.masterNodeTimeout()));
rolloverIndexRequest.getCreateIndexRequest().waitForActiveShards(
ActiveShardCount.parseString(request.param("wait_for_active_shards")));
rolloverIndexRequest.getCreateIndexRequest().preferV2Templates(RestCreateIndexAction.preferV2Templates(request));
return channel -> client.admin().indices().rolloverIndex(rolloverIndexRequest, new RestToXContentListener<>(channel));
}
}

View File

@ -31,6 +31,7 @@ import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.elasticsearch.rest.action.admin.indices.RestCreateIndexAction;
import org.elasticsearch.rest.action.search.RestSearchAction;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
@ -100,6 +101,7 @@ public class RestBulkAction extends BaseRestHandler {
bulkRequest.setRefreshPolicy(request.param("refresh"));
bulkRequest.add(request.requiredContent(), defaultIndex, defaultType, defaultRouting,
defaultFetchSourceContext, defaultPipeline, allowExplicitIndex, request.getXContentType());
bulkRequest.preferV2Templates(RestCreateIndexAction.preferV2Templates(request));
return channel -> client.bulk(bulkRequest, new RestStatusToXContentListener<>(channel));
}

View File

@ -32,6 +32,7 @@ import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestActions;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.elasticsearch.rest.action.admin.indices.RestCreateIndexAction;
import java.io.IOException;
import java.util.List;
@ -145,6 +146,7 @@ public class RestIndexAction extends BaseRestHandler {
indexRequest.versionType(VersionType.fromString(request.param("version_type"), indexRequest.versionType()));
indexRequest.setIfSeqNo(request.paramAsLong("if_seq_no", indexRequest.ifSeqNo()));
indexRequest.setIfPrimaryTerm(request.paramAsLong("if_primary_term", indexRequest.ifPrimaryTerm()));
indexRequest.preferV2Templates(RestCreateIndexAction.preferV2Templates(request));
String sOpType = request.param("op_type");
String waitForActiveShards = request.param("wait_for_active_shards");
if (waitForActiveShards != null) {

View File

@ -31,6 +31,7 @@ import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestActions;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.elasticsearch.rest.action.admin.indices.RestCreateIndexAction;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import java.io.IOException;
@ -74,6 +75,7 @@ public class RestUpdateAction extends BaseRestHandler {
updateRequest.routing(request.param("routing"));
updateRequest.timeout(request.paramAsTime("timeout", updateRequest.timeout()));
updateRequest.setRefreshPolicy(request.param("refresh"));
updateRequest.preferV2Templates(RestCreateIndexAction.preferV2Templates(request));
String waitForActiveShards = request.param("wait_for_active_shards");
if (waitForActiveShards != null) {
updateRequest.waitForActiveShards(ActiveShardCount.parseString(waitForActiveShards));

View File

@ -137,7 +137,8 @@ public class TransportBulkActionIndicesThatCannotBeCreatedTests extends ESTestCa
}
@Override
void createIndex(String index, TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
void createIndex(String index, Boolean preferV2Templates,
TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
// If we try to create an index just immediately assume it worked
listener.onResponse(new CreateIndexResponse(true, true, index) {});
}

View File

@ -156,7 +156,8 @@ public class TransportBulkActionIngestTests extends ESTestCase {
}
@Override
void createIndex(String index, TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
void createIndex(String index, Boolean preferV2Templates,
TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
indexCreated = true;
listener.onResponse(null);
}
@ -589,6 +590,7 @@ public class TransportBulkActionIngestTests extends ESTestCase {
when(state.getMetadata()).thenReturn(metadata);
IndexRequest indexRequest = new IndexRequest("missing_index").id("id");
indexRequest.preferV2Templates(true);
indexRequest.source(Collections.emptyMap());
AtomicBoolean responseCalled = new AtomicBoolean(false);
AtomicBoolean failureCalled = new AtomicBoolean(false);

View File

@ -79,7 +79,8 @@ public class TransportBulkActionTests extends ESTestCase {
}
@Override
void createIndex(String index, TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
void createIndex(String index, Boolean preferV2Templates,
TimeValue timeout, ActionListener<CreateIndexResponse> listener) {
indexCreated = true;
listener.onResponse(null);
}
@ -173,14 +174,14 @@ public class TransportBulkActionTests extends ESTestCase {
// index name matches with IDM:
IndexRequest indexRequest = new IndexRequest("idx");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("default-pipeline"));
// alias name matches with IDM:
indexRequest = new IndexRequest("alias");
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("default-pipeline"));
@ -191,7 +192,7 @@ public class TransportBulkActionTests extends ESTestCase {
.settings(settings(Version.CURRENT).put(IndexSettings.DEFAULT_PIPELINE.getKey(), "default-pipeline"));
metadata = Metadata.builder().put(templateBuilder).build();
indexRequest = new IndexRequest("idx");
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("default-pipeline"));
@ -207,7 +208,7 @@ public class TransportBulkActionTests extends ESTestCase {
// index name matches with IDM:
IndexRequest indexRequest = new IndexRequest("idx");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("_none"));
@ -215,7 +216,7 @@ public class TransportBulkActionTests extends ESTestCase {
// alias name matches with IDM:
indexRequest = new IndexRequest("alias");
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("_none"));
@ -227,7 +228,7 @@ public class TransportBulkActionTests extends ESTestCase {
.settings(settings(Version.CURRENT).put(IndexSettings.FINAL_PIPELINE.getKey(), "final-pipeline"));
metadata = Metadata.builder().put(templateBuilder).build();
indexRequest = new IndexRequest("idx");
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("_none"));
@ -239,7 +240,7 @@ public class TransportBulkActionTests extends ESTestCase {
{
Metadata metadata = Metadata.builder().build();
IndexRequest indexRequest = new IndexRequest("idx");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(false));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo(IngestService.NOOP_PIPELINE_NAME));
@ -249,7 +250,7 @@ public class TransportBulkActionTests extends ESTestCase {
{
Metadata metadata = Metadata.builder().build();
IndexRequest indexRequest = new IndexRequest("idx").setPipeline("request-pipeline");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("request-pipeline"));
@ -263,7 +264,7 @@ public class TransportBulkActionTests extends ESTestCase {
.numberOfReplicas(0);
Metadata metadata = Metadata.builder().put(builder).build();
IndexRequest indexRequest = new IndexRequest("idx").setPipeline("request-pipeline");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("request-pipeline"));
@ -277,7 +278,7 @@ public class TransportBulkActionTests extends ESTestCase {
.numberOfReplicas(0);
Metadata metadata = Metadata.builder().put(builder).build();
IndexRequest indexRequest = new IndexRequest("idx").setPipeline("request-pipeline");
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, metadata);
boolean result = TransportBulkAction.resolvePipelines(indexRequest, indexRequest, false, metadata);
assertThat(result, is(true));
assertThat(indexRequest.isPipelineResolved(), is(true));
assertThat(indexRequest.getPipeline(), equalTo("request-pipeline"));

View File

@ -0,0 +1,253 @@
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.indices.template;
import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.rollover.RolloverRequest;
import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse;
import org.elasticsearch.action.admin.indices.template.delete.DeleteIndexTemplateV2Action;
import org.elasticsearch.action.admin.indices.template.put.PutIndexTemplateV2Action;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.cluster.metadata.IndexTemplateV2;
import org.elasticsearch.cluster.metadata.Template;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.test.ESSingleNodeTestCase;
import org.junit.After;
import org.junit.Before;
import java.util.Collections;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.hamcrest.Matchers.equalTo;
public class TemplatePreferenceIT extends ESSingleNodeTestCase {
private static final String INDEX = "index";
@Before
public void setup() throws Exception {
assertAcked(client().admin().indices().preparePutTemplate("v1")
.setOrder(10)
.setSettings(Settings.builder()
.put("index.priority", 15)
.put("index.soft_deletes.enabled", true)
.build())
.setPatterns(Collections.singletonList(INDEX + "*")).get());
Template v2Settings = new Template(Settings.builder()
.put("index.priority", 23)
.build(), null, null);
IndexTemplateV2 v2template = new IndexTemplateV2(Collections.singletonList(INDEX + "*"), v2Settings, null, null, null, null);
PutIndexTemplateV2Action.Request request = new PutIndexTemplateV2Action.Request("v2");
request.indexTemplate(v2template);
assertAcked(client().execute(PutIndexTemplateV2Action.INSTANCE, request).get());
}
@After
public void cleanup() throws Exception {
assertAcked(client().admin().indices().prepareDeleteTemplate("v1").get());
assertAcked(client().execute(DeleteIndexTemplateV2Action.INSTANCE, new DeleteIndexTemplateV2Action.Request("v2")).get());
}
public void testCreateIndexPreference() throws Exception {
client().admin().indices().prepareCreate(INDEX).get();
assertUsedV1();
client().admin().indices().create(new CreateIndexRequest(INDEX).preferV2Templates(false)).get();
assertUsedV1();
client().admin().indices().create(new CreateIndexRequest(INDEX).preferV2Templates(true)).get();
assertUsedV2();
}
public void testIndexingRequestPreference() throws Exception {
client().index(new IndexRequest(INDEX).source("foo", "bar")).get();
assertUsedV1();
client().index(new IndexRequest(INDEX).source("foo", "bar").preferV2Templates(false)).get();
assertUsedV1();
client().index(new IndexRequest(INDEX).source("foo", "bar").preferV2Templates(true)).get();
assertUsedV2();
client().update(new UpdateRequest(INDEX, "1").doc("foo", "bar").docAsUpsert(true)).get();
assertUsedV1();
client().update(new UpdateRequest(INDEX, "1").doc("foo", "bar").docAsUpsert(true).preferV2Templates(false)).get();
assertUsedV1();
client().update(new UpdateRequest(INDEX, "1").doc("foo", "bar").docAsUpsert(true).preferV2Templates(true)).get();
assertUsedV2();
client().bulk(new BulkRequest(INDEX).add(new IndexRequest(INDEX).source("foo", "bar"))).get();
assertUsedV1();
client().bulk(new BulkRequest(INDEX).add(new IndexRequest(INDEX).source("foo", "bar")).preferV2Templates(false)).get();
assertUsedV1();
client().bulk(new BulkRequest(INDEX).add(new IndexRequest(INDEX).source("foo", "bar")).preferV2Templates(true)).get();
assertUsedV2();
}
public void testRolloverMaintainsSetting() throws Exception {
{
client().admin().indices().prepareCreate(INDEX + "-1")
.addAlias(new Alias("alias").writeIndex(true))
.get();
client().admin().indices().prepareRolloverIndex("alias").get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().prepareCreate(INDEX + "-1")
.addAlias(new Alias("alias").writeIndex(true))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(false);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().prepareCreate(INDEX + "-1")
.addAlias(new Alias("alias").writeIndex(true))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(true);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V2 template and have priority of 23",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("23"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(false))
.get();
client().admin().indices().prepareRolloverIndex("alias").get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(false))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(false);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(false))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(true);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V2 template and have priority of 23",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("23"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(true))
.get();
client().admin().indices().prepareRolloverIndex("alias").get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V2 template and have priority of 23",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("23"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(true))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(false);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
{
client().admin().indices().create(new CreateIndexRequest(INDEX + "-1")
.alias(new Alias("alias").writeIndex(true))
.preferV2Templates(true))
.get();
RolloverRequest request = new RolloverRequest("alias", INDEX + "-000002");
request.getCreateIndexRequest().preferV2Templates(true);
client().admin().indices().rolloverIndex(request).get();
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX + "-000002").get();
assertThat("expected index to use V2 template and have priority of 23",
resp.getSetting(INDEX + "-000002", "index.priority"), equalTo("23"));
client().admin().indices().prepareDelete(INDEX + "*").get();
}
}
private void assertUsedV1() {
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX).get();
assertThat("expected index to use V1 template and have priority of 15",
resp.getSetting(INDEX, "index.priority"), equalTo("15"));
client().admin().indices().prepareDelete(INDEX).get();
}
private void assertUsedV2() {
GetSettingsResponse resp = client().admin().indices().prepareGetSettings().setIndices(INDEX).get();
assertThat("expected index to use V2 template and have priority of 23",
resp.getSetting(INDEX, "index.priority"), equalTo("23"));
client().admin().indices().prepareDelete(INDEX).get();
}
}

View File

@ -369,6 +369,7 @@ public class TransportResumeFollowAction extends TransportMasterNodeAction<Resum
nonReplicatedSettings.add(IndexMetadata.INDEX_PRIORITY_SETTING);
nonReplicatedSettings.add(IndexMetadata.SETTING_WAIT_FOR_ACTIVE_SHARDS);
nonReplicatedSettings.add(IndexMetadata.INDEX_HIDDEN_SETTING);
nonReplicatedSettings.add(IndexMetadata.PREFER_V2_TEMPLATES_SETTING);
nonReplicatedSettings.add(EnableAllocationDecider.INDEX_ROUTING_REBALANCE_ENABLE_SETTING);
nonReplicatedSettings.add(EnableAllocationDecider.INDEX_ROUTING_ALLOCATION_ENABLE_SETTING);