From 1d500e0e7f1968614018efd21b73679b9c267924 Mon Sep 17 00:00:00 2001 From: Matko Medenjak Date: Mon, 2 Aug 2021 16:19:55 +0200 Subject: [PATCH 1/2] Enable instance tracking by default for NLC builds Instance tracking should be on by default, but only for NLC builds. The field is set to true by the constructor but we need to introduce additional changes to prevent instance tracking of being disabled even though the user didn't add any configuration: - we need to remove instances tracking config from both XML and YAML default config files - we need to prevent setting the enabled field unless there is content found for the "enabled" field. Otherwise, even an empty instance tracking config could be parsed by YAML parser, and it would disable instance tracking - also, NLC builds don't have a default file name and it should be explicitly set. Non-NLC builds use the default file name. Fixes: https://github.com/hazelcast/hazelcast-enterprise/issues/4166 --- .../hazelcast/config/InstanceTrackingConfig.java | 14 ++++++++++++++ .../config/AbstractDomConfigProcessor.java | 7 +++++-- hazelcast/src/main/resources/hazelcast-default.xml | 4 ---- .../src/main/resources/hazelcast-default.yaml | 3 --- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java b/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java index 4b576964a029..d4627c193f1d 100644 --- a/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java +++ b/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java @@ -16,6 +16,10 @@ package com.hazelcast.config; +import com.hazelcast.internal.util.EmptyStatement; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Objects; @@ -53,6 +57,16 @@ public class InstanceTrackingConfig { public InstanceTrackingConfig() { super(); + try { + Class helper = Class.forName("com.hazelcast.license.util.LicenseHelper"); + Method getLicense = helper.getMethod("getBuiltInLicense"); + // enabled for NLC build + enabled = getLicense.invoke(null) != null; + } catch (ClassNotFoundException | NoSuchMethodException + | IllegalAccessException | InvocationTargetException e) { + // running OS, instance tracking is disabled by default + EmptyStatement.ignore(e); + } } public InstanceTrackingConfig(InstanceTrackingConfig other) { diff --git a/hazelcast/src/main/java/com/hazelcast/internal/config/AbstractDomConfigProcessor.java b/hazelcast/src/main/java/com/hazelcast/internal/config/AbstractDomConfigProcessor.java index 31a8622cb5fa..f14e93193b13 100644 --- a/hazelcast/src/main/java/com/hazelcast/internal/config/AbstractDomConfigProcessor.java +++ b/hazelcast/src/main/java/com/hazelcast/internal/config/AbstractDomConfigProcessor.java @@ -48,6 +48,7 @@ import static com.hazelcast.internal.config.DomConfigHelper.cleanNodeName; import static com.hazelcast.internal.config.DomConfigHelper.getBooleanValue; import static com.hazelcast.internal.config.DomConfigHelper.getIntegerValue; +import static com.hazelcast.internal.util.StringUtil.isNullOrEmptyAfterTrim; import static com.hazelcast.internal.util.StringUtil.upperCaseInternal; /** @@ -404,8 +405,10 @@ protected LoginModuleConfig handleLoginModule(Node node) { protected void handleInstanceTracking(Node node, InstanceTrackingConfig trackingConfig) { Node attrEnabled = getNamedItemNode(node, "enabled"); - boolean enabled = getBooleanValue(getTextContent(attrEnabled)); - trackingConfig.setEnabled(enabled); + String textContent = getTextContent(attrEnabled); + if (!isNullOrEmptyAfterTrim(textContent)) { + trackingConfig.setEnabled(getBooleanValue(textContent)); + } for (Node n : childElements(node)) { final String name = cleanNodeName(n); diff --git a/hazelcast/src/main/resources/hazelcast-default.xml b/hazelcast/src/main/resources/hazelcast-default.xml index e6812a5a169f..8ee9fb094b2c 100644 --- a/hazelcast/src/main/resources/hazelcast-default.xml +++ b/hazelcast/src/main/resources/hazelcast-default.xml @@ -329,10 +329,6 @@ 5 - - - - -1 0 diff --git a/hazelcast/src/main/resources/hazelcast-default.yaml b/hazelcast/src/main/resources/hazelcast-default.yaml index f3b6ad08b32e..a7ac3a054b1f 100644 --- a/hazelcast/src/main/resources/hazelcast-default.yaml +++ b/hazelcast/src/main/resources/hazelcast-default.yaml @@ -331,9 +331,6 @@ hazelcast: enabled: true collection-frequency-seconds: 5 - instance-tracking: - enabled: false - sql: executor-pool-size: -1 statement-timeout-millis: 0 From 70e8fd3fb7ea5c2840a40b7229f85dfe5d9e629b Mon Sep 17 00:00:00 2001 From: Matko Medenjak Date: Wed, 4 Aug 2021 15:21:33 +0200 Subject: [PATCH 2/2] - added tests - made tests use small instances - addressed review comments --- .../com/hazelcast/config/ConfigAccessor.java | 4 ++ .../config/InstanceTrackingConfig.java | 38 +++++++++++++------ 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/hazelcast/src/main/java/com/hazelcast/config/ConfigAccessor.java b/hazelcast/src/main/java/com/hazelcast/config/ConfigAccessor.java index d754e992f38c..53a6fb855838 100644 --- a/hazelcast/src/main/java/com/hazelcast/config/ConfigAccessor.java +++ b/hazelcast/src/main/java/com/hazelcast/config/ConfigAccessor.java @@ -41,4 +41,8 @@ public static NetworkConfig getActiveMemberNetworkConfig(Config config) { public static ServicesConfig getServicesConfig(Config config) { return config.getServicesConfig(); } + + public static boolean isInstanceTrackingEnabledSet(Config config) { + return config.getInstanceTrackingConfig().isEnabledSet; + } } diff --git a/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java b/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java index d4627c193f1d..d1fcdf720397 100644 --- a/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java +++ b/hazelcast/src/main/java/com/hazelcast/config/InstanceTrackingConfig.java @@ -45,28 +45,26 @@ public class InstanceTrackingConfig { */ public static final Path DEFAULT_FILE = Paths.get(System.getProperty("java.io.tmpdir"), "Hazelcast.process"); + /** + * Default setting whether instance tracking should be enabled or not. + * It depends on whether the instance is an OEM/NLC build or not. + */ + public static final boolean DEFAULT_ENABLED = isOEMBuild(); + /** * Namespace for the placeholders in the file name and format pattern to * distinguish between different types of placeholders. */ public static final String PLACEHOLDER_NAMESPACE = "HZ_INSTANCE_TRACKING"; - private boolean enabled; + private boolean enabled = DEFAULT_ENABLED; private String fileName; private String formatPattern; + boolean isEnabledSet; + public InstanceTrackingConfig() { super(); - try { - Class helper = Class.forName("com.hazelcast.license.util.LicenseHelper"); - Method getLicense = helper.getMethod("getBuiltInLicense"); - // enabled for NLC build - enabled = getLicense.invoke(null) != null; - } catch (ClassNotFoundException | NoSuchMethodException - | IllegalAccessException | InvocationTargetException e) { - // running OS, instance tracking is disabled by default - EmptyStatement.ignore(e); - } } public InstanceTrackingConfig(InstanceTrackingConfig other) { @@ -90,6 +88,7 @@ public boolean isEnabled() { */ public InstanceTrackingConfig setEnabled(boolean enabled) { this.enabled = enabled; + this.isEnabledSet = true; return this; } @@ -325,4 +324,21 @@ public String getModeName() { return modeName; } } + + /** + * Returns whether this build is an OEM/NLC build or not. + */ + private static boolean isOEMBuild() { + try { + Class helper = Class.forName("com.hazelcast.license.util.LicenseHelper"); + Method getLicense = helper.getMethod("getBuiltInLicense"); + // enabled for OEM/NLC build + return getLicense.invoke(null) != null; + } catch (ClassNotFoundException | NoSuchMethodException + | IllegalAccessException | InvocationTargetException e) { + // running OS, instance tracking is disabled by default + EmptyStatement.ignore(e); + } + return false; + } }