|
@@ -24,6 +24,7 @@ import org.elasticsearch.cluster.node.DiscoveryNodeRole;
|
|
|
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
|
|
import org.elasticsearch.cluster.routing.RoutingTable;
|
|
|
import org.elasticsearch.cluster.routing.allocation.AllocationService;
|
|
|
+import org.elasticsearch.cluster.routing.allocation.DataTier;
|
|
|
import org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.AllocationDeciders;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.MaxRetryAllocationDecider;
|
|
@@ -34,10 +35,8 @@ import org.elasticsearch.common.compress.CompressedXContent;
|
|
|
import org.elasticsearch.common.settings.IndexScopedSettings;
|
|
|
import org.elasticsearch.common.settings.Setting;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
-import org.elasticsearch.core.TimeValue;
|
|
|
import org.elasticsearch.common.util.concurrent.ThreadContext;
|
|
|
-import org.elasticsearch.xcontent.NamedXContentRegistry;
|
|
|
-import org.elasticsearch.xcontent.XContentFactory;
|
|
|
+import org.elasticsearch.core.TimeValue;
|
|
|
import org.elasticsearch.index.Index;
|
|
|
import org.elasticsearch.index.IndexModule;
|
|
|
import org.elasticsearch.index.IndexNotFoundException;
|
|
@@ -57,6 +56,8 @@ import org.elasticsearch.test.VersionUtils;
|
|
|
import org.elasticsearch.test.gateway.TestGatewayAllocator;
|
|
|
import org.elasticsearch.threadpool.TestThreadPool;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
+import org.elasticsearch.xcontent.NamedXContentRegistry;
|
|
|
+import org.elasticsearch.xcontent.XContentFactory;
|
|
|
import org.hamcrest.Matchers;
|
|
|
import org.junit.Before;
|
|
|
|
|
@@ -68,6 +69,7 @@ import java.util.Collections;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Optional;
|
|
|
import java.util.Set;
|
|
|
import java.util.UUID;
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
@@ -91,7 +93,6 @@ import static org.elasticsearch.cluster.metadata.MetadataCreateIndexService.clus
|
|
|
import static org.elasticsearch.cluster.metadata.MetadataCreateIndexService.getIndexNumberOfRoutingShards;
|
|
|
import static org.elasticsearch.cluster.metadata.MetadataCreateIndexService.parseV1Mappings;
|
|
|
import static org.elasticsearch.cluster.metadata.MetadataCreateIndexService.resolveAndValidateAliases;
|
|
|
-
|
|
|
import static org.elasticsearch.index.IndexSettings.INDEX_SOFT_DELETES_SETTING;
|
|
|
import static org.elasticsearch.indices.ShardLimitValidatorTests.createTestShardLimitService;
|
|
|
import static org.hamcrest.Matchers.endsWith;
|
|
@@ -580,7 +581,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(clusterState, request, templateMetadata.settings(),
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
|
|
|
assertThat(aggregatedIndexSettings.get("template_setting"), equalTo("value1"));
|
|
|
assertThat(aggregatedIndexSettings.get("request_setting"), equalTo("value2"));
|
|
@@ -633,7 +634,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, templateMetadata.settings(),
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
|
|
|
assertThat(resolvedAliases.get(0).getSearchRouting(), equalTo("fromRequest"));
|
|
|
assertThat(aggregatedIndexSettings.get("key1"), equalTo("requestValue"));
|
|
@@ -648,7 +649,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
public void testDefaultSettings() {
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
|
|
|
assertThat(aggregatedIndexSettings.get(SETTING_NUMBER_OF_SHARDS), equalTo("1"));
|
|
|
}
|
|
@@ -656,7 +657,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
public void testSettingsFromClusterState() {
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.builder().put(SETTING_NUMBER_OF_SHARDS, 15).build(), IndexScopedSettings.DEFAULT_SCOPED_SETTINGS,
|
|
|
- randomShardLimitService(), Collections.emptySet());
|
|
|
+ randomShardLimitService(), Collections.emptySet(), randomBoolean());
|
|
|
|
|
|
assertThat(aggregatedIndexSettings.get(SETTING_NUMBER_OF_SHARDS), equalTo("15"));
|
|
|
}
|
|
@@ -681,7 +682,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request,
|
|
|
MetadataIndexTemplateService.resolveSettings(templates), null, Settings.EMPTY,
|
|
|
- IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(), Collections.emptySet());
|
|
|
+ IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(), Collections.emptySet(), randomBoolean());
|
|
|
List<AliasMetadata> resolvedAliases = resolveAndValidateAliases(request.index(), request.aliases(),
|
|
|
MetadataIndexTemplateService.resolveAliases(templates),
|
|
|
Metadata.builder().build(), aliasValidator, xContentRegistry(), searchExecutionContext,
|
|
@@ -739,7 +740,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
|
|
|
Settings aggregatedIndexSettings = aggregateIndexSettings(clusterState, request, templateMetadata.settings(),
|
|
|
clusterState.metadata().index("sourceIndex"), Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS,
|
|
|
- randomShardLimitService(), Collections.emptySet());
|
|
|
+ randomShardLimitService(), Collections.emptySet(), randomBoolean());
|
|
|
|
|
|
assertThat(aggregatedIndexSettings.get("templateSetting"), is(nullValue()));
|
|
|
assertThat(aggregatedIndexSettings.get("requestSetting"), is("requestValue"));
|
|
@@ -942,13 +943,88 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
assertThat(targetRoutingNumberOfShards, is(6));
|
|
|
}
|
|
|
|
|
|
+ private Optional<String> aggregatedTierPreference(Settings settings, boolean isDataStream,
|
|
|
+ boolean enforceDefaultTierPreference) {
|
|
|
+ Settings templateSettings = Settings.EMPTY;
|
|
|
+ request.settings(Settings.EMPTY);
|
|
|
+
|
|
|
+ if (randomBoolean()) {
|
|
|
+ templateSettings = settings;
|
|
|
+ } else {
|
|
|
+ request.settings(settings);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isDataStream) {
|
|
|
+ request.dataStreamName(randomAlphaOfLength(10));
|
|
|
+ } else {
|
|
|
+ request.dataStreamName(null);
|
|
|
+ }
|
|
|
+ Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, templateSettings,
|
|
|
+ null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
+ Set.of(new DataTier.DefaultHotAllocationSettingProvider()), enforceDefaultTierPreference);
|
|
|
+
|
|
|
+ if (aggregatedIndexSettings.keySet().contains(DataTier.TIER_PREFERENCE)) {
|
|
|
+ return Optional.of(aggregatedIndexSettings.get(DataTier.TIER_PREFERENCE));
|
|
|
+ } else {
|
|
|
+ return Optional.empty();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testEnforceDefaultTierPreference() {
|
|
|
+ Settings settings;
|
|
|
+ Optional<String> tier;
|
|
|
+
|
|
|
+ // empty settings gets the appropriate tier
|
|
|
+ settings = Settings.EMPTY;
|
|
|
+ tier = aggregatedTierPreference(settings, false, randomBoolean());
|
|
|
+ assertEquals(DataTier.DATA_CONTENT, tier.get());
|
|
|
+
|
|
|
+ settings = Settings.EMPTY;
|
|
|
+ tier = aggregatedTierPreference(settings, true, randomBoolean());
|
|
|
+ assertEquals(DataTier.DATA_HOT, tier.get());
|
|
|
+
|
|
|
+ // an explicit tier is respected
|
|
|
+ settings = Settings.builder().put(DataTier.TIER_PREFERENCE, DataTier.DATA_COLD).build();
|
|
|
+ tier = aggregatedTierPreference(settings, randomBoolean(), randomBoolean());
|
|
|
+ assertEquals(DataTier.DATA_COLD, tier.get());
|
|
|
+
|
|
|
+ // any of the INDEX_ROUTING_.*_GROUP_PREFIX settings still result in a default if
|
|
|
+ // we're enforcing
|
|
|
+ String includeRoutingSetting = randomFrom(
|
|
|
+ IndexMetadata.INDEX_ROUTING_REQUIRE_GROUP_PREFIX,
|
|
|
+ IndexMetadata.INDEX_ROUTING_EXCLUDE_GROUP_PREFIX,
|
|
|
+ IndexMetadata.INDEX_ROUTING_INCLUDE_GROUP_PREFIX) + "." + randomAlphaOfLength(10);
|
|
|
+ settings = Settings.builder()
|
|
|
+ .put(includeRoutingSetting, randomAlphaOfLength(10))
|
|
|
+ .build();
|
|
|
+ tier = aggregatedTierPreference(settings, false, true);
|
|
|
+ assertEquals(DataTier.DATA_CONTENT, tier.get());
|
|
|
+ // (continued from above) but not if we aren't
|
|
|
+ tier = aggregatedTierPreference(settings, false, false);
|
|
|
+ assertTrue(tier.isEmpty());
|
|
|
+
|
|
|
+ // an explicit null gets an empty tier if we're not enforcing
|
|
|
+ settings = Settings.builder().putNull(DataTier.TIER_PREFERENCE).build();
|
|
|
+ tier = aggregatedTierPreference(settings, randomBoolean(), false);
|
|
|
+ assertTrue(tier.isEmpty());
|
|
|
+
|
|
|
+ // an explicit null gets the appropriate tier if we are enforcing
|
|
|
+ settings = Settings.builder().putNull(DataTier.TIER_PREFERENCE).build();
|
|
|
+ tier = aggregatedTierPreference(settings, false, true);
|
|
|
+ assertEquals(DataTier.DATA_CONTENT, tier.get());
|
|
|
+
|
|
|
+ settings = Settings.builder().putNull(DataTier.TIER_PREFERENCE).build();
|
|
|
+ tier = aggregatedTierPreference(settings, true, true);
|
|
|
+ assertEquals(DataTier.DATA_HOT, tier.get());
|
|
|
+ }
|
|
|
+
|
|
|
public void testRejectWithSoftDeletesDisabled() {
|
|
|
final IllegalArgumentException error = expectThrows(IllegalArgumentException.class, () -> {
|
|
|
request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test");
|
|
|
request.settings(Settings.builder().put(INDEX_SOFT_DELETES_SETTING.getKey(), false).build());
|
|
|
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
});
|
|
|
assertThat(error.getMessage(), equalTo("Creating indices with soft-deletes disabled is no longer supported. "
|
|
|
+ "Please do not specify a value for setting [index.soft_deletes.enabled]."));
|
|
@@ -970,7 +1046,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
IllegalArgumentException error = expectThrows(IllegalArgumentException.class,
|
|
|
() -> aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet()));
|
|
|
+ Collections.emptySet(), randomBoolean()));
|
|
|
assertThat(error.getMessage(), equalTo("Translog retention settings [index.translog.retention.age] " +
|
|
|
"and [index.translog.retention.size] are no longer supported. Please do not specify values for these settings"));
|
|
|
}
|
|
@@ -987,7 +1063,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
request.settings(settings.build());
|
|
|
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
assertWarnings("Translog retention settings [index.translog.retention.age] "
|
|
|
+ "and [index.translog.retention.size] are deprecated and effectively ignored. They will be removed in a future version.");
|
|
|
}
|
|
@@ -1000,7 +1076,7 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
request.settings(settings.build());
|
|
|
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
|
|
|
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
|
|
|
- Collections.emptySet());
|
|
|
+ Collections.emptySet(), randomBoolean());
|
|
|
assertWarnings("[simplefs] is deprecated and will be removed in 8.0. Use [niofs] or other file systems instead. " +
|
|
|
"Elasticsearch 7.15 or later uses [niofs] for the [simplefs] store type " +
|
|
|
"as it offers superior or equivalent performance to [simplefs].");
|