Skip to content

[8.19] Backport data stream settings #129213

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 22 commits into from
Jun 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a3fe59f
Adding settings to data streams (#126947)
masseyke Apr 23, 2025
ad77f8b
Using DataStream::getEffectiveSettings (#127282)
masseyke Apr 25, 2025
8bc8337
Adding transport actions for getting and updating data stream setting…
masseyke Apr 28, 2025
daa75f5
Fixing DataStream::getEffectiveSettings for component templates (#127…
masseyke Apr 29, 2025
521dce6
Adding rest actions to get and set data stream settings (#127858)
masseyke May 21, 2025
a92a55d
Adding dry_run mode for setting data stream settings (#128269)
masseyke May 23, 2025
5d8c61e
Adding prefer_ilm as a whitelisted data stream setting (#128375)
masseyke May 27, 2025
a0dae8e
Making the data stream settngs rest-api-spec consistent with the elas…
masseyke May 28, 2025
229b943
Removing the data stream settings feature flag (#128594)
masseyke May 29, 2025
8708721
Collapse the transport versions (and rename)
joegallo Jun 11, 2025
b3c559e
Promote this snippet into being a proper TEARDOWN
joegallo Jun 11, 2025
2199d54
Merge branch '8.19' into datastreams-settings-and-mappings-overrides-…
joegallo Jun 11, 2025
9872b79
Add "settings": {} where needed to the docs
joegallo Jun 11, 2025
3e1948f
Remove this line of slashes
joegallo Jun 11, 2025
2a788ea
Merge branch '8.19' into datastreams-settings-and-mappings-overrides-…
joegallo Jun 11, 2025
213e26e
merging 8.19
masseyke Jun 16, 2025
eaa0160
making TransportGetDataStreamSettingsAction a TransportLocalClusterSt…
masseyke Jun 17, 2025
06aa0e2
removing transport version comment due to #129560
masseyke Jun 17, 2025
a15da87
applying DataStreamSettingsIT fix from #129564
masseyke Jun 17, 2025
b847cc8
removing unneccessary use of MasterNodeReadRequest
masseyke Jun 17, 2025
d7b0216
Merge branch '8.19' into datastreams-settings-and-mappings-overrides-…
masseyke Jun 17, 2025
8af5789
Merge branch 'datastreams-settings-and-mappings-overrides-8.19' of gi…
masseyke Jun 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -596,7 +596,8 @@ stream's oldest backing index.
"allow_custom_routing": false,
"replicated": false,
"index_mode": "standard",
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand Down
3 changes: 2 additions & 1 deletion docs/reference/data-streams/downsampling-manual.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,8 @@ This returns:
"end": "2023-07-26T13:26:42.000Z"
}
]
}
},
"settings": {}
}
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,14 @@ being managed by data stream lifecycle. As we'll see, {ilm-init} and data stream
can co-manage a data stream; however, an index can only be managed by one system at
a time.

[source,console]
--------------------------------------------------
DELETE _data_stream/dsl-data-stream
DELETE _index_template/dsl-data-stream-template
DELETE _ilm/policy/pre-dsl-ilm-policy
--------------------------------------------------
// TEARDOWN

[discrete]
[[migrate-dsl-ilm-tldr]]
==== TL;DR
Expand Down Expand Up @@ -141,7 +149,8 @@ and that the next generation index will also be managed by {ilm-init}:
"allow_custom_routing": false,
"replicated": false,
"index_mode": "standard",
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand Down Expand Up @@ -283,7 +292,8 @@ GET _data_stream/dsl-data-stream
"allow_custom_routing": false,
"replicated": false,
"index_mode": "standard",
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand Down Expand Up @@ -367,7 +377,8 @@ GET _data_stream/dsl-data-stream
"allow_custom_routing": false,
"replicated": false,
"index_mode": "standard",
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand Down Expand Up @@ -469,7 +480,8 @@ GET _data_stream/dsl-data-stream
"allow_custom_routing": false,
"replicated": false,
"index_mode": "standard",
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand All @@ -488,15 +500,3 @@ GET _data_stream/dsl-data-stream
Had we removed the {ilm-init} policy from the index template when we <<update-index-template-for-dsl, updated>>
it, the write index of the data stream will now be `Unmanaged` because the index
wouldn't have the {ilm-init} policy configured to fallback onto.

//////////////////////////
[source,console]
--------------------------------------------------
DELETE _data_stream/dsl-data-stream
DELETE _index_template/dsl-data-stream-template
DELETE _ilm/policy/pre-dsl-ilm-policy
--------------------------------------------------
// TEST[continued]

//////////////////////////

6 changes: 4 additions & 2 deletions docs/reference/indices/get-data-stream.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,8 @@ The API returns the following response:
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
},
{
"name": "my-data-stream-two",
Expand Down Expand Up @@ -361,7 +362,8 @@ The API returns the following response:
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
"rollover_on_write": false,
"settings": {}
}
]
}
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ public class DataStreamFeatures implements FeatureSpecification {
"data_stream.downsample.default_aggregate_metric_fix"
);

public static final NodeFeature LOGS_STREAM_FEATURE = new NodeFeature("logs_stream");

@Override
public Map<NodeFeature, Version> getHistoricalFeatures() {
return Map.of(DATA_STREAM_LIFECYCLE, Version.V_8_11_0);
Expand All @@ -51,6 +53,6 @@ public Set<NodeFeature> getFeatures() {

@Override
public Set<NodeFeature> getTestFeatures() {
return Set.of(DATA_STREAM_FAILURE_STORE_TSDB_FIX, DOWNSAMPLE_AGGREGATE_DEFAULT_METRIC_FIX);
return Set.of(DATA_STREAM_FAILURE_STORE_TSDB_FIX, DOWNSAMPLE_AGGREGATE_DEFAULT_METRIC_FIX, LOGS_STREAM_FEATURE);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
import org.elasticsearch.action.datastreams.DataStreamsStatsAction;
import org.elasticsearch.action.datastreams.DeleteDataStreamAction;
import org.elasticsearch.action.datastreams.GetDataStreamAction;
import org.elasticsearch.action.datastreams.GetDataStreamSettingsAction;
import org.elasticsearch.action.datastreams.MigrateToDataStreamAction;
import org.elasticsearch.action.datastreams.ModifyDataStreamsAction;
import org.elasticsearch.action.datastreams.PromoteDataStreamAction;
import org.elasticsearch.action.datastreams.PutDataStreamOptionsAction;
import org.elasticsearch.action.datastreams.UpdateDataStreamSettingsAction;
import org.elasticsearch.action.datastreams.lifecycle.ExplainDataStreamLifecycleAction;
import org.elasticsearch.action.datastreams.lifecycle.GetDataStreamLifecycleAction;
import org.elasticsearch.action.datastreams.lifecycle.PutDataStreamLifecycleAction;
Expand All @@ -37,10 +39,12 @@
import org.elasticsearch.datastreams.action.TransportCreateDataStreamAction;
import org.elasticsearch.datastreams.action.TransportDataStreamsStatsAction;
import org.elasticsearch.datastreams.action.TransportDeleteDataStreamAction;
import org.elasticsearch.datastreams.action.TransportGetDataStreamSettingsAction;
import org.elasticsearch.datastreams.action.TransportGetDataStreamsAction;
import org.elasticsearch.datastreams.action.TransportMigrateToDataStreamAction;
import org.elasticsearch.datastreams.action.TransportModifyDataStreamsAction;
import org.elasticsearch.datastreams.action.TransportPromoteDataStreamAction;
import org.elasticsearch.datastreams.action.TransportUpdateDataStreamSettingsAction;
import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleErrorStore;
import org.elasticsearch.datastreams.lifecycle.DataStreamLifecycleService;
import org.elasticsearch.datastreams.lifecycle.action.DeleteDataStreamLifecycleAction;
Expand Down Expand Up @@ -68,10 +72,12 @@
import org.elasticsearch.datastreams.rest.RestCreateDataStreamAction;
import org.elasticsearch.datastreams.rest.RestDataStreamsStatsAction;
import org.elasticsearch.datastreams.rest.RestDeleteDataStreamAction;
import org.elasticsearch.datastreams.rest.RestGetDataStreamSettingsAction;
import org.elasticsearch.datastreams.rest.RestGetDataStreamsAction;
import org.elasticsearch.datastreams.rest.RestMigrateToDataStreamAction;
import org.elasticsearch.datastreams.rest.RestModifyDataStreamsAction;
import org.elasticsearch.datastreams.rest.RestPromoteDataStreamAction;
import org.elasticsearch.datastreams.rest.RestUpdateDataStreamSettingsAction;
import org.elasticsearch.features.NodeFeature;
import org.elasticsearch.health.HealthIndicatorService;
import org.elasticsearch.index.IndexSettingProvider;
Expand Down Expand Up @@ -241,6 +247,8 @@ public Collection<?> createComponents(PluginServices services) {
actions.add(new ActionHandler<>(GetDataStreamOptionsAction.INSTANCE, TransportGetDataStreamOptionsAction.class));
actions.add(new ActionHandler<>(PutDataStreamOptionsAction.INSTANCE, TransportPutDataStreamOptionsAction.class));
actions.add(new ActionHandler<>(DeleteDataStreamOptionsAction.INSTANCE, TransportDeleteDataStreamOptionsAction.class));
actions.add(new ActionHandler<>(GetDataStreamSettingsAction.INSTANCE, TransportGetDataStreamSettingsAction.class));
actions.add(new ActionHandler<>(UpdateDataStreamSettingsAction.INSTANCE, TransportUpdateDataStreamSettingsAction.class));
return actions;
}

Expand Down Expand Up @@ -276,6 +284,8 @@ public List<RestHandler> getRestHandlers(
handlers.add(new RestGetDataStreamOptionsAction());
handlers.add(new RestPutDataStreamOptionsAction());
handlers.add(new RestDeleteDataStreamOptionsAction());
handlers.add(new RestGetDataStreamSettingsAction());
handlers.add(new RestUpdateDataStreamSettingsAction());
return handlers;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

package org.elasticsearch.datastreams.action;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.datastreams.GetDataStreamSettingsAction;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.IndicesOptions;
import org.elasticsearch.action.support.TransportLocalClusterStateAction;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.block.ClusterBlockException;
import org.elasticsearch.cluster.block.ClusterBlockLevel;
import org.elasticsearch.cluster.metadata.DataStream;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.settings.SettingsFilter;
import org.elasticsearch.injection.guice.Inject;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class TransportGetDataStreamSettingsAction extends TransportLocalClusterStateAction<
GetDataStreamSettingsAction.Request,
GetDataStreamSettingsAction.Response> {
private final IndexNameExpressionResolver indexNameExpressionResolver;
private final SettingsFilter settingsFilter;

@Inject
public TransportGetDataStreamSettingsAction(
TransportService transportService,
ClusterService clusterService,
ThreadPool threadPool,
SettingsFilter settingsFilter,
ActionFilters actionFilters,
IndexNameExpressionResolver indexNameExpressionResolver
) {
super(
GetDataStreamSettingsAction.NAME,
clusterService,
transportService,
actionFilters,
GetDataStreamSettingsAction.Request::localOnly,
threadPool.executor(ThreadPool.Names.MANAGEMENT)
);
this.indexNameExpressionResolver = indexNameExpressionResolver;
this.settingsFilter = settingsFilter;
}

@Override
protected ClusterBlockException checkBlock(GetDataStreamSettingsAction.Request request, ClusterState state) {
return state.blocks().globalBlockedException(ClusterBlockLevel.METADATA_WRITE);
}

@Override
protected void localClusterStateOperation(
Task task,
GetDataStreamSettingsAction.Request request,
ClusterState state,
ActionListener<GetDataStreamSettingsAction.Response> listener
) throws Exception {
List<String> dataStreamNames = indexNameExpressionResolver.dataStreamNames(
clusterService.state(),
IndicesOptions.DEFAULT,
request.indices()
);
Map<String, DataStream> dataStreamMap = state.metadata().dataStreams();
List<GetDataStreamSettingsAction.DataStreamSettingsResponse> responseList = new ArrayList<>(dataStreamNames.size());
for (String dataStreamName : dataStreamNames) {
DataStream dataStream = dataStreamMap.get(dataStreamName);
Settings settings = settingsFilter.filter(dataStream.getSettings());
Settings effectiveSettings = settingsFilter.filter(dataStream.getEffectiveSettings(state.metadata()));
responseList.add(new GetDataStreamSettingsAction.DataStreamSettingsResponse(dataStreamName, settings, effectiveSettings));
}
listener.onResponse(new GetDataStreamSettingsAction.Response(responseList));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -238,15 +238,15 @@ static GetDataStreamAction.Response innerOperation(
} else {
indexTemplate = MetadataIndexTemplateService.findV2Template(state.metadata(), dataStream.getName(), false);
if (indexTemplate != null) {
Settings settings = MetadataIndexTemplateService.resolveSettings(state.metadata(), indexTemplate);
Settings settings = dataStream.getEffectiveSettings(state.metadata());
ilmPolicyName = settings.get(IndexMetadata.LIFECYCLE_NAME);
if (indexMode == null && state.metadata().templatesV2().get(indexTemplate) != null) {
indexMode = resolveMode(
state,
indexSettingProviders,
dataStream,
settings,
state.metadata().templatesV2().get(indexTemplate)
dataStream.getEffectiveIndexTemplate(state.metadata())
);
}
indexTemplatePreferIlmValue = PREFER_ILM_SETTING.get(settings);
Expand Down
Loading