Skip to content

Commit

Permalink
Adding a deprecation info API check for fractional byte value settings (
Browse files Browse the repository at this point in the history
#77074)

In 6.2.0 we deprecated support for fractional byte value settings. Support was originally going to be
removed altogether in 8.0.0 (see #53927) but that PR was not merged. This commit adds a warning
deprecation info check if any fractional byte values settings are found.
Relates #42404
  • Loading branch information
masseyke authored Sep 7, 2021
1 parent db837e7 commit 4968d01
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ private DeprecationChecks() {
NodeDeprecationChecks::checkImplicitlyDisabledSecurityOnBasicAndTrial,
NodeDeprecationChecks::checkSearchRemoteSettings,
NodeDeprecationChecks::checkMonitoringExporterPassword,
NodeDeprecationChecks::checkFractionalByteValueSettings,
NodeDeprecationChecks::checkFrozenCacheLeniency,
NodeDeprecationChecks::checkSslServerEnabled,
NodeDeprecationChecks::checkSslCertConfiguration,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Setting.Property;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.ssl.SslConfigurationKeys;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.util.concurrent.EsExecutors;
import org.elasticsearch.common.util.set.Sets;
import org.elasticsearch.core.TimeValue;
Expand All @@ -36,9 +36,9 @@
import org.elasticsearch.script.ScriptService;
import org.elasticsearch.threadpool.FixedExecutorBuilder;
import org.elasticsearch.transport.RemoteClusterService;
import org.elasticsearch.xpack.core.DataTier;
import org.elasticsearch.transport.SniffConnectionStrategy;
import org.elasticsearch.transport.TransportService;
import org.elasticsearch.xpack.core.DataTier;
import org.elasticsearch.xpack.core.XPackSettings;
import org.elasticsearch.xpack.core.security.SecurityField;
import org.elasticsearch.xpack.core.security.authc.RealmConfig;
Expand All @@ -48,6 +48,7 @@

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -671,6 +672,33 @@ static DeprecationIssue checkClusterRoutingAllocationIncludeRelocationsSetting(f
);
}

static DeprecationIssue checkFractionalByteValueSettings(final Settings settings,
final PluginsAndModules pluginsAndModules,
final ClusterState clusterState,
final XPackLicenseState licenseState) {
Map<String, String> fractionalByteSettings = new HashMap<>();
for (String key : settings.keySet()) {
try {
settings.getAsBytesSize(key, ByteSizeValue.ZERO);
String stringValue = settings.get(key);
if (stringValue.contains(".")) {
fractionalByteSettings.put(key, stringValue);
}
} catch (Exception ignoreThis) {
// We expect anything that is not a byte setting to throw an exception, but we don't care about those
}
}
if (fractionalByteSettings.isEmpty()) {
return null;
}
String url = "https://www.elastic.co/guide/en/elasticsearch/reference/master/logging.html#deprecation-logging";
String message = "support for fractional byte size values is deprecated and will be removed in a future release";
String details = "change the following settings to non-fractional values: [" +
fractionalByteSettings.entrySet().stream().map(fractionalByteSetting -> fractionalByteSetting.getKey() + "->" +
fractionalByteSetting.getValue()).collect(Collectors.joining(", ")) + "]";
return new DeprecationIssue(DeprecationIssue.Level.WARNING, message, url, details, false, null);
}

static DeprecationIssue checkFrozenCacheLeniency(final Settings settings,
final PluginsAndModules pluginsAndModules,
final ClusterState clusterState,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,34 @@ public void testImplicitlyConfiguredSecurityOnGoldPlus() {
assertThat(issues, empty());
}

public void testCheckFractionalByteValueSettings() {
String settingKey = "network.tcp.send_buffer_size";
String unit = randomFrom(new String[]{"k", "kb", "m", "mb", "g", "gb", "t", "tb", "p", "pb"});
float value = Math.abs(randomFloat());
String settingValue = value + unit;
String unaffectedSettingKey = "some.other.setting";
String unaffectedSettingValue = "54.32.43mb"; //Not an actual number, so we don't expect to see a deprecation log about it
final Settings nodeSettings =
Settings.builder().put(settingKey, settingValue).put(unaffectedSettingKey, unaffectedSettingValue).build();
final XPackLicenseState licenseState = new XPackLicenseState(Settings.EMPTY, () -> 0);
final ClusterState clusterState = ClusterState.EMPTY_STATE;
final DeprecationIssue expectedIssue = new DeprecationIssue(DeprecationIssue.Level.WARNING,
"support for fractional byte size values is deprecated and will be removed in a future release",
"https://www.elastic.co/guide/en/elasticsearch/reference/master/logging.html#deprecation-logging",
String.format(Locale.ROOT,
"change the following settings to non-fractional values: [%s->%s]",
settingKey,
settingValue),
false, null
);
assertThat(
NodeDeprecationChecks.checkFractionalByteValueSettings(nodeSettings, null, clusterState, licenseState),
equalTo(expectedIssue)
);
assertWarnings(String.format(Locale.ROOT, "Fractional bytes values are deprecated. Use non-fractional bytes values instead: [%s] " +
"found for setting [%s]", settingValue, settingKey));
}

public void testCheckFrozenCacheLeniency() {
String cacheSizeSettingValue = "10gb";
String cacheSizeSettingKey = "xpack.searchable.snapshot.shared_cache.size";
Expand Down

0 comments on commit 4968d01

Please sign in to comment.