diff --git a/core/src/main/java/org/elasticsearch/common/settings/Setting.java b/core/src/main/java/org/elasticsearch/common/settings/Setting.java index 09cb8d171bd8f..bac00da68ccff 100644 --- a/core/src/main/java/org/elasticsearch/common/settings/Setting.java +++ b/core/src/main/java/org/elasticsearch/common/settings/Setting.java @@ -308,6 +308,13 @@ boolean hasComplexMatcher() { return isGroupSetting(); } + /** + * Returns true iff this setting is a list setting. + */ + boolean isListSetting() { + return false; + } + /** * Returns the default value string representation for this setting. * @param settings a settings object for settings that has a default value depending on another setting if available @@ -763,6 +770,11 @@ boolean hasComplexMatcher() { return true; } + @Override + boolean isListSetting() { + return true; + } + @Override public boolean exists(Settings settings) { boolean exists = super.exists(settings); diff --git a/core/src/main/java/org/elasticsearch/common/settings/SettingsModule.java b/core/src/main/java/org/elasticsearch/common/settings/SettingsModule.java index 45b511e1cc168..4100bbc77602e 100644 --- a/core/src/main/java/org/elasticsearch/common/settings/SettingsModule.java +++ b/core/src/main/java/org/elasticsearch/common/settings/SettingsModule.java @@ -152,8 +152,12 @@ public void configure(Binder binder) { */ private void registerSetting(Setting setting) { if (setting.isFiltered()) { - if (settingsFilterPattern.contains(setting.getKey()) == false) { - registerSettingsFilter(setting.getKey()); + final String key = setting.getKey(); + if (settingsFilterPattern.contains(key) == false) { + registerSettingsFilter(key); + if (setting.isListSetting()) { + registerSettingsFilter(key + ".*"); + } } } if (setting.hasNodeScope() || setting.hasIndexScope()) { diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java index a1c2711e5acc2..80717f958a7aa 100644 --- a/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java +++ b/core/src/test/java/org/elasticsearch/common/settings/SettingsModuleTests.java @@ -23,7 +23,11 @@ import org.elasticsearch.common.settings.Setting.Property; import java.util.Arrays; +import java.util.List; +import java.util.Set; +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.hamcrest.Matchers.containsString; public class SettingsModuleTests extends ModuleTestCase { @@ -118,6 +122,31 @@ public void testRegisterSettingsFilter() { } + public void testRegisterListSettingsFilter() { + final Settings settings = Settings.builder() + .put("foo.bar", true) + .put("foo.baz", "one") + .putArray("foo.qux", Arrays.asList("two", "three", "four")) + .build(); + + final List> additionalSettings = Arrays.asList( + Setting.simpleString("foo.bar", Property.NodeScope), + Setting.simpleString("foo.baz", Property.NodeScope, Property.Filtered), + Setting.listSetting("foo.qux", singletonList("default"), String::toString, Property.NodeScope, Property.Filtered) + ); + + final SettingsModule module = new SettingsModule(settings, additionalSettings, emptyList()); + + final Set filters = module.getSettingsFilter().getPatterns(); + assertEquals(3, filters.size()); + assertTrue(filters.contains("foo.baz")); + assertTrue(filters.contains("foo.qux")); + assertTrue(filters.contains("foo.qux.*")); + + assertInstanceBinding(module, SettingsFilter.class, (s) -> s.filter(settings).size() == 1); + assertInstanceBinding(module, SettingsFilter.class, (s) -> s.filter(settings).getAsMap().containsKey("foo.bar")); + } + public void testMutuallyExclusiveScopes() { new SettingsModule(Settings.EMPTY, Setting.simpleString("foo.bar", Property.NodeScope)); new SettingsModule(Settings.EMPTY, Setting.simpleString("index.foo.bar", Property.IndexScope));