diff --git a/docs/changelog/126751.yaml b/docs/changelog/126751.yaml new file mode 100644 index 000000000000..05235c922d75 --- /dev/null +++ b/docs/changelog/126751.yaml @@ -0,0 +1,5 @@ +pr: 126751 +summary: Allow float settings to be configured with other settings as default +area: Infra/Settings +type: enhancement +issues: [] diff --git a/server/src/main/java/org/elasticsearch/common/settings/Setting.java b/server/src/main/java/org/elasticsearch/common/settings/Setting.java index 7ec4399b4ff9..264ea182d0a8 100644 --- a/server/src/main/java/org/elasticsearch/common/settings/Setting.java +++ b/server/src/main/java/org/elasticsearch/common/settings/Setting.java @@ -1367,8 +1367,16 @@ public class Setting implements ToXContentObject { } public static Setting floatSetting(String key, float defaultValue, float minValue, Property... properties) { + return new Setting<>(key, Float.toString(defaultValue), floatParser(key, minValue, properties), properties); + } + + public static Setting floatSetting(String key, Setting fallbackSetting, float minValue, Property... properties) { + return new Setting<>(key, fallbackSetting, floatParser(key, minValue, properties), properties); + } + + private static Function floatParser(String key, float minValue, Property... properties) { final boolean isFiltered = isFiltered(properties); - return new Setting<>(key, Float.toString(defaultValue), (s) -> { + return (s) -> { float value = Float.parseFloat(s); if (value < minValue) { String err = "Failed to parse value" @@ -1380,7 +1388,7 @@ public class Setting implements ToXContentObject { throw new IllegalArgumentException(err); } return value; - }, properties); + }; } private static boolean isFiltered(Property[] properties) { diff --git a/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java b/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java index ed99ea6c74d0..6b7f45f2fc66 100644 --- a/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java +++ b/server/src/test/java/org/elasticsearch/common/settings/SettingTests.java @@ -387,6 +387,34 @@ public class SettingTests extends ESTestCase { assertNull(e.getCause()); } + public void testFloatSettingWithOtherSettingAsDefault() { + float defaultFallbackValue = randomFloat(); + Setting fallbackSetting = Setting.floatSetting("fallback_setting", defaultFallbackValue); + Setting floatSetting = Setting.floatSetting("float_setting", fallbackSetting, Float.MIN_VALUE); + + // Neither float_setting nor fallback_setting specified + assertThat(floatSetting.get(Settings.builder().build()), equalTo(defaultFallbackValue)); + + // Only fallback_setting specified + float explicitFallbackValue = randomValueOtherThan(defaultFallbackValue, ESTestCase::randomFloat); + assertThat( + floatSetting.get(Settings.builder().put("fallback_setting", explicitFallbackValue).build()), + equalTo(explicitFallbackValue) + ); + + // Both float_setting and fallback_setting specified + float explicitFloatValue = randomValueOtherThanMany( + v -> v != explicitFallbackValue && v != defaultFallbackValue, + ESTestCase::randomFloat + ); + assertThat( + floatSetting.get( + Settings.builder().put("fallback_setting", explicitFallbackValue).put("float_setting", explicitFloatValue).build() + ), + equalTo(explicitFloatValue) + ); + } + private enum TestEnum { ON, OFF