Skip to content

Commit

Permalink
Always enforce default tier preference (ENFORCE_DEFAULT_TIER_PREFEREN…
Browse files Browse the repository at this point in the history
…CE is ignored) (#79751)
  • Loading branch information
joegallo committed Oct 26, 2021
1 parent ad171b1 commit 9d27c74
Show file tree
Hide file tree
Showing 12 changed files with 112 additions and 196 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,6 @@ public class MetadataCreateIndexService {
private final boolean forbidPrivateIndexSettings;
private final Set<IndexSettingProvider> indexSettingProviders = new HashSet<>();

private volatile boolean enforceDefaultTierPreference;

public MetadataCreateIndexService(
final Settings settings,
final ClusterService clusterService,
Expand All @@ -156,14 +154,6 @@ public MetadataCreateIndexService(
this.systemIndices = systemIndices;
this.forbidPrivateIndexSettings = forbidPrivateIndexSettings;
this.shardLimitValidator = shardLimitValidator;

enforceDefaultTierPreference = DataTier.ENFORCE_DEFAULT_TIER_PREFERENCE_SETTING.get(settings);
clusterService.getClusterSettings().addSettingsUpdateConsumer(DataTier.ENFORCE_DEFAULT_TIER_PREFERENCE_SETTING,
this::setEnforceDefaultTierPreference);
}

public void setEnforceDefaultTierPreference(boolean enforceDefaultTierPreference) {
this.enforceDefaultTierPreference = enforceDefaultTierPreference;
}

/**
Expand Down Expand Up @@ -492,8 +482,7 @@ private ClusterState applyCreateIndexRequestWithV1Templates(final ClusterState c

final Settings aggregatedIndexSettings =
aggregateIndexSettings(currentState, request, resolveSettings(templates),
null, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders,
this.enforceDefaultTierPreference);
null, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders);
int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(aggregatedIndexSettings, request, routingNumShards);

Expand Down Expand Up @@ -528,8 +517,7 @@ private ClusterState applyCreateIndexRequestWithV2Template(final ClusterState cu
final Settings aggregatedIndexSettings =
aggregateIndexSettings(currentState, request,
resolveSettings(currentState.metadata(), templateName),
null, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders,
this.enforceDefaultTierPreference);
null, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders);
int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(aggregatedIndexSettings, request, routingNumShards);

Expand Down Expand Up @@ -583,8 +571,7 @@ private ClusterState applyCreateIndexRequestForSystemDataStream(final ClusterSta
settings,
indexScopedSettings,
shardLimitValidator,
indexSettingProviders,
this.enforceDefaultTierPreference
indexSettingProviders
);
final int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null);
final IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(aggregatedIndexSettings, request, routingNumShards);
Expand Down Expand Up @@ -648,7 +635,7 @@ private ClusterState applyCreateIndexRequestWithExistingMetadata(final ClusterSt
}

final Settings aggregatedIndexSettings = aggregateIndexSettings(currentState, request, Settings.EMPTY,
sourceMetadata, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders, this.enforceDefaultTierPreference);
sourceMetadata, settings, indexScopedSettings, shardLimitValidator, indexSettingProviders);
final int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, sourceMetadata);
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(aggregatedIndexSettings, request, routingNumShards);

Expand Down Expand Up @@ -710,7 +697,7 @@ static Map<String, Object> parseV1Mappings(String mappingsJson, List<CompressedX
static Settings aggregateIndexSettings(ClusterState currentState, CreateIndexClusterStateUpdateRequest request,
Settings combinedTemplateSettings, @Nullable IndexMetadata sourceMetadata, Settings settings,
IndexScopedSettings indexScopedSettings, ShardLimitValidator shardLimitValidator,
Set<IndexSettingProvider> indexSettingProviders, boolean enforceDefaultTierPreference) {
Set<IndexSettingProvider> indexSettingProviders) {
final boolean isDataStreamIndex = request.dataStreamName() != null;

// Create builders for the template and request settings. We transform these into builders
Expand Down Expand Up @@ -770,16 +757,14 @@ static Settings aggregateIndexSettings(ClusterState currentState, CreateIndexClu
indexSettingsBuilder.put(requestSettings.build());

if (sourceMetadata == null) { // not for shrink/split/clone
if (enforceDefaultTierPreference) {
// regardless of any previous logic, we're going to force there
// to be an appropriate non-empty value for the tier preference
String currentTierPreference = indexSettingsBuilder.get(DataTier.TIER_PREFERENCE);
if (DataTier.parseTierList(currentTierPreference).isEmpty()) {
String newTierPreference = isDataStreamIndex ? DataTier.DATA_HOT : DataTier.DATA_CONTENT;
logger.debug("enforcing default [{}] setting for [{}] creation, replacing [{}] with [{}]",
DataTier.TIER_PREFERENCE, request.index(), currentTierPreference, newTierPreference);
indexSettingsBuilder.put(DataTier.TIER_PREFERENCE, newTierPreference);
}
// regardless of any previous logic, we're going to force there
// to be an appropriate non-empty value for the tier preference
String currentTierPreference = indexSettingsBuilder.get(DataTier.TIER_PREFERENCE);
if (DataTier.parseTierList(currentTierPreference).isEmpty()) {
String newTierPreference = isDataStreamIndex ? DataTier.DATA_HOT : DataTier.DATA_CONTENT;
logger.debug("enforcing default [{}] setting for [{}] creation, replacing [{}] with [{}]",
DataTier.TIER_PREFERENCE, request.index(), currentTierPreference, newTierPreference);
indexSettingsBuilder.put(DataTier.TIER_PREFERENCE, newTierPreference);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,13 @@ public class DataTier {

public static final Set<String> ALL_DATA_TIERS = Set.of(DATA_CONTENT, DATA_HOT, DATA_WARM, DATA_COLD, DATA_FROZEN);

// this setting is for migrating from 7.x (where a tier preference was not required, and did not necessarily
// deprecated setting for migrating from 7.x (where a tier preference was not required, and did not necessarily
// have a default value), to 8.x (where a tier preference will be required, and a default value will be injected).
// it will be removed as a breaking change in some future version, likely 9.0.
// in version 8.0 and onward, this setting doesn't control any logic anymore, and it will be removed as a breaking change in
// some future version, likely 9.0.
public static final String ENFORCE_DEFAULT_TIER_PREFERENCE = "cluster.routing.allocation.enforce_default_tier_preference";
public static final Setting<Boolean> ENFORCE_DEFAULT_TIER_PREFERENCE_SETTING =
Setting.boolSetting(ENFORCE_DEFAULT_TIER_PREFERENCE, true, Property.Dynamic, Property.NodeScope);
Setting.boolSetting(ENFORCE_DEFAULT_TIER_PREFERENCE, true, Property.Dynamic, Property.NodeScope, Property.Deprecated);

public static final String TIER_PREFERENCE = "index.routing.allocation.include._tier_preference";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import org.elasticsearch.cluster.routing.allocation.RoutingAllocation;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.settings.ClusterSettings;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings;
Expand Down Expand Up @@ -66,7 +65,6 @@
public class DiskThresholdDecider extends AllocationDecider {

private static final Logger logger = LogManager.getLogger(DiskThresholdDecider.class);
private static final DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(DiskThresholdDecider.class);

public static final String NAME = "disk_threshold";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@ public void testAggregateSettingsAppliesSettingsFromTemplatesAndRequest() {

Settings aggregatedIndexSettings = aggregateIndexSettings(clusterState, request, templateMetadata.settings(),
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean());
Collections.emptySet());

assertThat(aggregatedIndexSettings.get("template_setting"), equalTo("value1"));
assertThat(aggregatedIndexSettings.get("request_setting"), equalTo("value2"));
Expand Down Expand Up @@ -634,7 +634,7 @@ public void testRequestDataHavePriorityOverTemplateData() throws Exception {

Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, templateMetadata.settings(),
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean());
Collections.emptySet());

assertThat(resolvedAliases.get(0).getSearchRouting(), equalTo("fromRequest"));
assertThat(aggregatedIndexSettings.get("key1"), equalTo("requestValue"));
Expand All @@ -649,15 +649,15 @@ null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLi
public void testDefaultSettings() {
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean());
Collections.emptySet());

assertThat(aggregatedIndexSettings.get(SETTING_NUMBER_OF_SHARDS), equalTo("1"));
}

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(), randomBoolean());
randomShardLimitService(), Collections.emptySet());

assertThat(aggregatedIndexSettings.get(SETTING_NUMBER_OF_SHARDS), equalTo("15"));
}
Expand All @@ -682,7 +682,7 @@ public void testTemplateOrder() throws Exception {

Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request,
MetadataIndexTemplateService.resolveSettings(templates), null, Settings.EMPTY,
IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(), Collections.emptySet(), randomBoolean());
IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(), Collections.emptySet());
List<AliasMetadata> resolvedAliases = resolveAndValidateAliases(request.index(), request.aliases(),
MetadataIndexTemplateService.resolveAliases(templates),
Metadata.builder().build(), aliasValidator, xContentRegistry(), searchExecutionContext,
Expand Down Expand Up @@ -740,7 +740,7 @@ public void testAggregateIndexSettingsIgnoresTemplatesOnCreateFromSourceIndex()

Settings aggregatedIndexSettings = aggregateIndexSettings(clusterState, request, templateMetadata.settings(),
clusterState.metadata().index("sourceIndex"), Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS,
randomShardLimitService(), Collections.emptySet(), randomBoolean());
randomShardLimitService(), Collections.emptySet());

assertThat(aggregatedIndexSettings.get("templateSetting"), is(nullValue()));
assertThat(aggregatedIndexSettings.get("requestSetting"), is("requestValue"));
Expand Down Expand Up @@ -943,8 +943,7 @@ public void testGetIndexNumberOfRoutingShardsYieldsSourceNumberOfShards() {
assertThat(targetRoutingNumberOfShards, is(6));
}

private Optional<String> aggregatedTierPreference(Settings settings, boolean isDataStream,
boolean enforceDefaultTierPreference) {
private Optional<String> aggregatedTierPreference(Settings settings, boolean isDataStream) {
Settings templateSettings = Settings.EMPTY;
request.settings(Settings.EMPTY);

Expand All @@ -961,7 +960,7 @@ private Optional<String> aggregatedTierPreference(Settings settings, boolean isD
}
Settings aggregatedIndexSettings = aggregateIndexSettings(ClusterState.EMPTY_STATE, request, templateSettings,
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Set.of(new DataTier.DefaultHotAllocationSettingProvider()), enforceDefaultTierPreference);
Set.of(new DataTier.DefaultHotAllocationSettingProvider()));

if (aggregatedIndexSettings.keySet().contains(DataTier.TIER_PREFERENCE)) {
return Optional.of(aggregatedIndexSettings.get(DataTier.TIER_PREFERENCE));
Expand All @@ -976,45 +975,36 @@ public void testEnforceDefaultTierPreference() {

// empty settings gets the appropriate tier
settings = Settings.EMPTY;
tier = aggregatedTierPreference(settings, false, randomBoolean());
tier = aggregatedTierPreference(settings, false);
assertEquals(DataTier.DATA_CONTENT, tier.get());

settings = Settings.EMPTY;
tier = aggregatedTierPreference(settings, true, randomBoolean());
tier = aggregatedTierPreference(settings, true);
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());
tier = aggregatedTierPreference(settings, randomBoolean());
assertEquals(DataTier.DATA_COLD, tier.get());

// any of the INDEX_ROUTING_.*_GROUP_PREFIX settings still result in a default if
// we're enforcing
// any of the INDEX_ROUTING_.*_GROUP_PREFIX settings still result in a default
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);
tier = aggregatedTierPreference(settings, false);
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
// an explicit null gets the appropriate tier
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);
tier = aggregatedTierPreference(settings, false);
assertEquals(DataTier.DATA_CONTENT, tier.get());

settings = Settings.builder().putNull(DataTier.TIER_PREFERENCE).build();
tier = aggregatedTierPreference(settings, true, true);
tier = aggregatedTierPreference(settings, true);
assertEquals(DataTier.DATA_HOT, tier.get());
}

Expand All @@ -1024,7 +1014,7 @@ public void testRejectWithSoftDeletesDisabled() {
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(), randomBoolean());
Collections.emptySet());
});
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]."));
Expand All @@ -1046,7 +1036,7 @@ public void testRejectTranslogRetentionSettings() {
IllegalArgumentException error = expectThrows(IllegalArgumentException.class,
() -> aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean()));
Collections.emptySet()));
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"));
}
Expand All @@ -1063,7 +1053,7 @@ public void testDeprecateTranslogRetentionSettings() {
request.settings(settings.build());
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean());
Collections.emptySet());
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.");
}
Expand All @@ -1076,7 +1066,7 @@ public void testDeprecateSimpleFS() {
request.settings(settings.build());
aggregateIndexSettings(ClusterState.EMPTY_STATE, request, Settings.EMPTY,
null, Settings.EMPTY, IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, randomShardLimitService(),
Collections.emptySet(), randomBoolean());
Collections.emptySet());
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].");
Expand Down

0 comments on commit 9d27c74

Please sign in to comment.