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));