Skip to content

Commit f505b37

Browse files
authored
[9.1] Correctly handling data stream settings when component templates are used (elastic#130394) (elastic#130406)
1 parent c772528 commit f505b37

File tree

2 files changed

+100
-14
lines changed

2 files changed

+100
-14
lines changed

modules/data-streams/src/yamlRestTest/resources/rest-api-spec/test/data_stream/240_data_stream_settings.yml

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,8 +327,6 @@ setup:
327327
index: "my-data-stream-1"
328328
wait_for_status: green
329329

330-
331-
332330
- do:
333331
indices.get_data_stream:
334332
name: my-data-stream-1
@@ -398,3 +396,96 @@ setup:
398396
- match: { .$idx0name.settings.index.number_of_shards: "1" }
399397
- match: { .$idx0name.settings.index.lifecycle.name: "my-policy" }
400398
- match: { .$idx0name.settings.index.lifecycle.prefer_ilm: "true" }
399+
400+
---
401+
"Test null out settings component templates only":
402+
- requires:
403+
cluster_features: [ "logs_stream" ]
404+
reason: requires setting 'logs_stream' to get or set data stream settings
405+
406+
- do:
407+
cluster.put_component_template:
408+
name: settings-template
409+
body:
410+
template:
411+
settings:
412+
lifecycle.name: my-policy
413+
414+
- do:
415+
allowed_warnings:
416+
- "index template [my-component-only-template] has index patterns [my-component-only-data-stream-*] matching patterns from existing older templates [global] with patterns (global => [*]); this template [my-component-only-template] will take precedence during new index creation"
417+
indices.put_index_template:
418+
name: my-component-only-template
419+
body:
420+
index_patterns: [ my-component-only-data-stream-* ]
421+
data_stream: { }
422+
composed_of:
423+
- settings-template
424+
425+
- do:
426+
indices.create_data_stream:
427+
name: my-component-only-data-stream-1
428+
429+
- do:
430+
cluster.health:
431+
index: "my-component-only-data-stream-1"
432+
wait_for_status: green
433+
434+
- do:
435+
indices.get_data_stream:
436+
name: my-component-only-data-stream-1
437+
- match: { data_streams.0.name: my-component-only-data-stream-1 }
438+
- match: { data_streams.0.settings: {} }
439+
- match: { data_streams.0.effective_settings: null }
440+
441+
- do:
442+
indices.put_data_stream_settings:
443+
name: my-component-only-data-stream-1
444+
body:
445+
index:
446+
lifecycle:
447+
name: my-new-policy
448+
prefer_ilm: true
449+
- match: { data_streams.0.name: my-component-only-data-stream-1 }
450+
- match: { data_streams.0.applied_to_data_stream: true }
451+
- length: { data_streams.0.index_settings_results.applied_to_data_stream_and_backing_indices: 2 }
452+
- match: { data_streams.0.settings.index.lifecycle.name: "my-new-policy" }
453+
- match: { data_streams.0.settings.index.lifecycle.prefer_ilm: "true" }
454+
- match: { data_streams.0.effective_settings.index.lifecycle.name: "my-new-policy" }
455+
- match: { data_streams.0.effective_settings.index.lifecycle.prefer_ilm: "true" }
456+
457+
- do:
458+
indices.put_data_stream_settings:
459+
name: my-component-only-data-stream-1
460+
body:
461+
index:
462+
lifecycle:
463+
name: null
464+
prefer_ilm: null
465+
- match: { data_streams.0.name: my-component-only-data-stream-1 }
466+
- match: { data_streams.0.applied_to_data_stream: true }
467+
- length: { data_streams.0.index_settings_results.applied_to_data_stream_and_backing_indices: 2 }
468+
- match: { data_streams.0.settings.index.lifecycle.name: null }
469+
- match: { data_streams.0.settings.index.lifecycle.prefer_ilm: null }
470+
- match: { data_streams.0.effective_settings.index.lifecycle.name: "my-policy" }
471+
- match: { data_streams.0.effective_settings.index.lifecycle.prefer_ilm: null }
472+
473+
- do:
474+
indices.get_data_stream_settings:
475+
name: my-component-only-data-stream-1
476+
- match: { data_streams.0.name: my-component-only-data-stream-1 }
477+
- match: { data_streams.0.settings.index.lifecycle.name: null }
478+
- match: { data_streams.0.settings.index.lifecycle.prefer_ilm: null }
479+
- match: { data_streams.0.effective_settings.index.lifecycle.name: "my-policy" }
480+
- match: { data_streams.0.effective_settings.index.lifecycle.prefer_ilm: null }
481+
482+
- do:
483+
indices.get_data_stream:
484+
name: my-component-only-data-stream-1
485+
- set: { data_streams.0.indices.0.index_name: idx0name }
486+
487+
- do:
488+
indices.get_settings:
489+
index: my-component-only-data-stream-1
490+
- match: { .$idx0name.settings.index.lifecycle.name: "my-policy" }
491+
- match: { .$idx0name.settings.index.lifecycle.prefer_ilm: null }

server/src/main/java/org/elasticsearch/cluster/metadata/MetadataDataStreamsService.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -452,10 +452,9 @@ private DataStream createDataStreamForUpdatedDataStreamSettings(
452452
ProjectMetadata projectMetadata = clusterState.metadata().getProject(projectId);
453453
Map<String, DataStream> dataStreamMap = projectMetadata.dataStreams();
454454
DataStream dataStream = dataStreamMap.get(dataStreamName);
455-
Settings existingSettings = dataStream.getSettings();
455+
Settings existingDataStreamSettings = dataStream.getSettings();
456456

457-
Template.Builder templateBuilder = Template.builder();
458-
Settings.Builder mergedSettingsBuilder = Settings.builder().put(existingSettings).put(settingsOverrides);
457+
Settings.Builder mergedSettingsBuilder = Settings.builder().put(existingDataStreamSettings).put(settingsOverrides);
459458
/*
460459
* A null value for a setting override means that we remove it from the data stream, and let the value from the template (if any)
461460
* be used.
@@ -465,18 +464,14 @@ private DataStream createDataStreamForUpdatedDataStreamSettings(
465464
mergedSettingsBuilder.remove(key);
466465
}
467466
});
468-
Settings mergedSettings = mergedSettingsBuilder.build();
467+
Settings mergedDataStreamSettings = mergedSettingsBuilder.build();
469468

470469
final ComposableIndexTemplate template = lookupTemplateForDataStream(dataStreamName, projectMetadata);
471-
ComposableIndexTemplate mergedTemplate = template.mergeSettings(mergedSettings);
472-
MetadataIndexTemplateService.validateTemplate(
473-
mergedTemplate.template().settings(),
474-
mergedTemplate.template().mappings(),
475-
indicesService
476-
);
470+
Settings templateSettings = MetadataIndexTemplateService.resolveSettings(template, projectMetadata.componentTemplates());
471+
Settings mergedEffectiveSettings = templateSettings.merge(mergedDataStreamSettings);
472+
MetadataIndexTemplateService.validateTemplate(mergedEffectiveSettings, ComposableIndexTemplate.EMPTY_MAPPINGS, indicesService);
477473

478-
templateBuilder.settings(mergedSettingsBuilder);
479-
return dataStream.copy().setSettings(mergedSettings).build();
474+
return dataStream.copy().setSettings(mergedDataStreamSettings).build();
480475
}
481476

482477
private static void addBackingIndex(

0 commit comments

Comments
 (0)