1515import org .elasticsearch .cluster .ClusterState ;
1616import org .elasticsearch .cluster .metadata .IndexMetadata ;
1717import org .elasticsearch .cluster .metadata .Metadata ;
18+ import org .elasticsearch .cluster .routing .allocation .DataTier ;
1819import org .elasticsearch .common .Strings ;
1920import org .elasticsearch .common .settings .Settings ;
20- import org .elasticsearch .xcontent .NamedXContentRegistry ;
2121import org .elasticsearch .core .Nullable ;
2222import org .elasticsearch .core .Tuple ;
2323import org .elasticsearch .license .XPackLicenseState ;
24- import org .elasticsearch .cluster . routing . allocation . DataTier ;
24+ import org .elasticsearch .xcontent . NamedXContentRegistry ;
2525import org .elasticsearch .xpack .core .ilm .AllocateAction ;
2626import org .elasticsearch .xpack .core .ilm .IndexLifecycleMetadata ;
2727import org .elasticsearch .xpack .core .ilm .LifecycleAction ;
4848import static org .elasticsearch .cluster .metadata .IndexMetadata .INDEX_ROUTING_EXCLUDE_GROUP_SETTING ;
4949import static org .elasticsearch .cluster .metadata .IndexMetadata .INDEX_ROUTING_INCLUDE_GROUP_SETTING ;
5050import static org .elasticsearch .cluster .metadata .IndexMetadata .INDEX_ROUTING_REQUIRE_GROUP_SETTING ;
51+ import static org .elasticsearch .cluster .routing .allocation .DataTier .ENFORCE_DEFAULT_TIER_PREFERENCE ;
5152import static org .elasticsearch .cluster .routing .allocation .DataTier .TIER_PREFERENCE ;
5253import static org .elasticsearch .xpack .core .ilm .LifecycleExecutionState .ILM_CUSTOM_METADATA_KEY ;
5354import static org .elasticsearch .xpack .core .ilm .OperationMode .STOPPED ;
@@ -127,6 +128,18 @@ public static Tuple<ClusterState, MigratedEntities> migrateToDataTiersRouting(Cl
127128 }
128129
129130 Metadata .Builder mb = Metadata .builder (currentState .metadata ());
131+
132+ // set ENFORCE_DEFAULT_TIER_PREFERENCE to true (in the persistent settings)
133+ mb .persistentSettings (Settings .builder ()
134+ .put (mb .persistentSettings ())
135+ .put (ENFORCE_DEFAULT_TIER_PREFERENCE , true )
136+ .build ());
137+
138+ // and remove it from the transient settings, just in case it was there
139+ Settings .Builder transientSettingsBuilder = Settings .builder ().put (mb .transientSettings ());
140+ transientSettingsBuilder .remove (ENFORCE_DEFAULT_TIER_PREFERENCE );
141+ mb .transientSettings (transientSettingsBuilder .build ());
142+
130143 String removedIndexTemplateName = null ;
131144 if (Strings .hasText (indexTemplateToDelete )) {
132145 if (currentState .metadata ().getTemplates ().containsKey (indexTemplateToDelete )) {
@@ -376,20 +389,34 @@ static List<String> migrateIndices(Metadata.Builder mb, ClusterState currentStat
376389 for (ObjectObjectCursor <String , IndexMetadata > index : currentState .metadata ().indices ()) {
377390 IndexMetadata indexMetadata = index .value ;
378391 Settings currentSettings = indexMetadata .getSettings ();
392+
393+ boolean removeNodeAttrIndexRoutingSettings = true ;
394+
395+ // migrate using the `require` setting
379396 Settings newSettings = maybeMigrateRoutingSettingToTierPreference (nodeAttrIndexRequireRoutingSetting , indexMetadata );
397+
380398 if (newSettings .equals (currentSettings )) {
381- // migrating based on the `require` setting was not successful so let's check if the index used the `include` routing
399+ // migrating based on the `require` setting was not successful, so let's check if the index used the `include` routing
382400 // setting to configure the allocations and try to migrate it
383401 newSettings = maybeMigrateRoutingSettingToTierPreference (nodeAttrIndexIncludeRoutingSetting , indexMetadata );
384402 }
403+ if (newSettings .equals (currentSettings )) {
404+ removeNodeAttrIndexRoutingSettings = false ;
405+ // migrating based on the `include` setting was not successful,
406+ // so, last stop, we just inject a tier preference regardless of anything else
407+ newSettings = migrateToDefaultTierPreference (currentState , indexMetadata );
408+ }
385409
386410 if (newSettings .equals (currentSettings ) == false ) {
387- // we converted either the require or the include routing setting to tier preference
388- // so let's clear all the routing settings for the given attribute
389411 Settings .Builder finalSettings = Settings .builder ().put (newSettings );
390- finalSettings .remove (nodeAttrIndexExcludeRoutingSetting );
391- finalSettings .remove (nodeAttrIndexRequireRoutingSetting );
392- finalSettings .remove (nodeAttrIndexIncludeRoutingSetting );
412+
413+ if (removeNodeAttrIndexRoutingSettings ) {
414+ // we converted either the `require` or the `include` routing setting to tier preference
415+ // so let's clear all the routing settings for the given attribute
416+ finalSettings .remove (nodeAttrIndexExcludeRoutingSetting );
417+ finalSettings .remove (nodeAttrIndexRequireRoutingSetting );
418+ finalSettings .remove (nodeAttrIndexIncludeRoutingSetting );
419+ }
393420
394421 mb .put (IndexMetadata .builder (indexMetadata )
395422 .settings (finalSettings )
@@ -413,9 +440,11 @@ private static Settings maybeMigrateRoutingSettingToTierPreference(String attrib
413440 if (currentIndexSettings .keySet ().contains (attributeBasedRoutingSettingName ) == false ) {
414441 return currentIndexSettings ;
415442 }
416- // look at the value, get the correct tiers config and update the settings and index metadata
443+
417444 Settings .Builder newSettingsBuilder = Settings .builder ().put (currentIndexSettings );
418445 String indexName = indexMetadata .getIndex ().getName ();
446+
447+ // look at the value, get the correct tiers config and update the settings
419448 if (currentIndexSettings .keySet ().contains (TIER_PREFERENCE )) {
420449 newSettingsBuilder .remove (attributeBasedRoutingSettingName );
421450 logger .debug ("index [{}]: removed setting [{}]" , indexName , attributeBasedRoutingSettingName );
@@ -428,7 +457,7 @@ private static Settings maybeMigrateRoutingSettingToTierPreference(String attrib
428457 newSettingsBuilder .remove (attributeBasedRoutingSettingName );
429458 logger .debug ("index [{}]: removed setting [{}]" , indexName , attributeBasedRoutingSettingName );
430459 logger .debug ("index [{}]: configured setting [{}] to [{}]" , indexName ,
431- TIER_PREFERENCE , convertedTierPreference );
460+ TIER_PREFERENCE , convertedTierPreference );
432461 } else {
433462 // log warning and do *not* remove setting, return the settings unchanged
434463 logger .warn ("index [{}]: could not convert attribute based setting [{}] value of [{}] to a tier preference " +
@@ -440,6 +469,23 @@ private static Settings maybeMigrateRoutingSettingToTierPreference(String attrib
440469 return newSettingsBuilder .build ();
441470 }
442471
472+ private static Settings migrateToDefaultTierPreference (ClusterState currentState , IndexMetadata indexMetadata ) {
473+ Settings currentIndexSettings = indexMetadata .getSettings ();
474+ List <String > tierPreference = DataTier .parseTierList (currentIndexSettings .get (DataTier .TIER_PREFERENCE ));
475+ if (tierPreference .isEmpty () == false ) {
476+ return currentIndexSettings ;
477+ }
478+
479+ Settings .Builder newSettingsBuilder = Settings .builder ().put (currentIndexSettings );
480+ String indexName = indexMetadata .getIndex ().getName ();
481+
482+ boolean isDataStream = currentState .metadata ().findDataStreams (indexName ).isEmpty () == false ;
483+ String convertedTierPreference = isDataStream ? DataTier .DATA_HOT : DataTier .DATA_CONTENT ;
484+ newSettingsBuilder .put (TIER_PREFERENCE , convertedTierPreference );
485+ logger .debug ("index [{}]: configured setting [{}] to [{}]" , indexName , TIER_PREFERENCE , convertedTierPreference );
486+ return newSettingsBuilder .build ();
487+ }
488+
443489 /**
444490 * Converts the provided node attribute value to the corresponding `_tier_preference` configuration.
445491 * Known (and convertible) attribute values are:
0 commit comments