From c8d7dbb40d0d4e8e0c45a2f2ffe4fd526bf4896f Mon Sep 17 00:00:00 2001 From: Jordan Powers Date: Mon, 17 Nov 2025 13:17:04 -0800 Subject: [PATCH 1/2] Fix default value for some settings when filtered (#137652) Some settings (such as index.mapping.total_fields. ignore_dynamic_beyond_limit) rely on the value of other settings to determine their default value. When retrieving a setting value or default, the api allows the user to specify a filter, and the returned settings object will be filtered to only include the relevant setting. However, we are currently applying this filter to the settings object that we pass to the defaults providers. This means that the other setting(s) which determines the default value for the dependent setting might be hidden by the filter, and so an incorrect default will be returned. This PR fixes that logic so that the unfiltered set of all set settings is passed into the default values provider. --- docs/changelog/137652.yaml | 6 ++ .../indices/settings/get/GetSettingsIT.java | 56 +++++++++++++++++++ .../get/TransportGetSettingsAction.java | 2 +- .../rest-api-spec/test/10_setting.yml | 40 ++++++++++++- 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 docs/changelog/137652.yaml create mode 100644 server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java diff --git a/docs/changelog/137652.yaml b/docs/changelog/137652.yaml new file mode 100644 index 0000000000000..e683452163cac --- /dev/null +++ b/docs/changelog/137652.yaml @@ -0,0 +1,6 @@ +pr: 137652 +summary: Fix default value for some settings when filtered +area: Infra/Settings +type: bug +issues: + - 136333 diff --git a/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java new file mode 100644 index 0000000000000..faa82f08a2dde --- /dev/null +++ b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java @@ -0,0 +1,56 @@ +/* + * 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.action.admin.indices.settings.get; + +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.test.ESIntegTestCase; +import org.elasticsearch.test.LambdaMatchers; + +import java.util.Map; + +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; +import static org.hamcrest.Matchers.equalTo; + +@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.SUITE) +public class GetSettingsIT extends ESIntegTestCase { + public void testGetDefaultValueWhenDependentOnOtherSettings() { + final String indexName = "test-index-1"; + + Settings expectedSettings = Settings.builder() + .put("index.mapping.source.mode", "SYNTHETIC") + .put("index.mapping.total_fields.ignore_dynamic_beyond_limit", true) + .put("index.recovery.use_synthetic_source", true) + .put("index.use_time_series_doc_values_format", true) + .put("index.mapping.ignore_above", 8191) + .putList("index.sort.field", "@timestamp") + .putList("index.sort.order", "desc") + .putList("index.sort.mode", "max") + .putList("index.sort.missing", "_last") + .build(); + + assertAcked(prepareCreate(indexName).setSettings(Settings.builder().put("index.mode", "logsdb")).get()); + GetSettingsResponse unfilteredResponse = indicesAdmin().getSettings( + new GetSettingsRequest(TEST_REQUEST_TIMEOUT).indices(indexName).includeDefaults(true) + ).actionGet(); + for (String key : expectedSettings.keySet()) { + assertThat(unfilteredResponse.getSetting(indexName, key), equalTo(expectedSettings.get(key))); + GetSettingsResponse filteredResponse = indicesAdmin().getSettings( + new GetSettingsRequest(TEST_REQUEST_TIMEOUT).indices(indexName).includeDefaults(true).names(key) + ).actionGet(); + + var expectedFilteredSettingsMap = Map.of(indexName, expectedSettings.filter(key::equals)); + assertThat( + filteredResponse, + LambdaMatchers.transformedMatch(GetSettingsResponse::getIndexToDefaultSettings, equalTo(expectedFilteredSettingsMap)) + ); + } + + } +} diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/settings/get/TransportGetSettingsAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/settings/get/TransportGetSettingsAction.java index 47c6f9b4fa6fb..80683978ab037 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/settings/get/TransportGetSettingsAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/settings/get/TransportGetSettingsAction.java @@ -127,7 +127,7 @@ protected void localClusterStateOperation( indexToSettings.put(concreteIndex.getName(), indexSettings); if (indexToDefaultSettings != null) { - Settings defaultSettings = settingsFilter.filter(indexScopedSettings.diff(indexSettings, Settings.EMPTY)); + Settings defaultSettings = settingsFilter.filter(indexScopedSettings.diff(indexMetadata.getSettings(), Settings.EMPTY)); if (isFilteredRequest(request)) { defaultSettings = defaultSettings.filter(k -> Regex.simpleMatch(request.names(), k)); } diff --git a/x-pack/plugin/logsdb/src/yamlRestTest/resources/rest-api-spec/test/10_setting.yml b/x-pack/plugin/logsdb/src/yamlRestTest/resources/rest-api-spec/test/10_setting.yml index d597859c1e4d8..51db34ea27585 100644 --- a/x-pack/plugin/logsdb/src/yamlRestTest/resources/rest-api-spec/test/10_setting.yml +++ b/x-pack/plugin/logsdb/src/yamlRestTest/resources/rest-api-spec/test/10_setting.yml @@ -1,5 +1,4 @@ ---- -synthetic_source_keep defaults: +setup: - requires: test_runner_features: [ capabilities ] capabilities: @@ -8,6 +7,8 @@ synthetic_source_keep defaults: capabilities: [ logsdb_index_mode ] reason: "Support for 'logsdb' index mode capability required" +--- +synthetic_source_keep defaults: - do: indices.create: index: test1 @@ -37,3 +38,38 @@ synthetic_source_keep defaults: - is_true: test2 - is_false: test2.settings.index.mode - match: { test2.defaults.index.mapping.synthetic_source_keep: "none" } + +--- +total_fields.ignore_dynamic_beyond_limit defaults: + - do: + indices.put_index_template: + name: template-foo + body: + index_patterns: ["ds-foo*"] + data_stream: {} + priority: 700 + template: + settings: + index.mode: logsdb + + - do: + indices.create_data_stream: + name: ds-foo + + - do: + indices.get_data_stream: + name: ds-foo + - set: { data_streams.0.indices.0.index_name: backing_index } + + - do: + indices.get_settings: + index: ds-foo + include_defaults: true + - match: { .$backing_index.defaults.index.mapping.total_fields.ignore_dynamic_beyond_limit: "true" } + + - do: + indices.get_settings: + index: ds-foo + name: index.mapping.total_fields.ignore_dynamic_beyond_limit + include_defaults: true + - match: { .$backing_index.defaults.index.mapping.total_fields.ignore_dynamic_beyond_limit: "true" } From 4e0e3efd76d666463047c5bb282a1cd704cfa57c Mon Sep 17 00:00:00 2001 From: Jordan Powers Date: Mon, 17 Nov 2025 14:03:12 -0800 Subject: [PATCH 2/2] Remove settings that haven't been backported from test --- .../action/admin/indices/settings/get/GetSettingsIT.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java index faa82f08a2dde..91fd7a3ff5a67 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/action/admin/indices/settings/get/GetSettingsIT.java @@ -27,12 +27,7 @@ public void testGetDefaultValueWhenDependentOnOtherSettings() { .put("index.mapping.source.mode", "SYNTHETIC") .put("index.mapping.total_fields.ignore_dynamic_beyond_limit", true) .put("index.recovery.use_synthetic_source", true) - .put("index.use_time_series_doc_values_format", true) .put("index.mapping.ignore_above", 8191) - .putList("index.sort.field", "@timestamp") - .putList("index.sort.order", "desc") - .putList("index.sort.mode", "max") - .putList("index.sort.missing", "_last") .build(); assertAcked(prepareCreate(indexName).setSettings(Settings.builder().put("index.mode", "logsdb")).get());