|
@@ -35,6 +35,7 @@ import org.elasticsearch.cluster.routing.GlobalRoutingTableTestHelper;
|
|
|
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.ExistingShardsAllocator;
|
|
|
import org.elasticsearch.cluster.routing.allocation.allocator.BalancedShardsAllocator;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.AllocationDeciders;
|
|
|
import org.elasticsearch.cluster.routing.allocation.decider.MaxRetryAllocationDecider;
|
|
@@ -791,6 +792,55 @@ public class MetadataCreateIndexServiceTests extends ESTestCase {
|
|
|
assertThat(aggregatedIndexSettings.get("other_setting"), equalTo("other_value"));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * When a failure store index is created, we must filter out any unsupported settings from the create request or from the template that
|
|
|
+ * may have been provided by users in the create request or from the original data stream template. An exception to this is any settings
|
|
|
+ * that have been provided by index setting providers which should be considered default values on indices.
|
|
|
+ */
|
|
|
+ public void testAggregateSettingsProviderIsNotFilteredOnFailureStore() {
|
|
|
+ IndexTemplateMetadata templateMetadata = addMatchingTemplate(builder -> {
|
|
|
+ builder.settings(Settings.builder().put("template_setting", "value1"));
|
|
|
+ });
|
|
|
+ ProjectMetadata projectMetadata = ProjectMetadata.builder(projectId).templates(Map.of("template_1", templateMetadata)).build();
|
|
|
+ ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT).putProjectMetadata(projectMetadata).build();
|
|
|
+ var request = new CreateIndexClusterStateUpdateRequest("create index", projectId, "test", "test").settings(
|
|
|
+ Settings.builder().put("request_setting", "value2").build()
|
|
|
+ ).isFailureIndex(true);
|
|
|
+
|
|
|
+ Settings aggregatedIndexSettings = aggregateIndexSettings(
|
|
|
+ clusterState,
|
|
|
+ request,
|
|
|
+ templateMetadata.settings(),
|
|
|
+ null,
|
|
|
+ null,
|
|
|
+ Settings.EMPTY,
|
|
|
+ IndexScopedSettings.DEFAULT_SCOPED_SETTINGS,
|
|
|
+ randomShardLimitService(),
|
|
|
+ Set.of(new IndexSettingProvider() {
|
|
|
+ @Override
|
|
|
+ public Settings getAdditionalIndexSettings(
|
|
|
+ String indexName,
|
|
|
+ String dataStreamName,
|
|
|
+ IndexMode templateIndexMode,
|
|
|
+ ProjectMetadata projectMetadata,
|
|
|
+ Instant resolvedAt,
|
|
|
+ Settings indexTemplateAndCreateRequestSettings,
|
|
|
+ List<CompressedXContent> combinedTemplateMappings
|
|
|
+ ) {
|
|
|
+ return Settings.builder().put(ExistingShardsAllocator.EXISTING_SHARDS_ALLOCATOR_SETTING.getKey(), "override").build();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean overrulesTemplateAndRequestSettings() {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ })
|
|
|
+ );
|
|
|
+
|
|
|
+ assertThat(aggregatedIndexSettings.get("template_setting"), nullValue());
|
|
|
+ assertThat(aggregatedIndexSettings.get(ExistingShardsAllocator.EXISTING_SHARDS_ALLOCATOR_SETTING.getKey()), equalTo("override"));
|
|
|
+ }
|
|
|
+
|
|
|
public void testAggregateSettingsProviderOverrulesNullFromRequest() {
|
|
|
IndexTemplateMetadata templateMetadata = addMatchingTemplate(builder -> {
|
|
|
builder.settings(Settings.builder().put("template_setting", "value1"));
|