Skip to content

Commit aedf9e3

Browse files
authored
Deprecation message for lenient Boolean parsing (#137885)
* Deprecation message for lenient Boolean parsing #128993 * Update docs/changelog/137885.yaml * Update docs/changelog/137885.yaml * Update 137885.yaml * Update 137885.yaml * Update docs/changelog/137885.yaml * Address review comments * Changed message and made some calls strict * Address review comments * Address review comments
1 parent 8a132d2 commit aedf9e3

File tree

12 files changed

+116
-54
lines changed

12 files changed

+116
-54
lines changed

docs/changelog/137885.yaml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
pr: 137885
2+
summary: Add deprecation lenient booleans usage for analysis boolean setting (3rd party plugins) and boolean system properties.
3+
area: Infra/Logging
4+
type: deprecation
5+
issues:
6+
- 128993
7+
deprecation:
8+
title: Add deprecation lenient booleans usage for analysis boolean setting (3rd party plugins) and boolean system properties.
9+
area: Logging
10+
details: Usage of lenient booleans was deprecated for analysis boolean setting in external plugins using the stable plugin API and various boolean system properties.
11+
impact: Usage of lenient booleans other than `true` or `false` will result in deprecations logs. Future releases of ES may only accept strict boolean values `true` or `false.

modules/lang-mustache/src/main/java/org/elasticsearch/script/mustache/MustacheScriptEngine.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.elasticsearch.common.text.SizeLimitingStringWriter;
2222
import org.elasticsearch.common.unit.ByteSizeValue;
2323
import org.elasticsearch.common.unit.MemorySizeValue;
24-
import org.elasticsearch.core.SuppressForbidden;
24+
import org.elasticsearch.core.Booleans;
2525
import org.elasticsearch.script.GeneralScriptException;
2626
import org.elasticsearch.script.Script;
2727
import org.elasticsearch.script.ScriptContext;
@@ -114,11 +114,8 @@ private static CustomMustacheFactory createMustacheFactory(Map<String, String> o
114114
return builder.build();
115115
}
116116

117-
@SuppressForbidden(
118-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
119-
)
120117
private static boolean getDetectMissingParamsOption(Map<String, String> options) {
121-
return Boolean.valueOf(options.get(DETECT_MISSING_PARAMS_OPTION));
118+
return Booleans.parseBoolean(options.get(DETECT_MISSING_PARAMS_OPTION));
122119
}
123120

124121
@Override

modules/lang-painless/src/main/java/org/elasticsearch/painless/PainlessScriptEngine.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import org.elasticsearch.SpecialPermission;
1313
import org.elasticsearch.common.settings.Settings;
14-
import org.elasticsearch.core.SuppressForbidden;
14+
import org.elasticsearch.core.Booleans;
1515
import org.elasticsearch.painless.Compiler.Loader;
1616
import org.elasticsearch.painless.lookup.PainlessLookup;
1717
import org.elasticsearch.painless.lookup.PainlessLookupBuilder;
@@ -415,7 +415,7 @@ private CompilerSettings buildCompilerSettings(Map<String, String> params) {
415415

416416
value = copy.remove(CompilerSettings.PICKY);
417417
if (value != null) {
418-
compilerSettings.setPicky(parseBoolean(value));
418+
compilerSettings.setPicky(Booleans.parseBoolean(value));
419419
}
420420

421421
value = copy.remove(CompilerSettings.INITIAL_CALL_SITE_DEPTH);
@@ -440,13 +440,6 @@ private CompilerSettings buildCompilerSettings(Map<String, String> params) {
440440
return compilerSettings;
441441
}
442442

443-
@SuppressForbidden(
444-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
445-
)
446-
private static boolean parseBoolean(String value) {
447-
return Boolean.parseBoolean(value);
448-
}
449-
450443
private static ScriptException convertToScriptException(String scriptSource, Throwable t) {
451444
// create a script stack: this is just the script portion
452445
List<String> scriptStack = new ArrayList<>();

modules/transport-netty4/src/main/java/org/elasticsearch/transport/netty4/NettyAllocator.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.elasticsearch.common.util.PageCacheRecycler;
2727
import org.elasticsearch.core.Assertions;
2828
import org.elasticsearch.core.Booleans;
29-
import org.elasticsearch.core.SuppressForbidden;
3029
import org.elasticsearch.monitor.jvm.JvmInfo;
3130

3231
import java.util.Arrays;
@@ -170,11 +169,8 @@ public int pageSize() {
170169
};
171170
}
172171

173-
@SuppressForbidden(
174-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
175-
)
176172
private static boolean useG1GC() {
177-
return Boolean.parseBoolean(JvmInfo.jvmInfo().useG1GC());
173+
return Booleans.parseBooleanLenient(JvmInfo.jvmInfo().useG1GC(), false);
178174
}
179175

180176
public static void logAllocatorDescriptionIfNeeded() {

server/src/main/java/org/elasticsearch/cluster/metadata/LifecycleExecutionState.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
import org.elasticsearch.ElasticsearchException;
1313
import org.elasticsearch.common.Strings;
14-
import org.elasticsearch.core.SuppressForbidden;
14+
import org.elasticsearch.common.logging.DeprecationCategory;
15+
import org.elasticsearch.common.util.LenientBooleans;
1516

1617
import java.util.Collections;
1718
import java.util.HashMap;
@@ -212,11 +213,13 @@ public static LifecycleExecutionState fromCustomMetadata(Map<String, String> cus
212213
return builder.build();
213214
}
214215

215-
@SuppressForbidden(
216-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
217-
)
218216
private static boolean parseIsAutoRetryableError(String isAutoRetryableError) {
219-
return Boolean.parseBoolean(isAutoRetryableError);
217+
return LenientBooleans.parseAndCheckForDeprecatedUsage(
218+
isAutoRetryableError,
219+
LenientBooleans.UsageCategory.INDEX_METADATA,
220+
IS_AUTO_RETRYABLE_ERROR,
221+
DeprecationCategory.PARSING
222+
);
220223
}
221224

222225
/**

server/src/main/java/org/elasticsearch/common/network/NetworkUtils.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
import org.apache.lucene.util.BytesRef;
1313
import org.apache.lucene.util.Constants;
14+
import org.elasticsearch.core.Booleans;
1415
import org.elasticsearch.core.Predicates;
15-
import org.elasticsearch.core.SuppressForbidden;
1616

1717
import java.io.IOException;
1818
import java.net.Inet4Address;
@@ -47,11 +47,8 @@ private NetworkUtils() {}
4747
@Deprecated
4848
static final boolean PREFER_V6 = preferIPv6Addresses();
4949

50-
@SuppressForbidden(
51-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
52-
)
5350
private static boolean preferIPv6Addresses() {
54-
return Boolean.parseBoolean(System.getProperty("java.net.preferIPv6Addresses", "false"));
51+
return Booleans.parseBooleanLenient(System.getProperty("java.net.preferIPv6Addresses", "false"), false);
5552
}
5653

5754
/**
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the "Elastic License
4+
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
5+
* Public License v 1"; you may not use this file except in compliance with, at
6+
* your election, the "Elastic License 2.0", the "GNU Affero General Public
7+
* License v3.0 only", or the "Server Side Public License, v 1".
8+
*/
9+
10+
package org.elasticsearch.common.util;
11+
12+
import org.elasticsearch.common.logging.DeprecationCategory;
13+
import org.elasticsearch.common.logging.DeprecationLogger;
14+
import org.elasticsearch.core.Booleans;
15+
import org.elasticsearch.core.SuppressForbidden;
16+
import org.elasticsearch.core.UpdateForV10;
17+
18+
import java.util.Locale;
19+
20+
import static org.elasticsearch.common.util.LenientBooleans.DeprecationLoggerHolder.deprecationLogger;
21+
22+
@UpdateForV10(owner = UpdateForV10.Owner.CORE_INFRA)
23+
public class LenientBooleans {
24+
25+
/**
26+
* Category of use of lenient Boolean parsing.
27+
*/
28+
public enum UsageCategory {
29+
SYSTEM_PROPERTY("system property"),
30+
INDEX_METADATA("index metadata"),
31+
SETTING("setting");
32+
33+
private final String displayValue;
34+
35+
UsageCategory(String displayValue) {
36+
this.displayValue = displayValue;
37+
}
38+
39+
public String displayValue() {
40+
return displayValue;
41+
}
42+
}
43+
44+
private static final String DEPRECATED_MESSAGE_TEMPLATE = "Usage of lenient boolean value [{}] for {} [{}] was deprecated. "
45+
+ "Future releases of Elasticsearch may only accept `true` or `false`.";
46+
47+
static class DeprecationLoggerHolder {
48+
static DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(LenientBooleans.class);
49+
}
50+
51+
@SuppressForbidden(reason = "wrap lenient parsing of booleans for deprecation logging.")
52+
public static boolean parseAndCheckForDeprecatedUsage(
53+
String value,
54+
UsageCategory usageCategory,
55+
String name,
56+
DeprecationCategory deprecationCategory
57+
) {
58+
if (Booleans.isBoolean(value) == false) {
59+
String key = String.format(Locale.ROOT, "lenient.%s.%s", usageCategory, name);
60+
deprecationLogger.critical(deprecationCategory, key, DEPRECATED_MESSAGE_TEMPLATE, value, usageCategory.displayValue(), name);
61+
}
62+
return Boolean.parseBoolean(value);
63+
}
64+
}

server/src/main/java/org/elasticsearch/index/codec/tsdb/es819/ES819TSDBDocValuesFormat.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
import org.apache.lucene.codecs.DocValuesProducer;
1414
import org.apache.lucene.index.SegmentReadState;
1515
import org.apache.lucene.index.SegmentWriteState;
16-
import org.elasticsearch.core.SuppressForbidden;
16+
import org.elasticsearch.common.logging.DeprecationCategory;
17+
import org.elasticsearch.common.util.LenientBooleans;
1718
import org.elasticsearch.index.codec.tsdb.BinaryDVCompressionMode;
1819

1920
import java.io.IOException;
@@ -111,11 +112,13 @@ public class ES819TSDBDocValuesFormat extends org.apache.lucene.codecs.DocValues
111112
OPTIMIZED_MERGE_ENABLE_DEFAULT = getOptimizedMergeEnabledDefault();
112113
}
113114

114-
@SuppressForbidden(
115-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
116-
)
117115
private static boolean getOptimizedMergeEnabledDefault() {
118-
return Boolean.parseBoolean(System.getProperty(OPTIMIZED_MERGE_ENABLED_NAME, Boolean.TRUE.toString()));
116+
return LenientBooleans.parseAndCheckForDeprecatedUsage(
117+
System.getProperty(OPTIMIZED_MERGE_ENABLED_NAME, Boolean.TRUE.toString()),
118+
LenientBooleans.UsageCategory.SYSTEM_PROPERTY,
119+
OPTIMIZED_MERGE_ENABLED_NAME,
120+
DeprecationCategory.PARSING
121+
);
119122
}
120123

121124
/**

server/src/main/java/org/elasticsearch/index/store/LuceneFilesExtensions.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
import org.apache.lucene.index.IndexFileNames;
1313
import org.elasticsearch.common.util.Maps;
14+
import org.elasticsearch.core.Booleans;
1415
import org.elasticsearch.core.Nullable;
15-
import org.elasticsearch.core.SuppressForbidden;
1616

1717
import java.util.Collections;
1818
import java.util.Map;
@@ -96,11 +96,8 @@ public enum LuceneFilesExtensions {
9696
* that checks that all encountered file extensions are known to this class.
9797
* In the future, we would like to add a proper plugin extension point for this.
9898
*/
99-
@SuppressForbidden(
100-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
101-
)
10299
private static boolean allowUnknownLuceneFileExtensions() {
103-
return Boolean.parseBoolean(System.getProperty("es.allow_unknown_lucene_file_extensions", "false"));
100+
return Booleans.parseBoolean(System.getProperty("es.allow_unknown_lucene_file_extensions", "false"));
104101
}
105102

106103
/**

server/src/main/java/org/elasticsearch/indices/analysis/wrappers/SettingsInvocationHandler.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111

1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
14+
import org.elasticsearch.common.logging.DeprecationCategory;
1415
import org.elasticsearch.common.settings.Settings;
15-
import org.elasticsearch.core.SuppressForbidden;
16+
import org.elasticsearch.common.util.LenientBooleans;
1617
import org.elasticsearch.env.Environment;
1718
import org.elasticsearch.plugin.settings.BooleanSetting;
1819
import org.elasticsearch.plugin.settings.IntSetting;
@@ -47,9 +48,6 @@ public static <T> T create(Settings settings, Class<T> parameterType, Environmen
4748
);
4849
}
4950

50-
@SuppressForbidden(
51-
reason = "TODO Deprecate any lenient usage of Boolean#parseBoolean https://github.com/elastic/elasticsearch/issues/128993"
52-
)
5351
@Override
5452
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
5553
assert method.getAnnotations().length == 1;
@@ -60,7 +58,16 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
6058
} else if (annotation instanceof LongSetting setting) {
6159
return getValue(Long::valueOf, setting.path(), setting.defaultValue());
6260
} else if (annotation instanceof BooleanSetting setting) {
63-
return getValue(Boolean::valueOf, setting.path(), setting.defaultValue());
61+
return getValue(
62+
v -> LenientBooleans.parseAndCheckForDeprecatedUsage(
63+
v,
64+
LenientBooleans.UsageCategory.SETTING,
65+
setting.path(),
66+
DeprecationCategory.SETTINGS
67+
),
68+
setting.path(),
69+
setting.defaultValue()
70+
);
6471
} else if (annotation instanceof StringSetting setting) {
6572
return getValue(String::valueOf, setting.path(), setting.defaultValue());
6673
} else if (annotation instanceof ListSetting setting) {

0 commit comments

Comments
 (0)