From b76ef08d6b124647863b520569ff63266bc154ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20=C3=87elik?= Date: Fri, 17 Aug 2018 20:14:45 +0300 Subject: [PATCH] [BACKPORT] moved parameter creation part into another method at PhoneHome - related to OEM changes (#13386) * ee phone home pings are sent from ee side - related to OEM changes * create phoneHome object based on nodeExtension type * review comments * make logger final at PhoneHome class --- .../instance/DefaultNodeExtension.java | 15 +++ .../java/com/hazelcast/instance/Node.java | 8 +- .../com/hazelcast/instance/NodeExtension.java | 5 + .../java/com/hazelcast/util/PhoneHome.java | 94 ++++++++++--------- .../compatibility/SamplingNodeExtension.java | 4 + .../com/hazelcast/util/PhoneHomeTest.java | 34 ++++--- 6 files changed, 93 insertions(+), 67 deletions(-) diff --git a/hazelcast/src/main/java/com/hazelcast/instance/DefaultNodeExtension.java b/hazelcast/src/main/java/com/hazelcast/instance/DefaultNodeExtension.java index 8257a3c8745d..dcdbcbaa7130 100644 --- a/hazelcast/src/main/java/com/hazelcast/instance/DefaultNodeExtension.java +++ b/hazelcast/src/main/java/com/hazelcast/instance/DefaultNodeExtension.java @@ -84,6 +84,7 @@ import com.hazelcast.util.ByteArrayProcessor; import com.hazelcast.util.ConstructorFunction; import com.hazelcast.util.ExceptionUtil; +import com.hazelcast.util.PhoneHome; import com.hazelcast.util.Preconditions; import com.hazelcast.util.UuidUtil; import com.hazelcast.util.function.Supplier; @@ -107,6 +108,7 @@ public class DefaultNodeExtension implements NodeExtension { protected final ILogger logger; protected final ILogger systemLogger; protected final List clusterVersionListeners = new CopyOnWriteArrayList(); + protected PhoneHome phoneHome; private final MemoryStats memoryStats = new DefaultMemoryStats(); @@ -115,6 +117,7 @@ public DefaultNodeExtension(Node node) { this.logger = node.getLogger(NodeExtension.class); this.systemLogger = node.getLogger("com.hazelcast.system"); checkSecurityAllowed(); + createAndSetPhoneHome(); } private void checkSecurityAllowed() { @@ -285,6 +288,9 @@ public void beforeShutdown() { @Override public void shutdown() { logger.info("Destroying node NodeExtension."); + if (phoneHome != null) { + phoneHome.shutdown(); + } } @Override @@ -437,4 +443,13 @@ public void registerPlugins(Diagnostics diagnostics) { public ManagementCenterConnectionFactory getManagementCenterConnectionFactory() { return null; } + + @Override + public void sendPhoneHome() { + phoneHome.check(node); + } + + protected void createAndSetPhoneHome() { + this.phoneHome = new PhoneHome(node); + } } diff --git a/hazelcast/src/main/java/com/hazelcast/instance/Node.java b/hazelcast/src/main/java/com/hazelcast/instance/Node.java index ba1e9cd88a15..3871e7cc22c5 100644 --- a/hazelcast/src/main/java/com/hazelcast/instance/Node.java +++ b/hazelcast/src/main/java/com/hazelcast/instance/Node.java @@ -75,7 +75,6 @@ import com.hazelcast.spi.impl.proxyservice.impl.ProxyServiceImpl; import com.hazelcast.spi.properties.HazelcastProperties; import com.hazelcast.util.Clock; -import com.hazelcast.util.PhoneHome; import com.hazelcast.version.MemberVersion; import com.hazelcast.version.Version; @@ -142,8 +141,6 @@ public class Node { private final NodeShutdownHookThread shutdownHookThread; - private final PhoneHome phoneHome = new PhoneHome(); - private final InternalSerializationService serializationService; private final ClassLoader configClassLoader; @@ -408,7 +405,7 @@ void start() { logger.warning("ManagementCenterService could not be constructed!", e); } nodeExtension.afterStart(); - phoneHome.check(this, getBuildInfo().getVersion(), buildInfo.isEnterprise()); + nodeExtension.sendPhoneHome(); healthMonitor.start(); } @@ -478,9 +475,6 @@ private void shutdownServices(boolean terminate) { if (nodeExtension != null) { nodeExtension.beforeShutdown(); } - if (phoneHome != null) { - phoneHome.shutdown(); - } if (managementCenterService != null) { managementCenterService.shutdown(); } diff --git a/hazelcast/src/main/java/com/hazelcast/instance/NodeExtension.java b/hazelcast/src/main/java/com/hazelcast/instance/NodeExtension.java index 91c298f9834f..bea7ce881826 100644 --- a/hazelcast/src/main/java/com/hazelcast/instance/NodeExtension.java +++ b/hazelcast/src/main/java/com/hazelcast/instance/NodeExtension.java @@ -267,4 +267,9 @@ public interface NodeExtension { * @param diagnostics the diagnostics on which plugins should be registered */ void registerPlugins(Diagnostics diagnostics); + + /** + * Send PhoneHome ping from OS or EE instance to PhoneHome application + */ + void sendPhoneHome(); } diff --git a/hazelcast/src/main/java/com/hazelcast/util/PhoneHome.java b/hazelcast/src/main/java/com/hazelcast/util/PhoneHome.java index 8d226ba61f84..d60e82a02897 100644 --- a/hazelcast/src/main/java/com/hazelcast/util/PhoneHome.java +++ b/hazelcast/src/main/java/com/hazelcast/util/PhoneHome.java @@ -19,14 +19,14 @@ import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; import com.hazelcast.config.ManagementCenterConfig; -import com.hazelcast.config.NativeMemoryConfig; import com.hazelcast.core.ClientType; +import com.hazelcast.instance.BuildInfo; +import com.hazelcast.instance.BuildInfoProvider; import com.hazelcast.instance.JetBuildInfo; import com.hazelcast.instance.Node; import com.hazelcast.internal.cluster.impl.ClusterServiceImpl; import com.hazelcast.internal.management.ManagementCenterConnectionFactory; import com.hazelcast.logging.ILogger; -import com.hazelcast.memory.MemoryUnit; import com.hazelcast.spi.properties.GroupProperty; import java.io.BufferedInputStream; @@ -48,7 +48,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import static com.hazelcast.cluster.memberselector.MemberSelectors.DATA_MEMBER_SELECTOR; import static com.hazelcast.nio.IOUtil.closeResource; import static com.hazelcast.util.EmptyStatement.ignore; import static com.hazelcast.util.ExceptionUtil.rethrow; @@ -58,7 +57,7 @@ /** * Pings phone home server with cluster info daily. */ -public final class PhoneHome { +public class PhoneHome { private static final int TIMEOUT = 1000; @@ -77,13 +76,15 @@ public final class PhoneHome { private static final String FALSE = "false"; volatile ScheduledFuture phoneHomeFuture; + private final ILogger logger; + private final BuildInfo buildInfo = BuildInfoProvider.getBuildInfo(); - public PhoneHome() { + public PhoneHome(Node hazelcastNode) { + logger = hazelcastNode.getLogger(PhoneHome.class); } @SuppressWarnings("deprecation") - public void check(final Node hazelcastNode, final String version, final boolean isEnterprise) { - ILogger logger = hazelcastNode.getLogger(PhoneHome.class); + public void check(final Node hazelcastNode) { if (!hazelcastNode.getProperties().getBoolean(GroupProperty.VERSION_CHECK_ENABLED)) { logger.warning(GroupProperty.VERSION_CHECK_ENABLED.getName() + " property is deprecated. Please use " + GroupProperty.PHONE_HOME_ENABLED.getName() + " instead to disable phone home."); @@ -96,11 +97,12 @@ public void check(final Node hazelcastNode, final String version, final boolean return; } try { - phoneHomeFuture = hazelcastNode.nodeEngine.getExecutionService().scheduleWithRepetition("PhoneHome", new Runnable() { - public void run() { - phoneHome(hazelcastNode, version, isEnterprise); - } - }, 0, 1, TimeUnit.DAYS); + phoneHomeFuture = hazelcastNode.nodeEngine.getExecutionService() + .scheduleWithRepetition("PhoneHome", new Runnable() { + public void run() { + phoneHome(hazelcastNode); + } + }, 0, 1, TimeUnit.DAYS); } catch (RejectedExecutionException e) { logger.warning("Could not schedule phone home task! Most probably Hazelcast failed to start."); } @@ -138,44 +140,29 @@ public String convertToLetter(int size) { return letter; } - public Map phoneHome(Node hazelcastNode, String version, boolean isEnterprise) { - String downloadId = "source"; - InputStream is = null; - try { - is = getClass().getClassLoader().getResourceAsStream("hazelcast-download.properties"); - if (is != null) { - final Properties properties = new Properties(); - properties.load(is); - downloadId = properties.getProperty("hazelcastDownloadId"); - } - } catch (IOException ignored) { - ignore(ignored); - } finally { - closeResource(is); - } + public Map phoneHome(Node hazelcastNode) { + PhoneHomeParameterCreator parameterCreator = createParameters(hazelcastNode); - // calculate native memory usage from native memory config - NativeMemoryConfig memoryConfig = hazelcastNode.getConfig().getNativeMemoryConfig(); - ClusterServiceImpl clusterService = hazelcastNode.getClusterService(); - long totalNativeMemorySize = clusterService.getSize(DATA_MEMBER_SELECTOR) * memoryConfig.getSize().bytes(); - String nativeMemoryParameter = (isEnterprise) ? Long.toString(MemoryUnit.BYTES.toGigaBytes(totalNativeMemorySize)) : "0"; + String urlStr = BASE_PHONE_HOME_URL + parameterCreator.build(); + fetchWebService(urlStr); + + return parameterCreator.getParameters(); + } + public PhoneHomeParameterCreator createParameters(Node hazelcastNode) { + ClusterServiceImpl clusterService = hazelcastNode.getClusterService(); int clusterSize = clusterService.getMembers().size(); Long clusterUpTime = clusterService.getClusterClock().getClusterUpTime(); RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); - String licenseKey = hazelcastNode.getConfig().getLicenseKey(); JetBuildInfo jetBuildInfo = hazelcastNode.getBuildInfo().getJetBuildInfo(); PhoneHomeParameterCreator parameterCreator = new PhoneHomeParameterCreator() - .addParam("version", version) + .addParam("version", buildInfo.getVersion()) .addParam("m", hazelcastNode.getThisUuid()) - .addParam("e", Boolean.toString(isEnterprise)) - .addParam("l", licenseKey == null ? "" : MD5Util.toMD5String(licenseKey)) - .addParam("p", downloadId) + .addParam("p", getDownloadId()) .addParam("c", clusterService.getClusterId()) .addParam("crsz", convertToLetter(clusterSize)) .addParam("cssz", convertToLetter(hazelcastNode.clientEngine.getClientEndpointCount())) - .addParam("hdgb", nativeMemoryParameter) .addParam("cuptm", Long.toString(clusterUpTime)) .addParam("nuptm", Long.toString(runtimeMxBean.getUptime())) .addParam("jvmn", runtimeMxBean.getVmName()) @@ -183,7 +170,6 @@ public Map phoneHome(Node hazelcastNode, String version, boolean .addParam("jetv", jetBuildInfo == null ? "" : jetBuildInfo.getVersion()); addClientInfo(hazelcastNode, parameterCreator); addOSInfo(parameterCreator); - boolean isManagementCenterConfigEnabled = hazelcastNode.config.getManagementCenterConfig().isEnabled(); if (isManagementCenterConfigEnabled) { addManCenterInfo(hazelcastNode, clusterSize, parameterCreator); @@ -192,10 +178,25 @@ public Map phoneHome(Node hazelcastNode, String version, boolean parameterCreator.addParam("mcver", "MC_NOT_CONFIGURED"); } - String urlStr = BASE_PHONE_HOME_URL + parameterCreator.build(); - fetchWebService(urlStr); + return parameterCreator; + } - return parameterCreator.getParameters(); + private String getDownloadId() { + String downloadId = "source"; + InputStream is = null; + try { + is = getClass().getClassLoader().getResourceAsStream("hazelcast-download.properties"); + if (is != null) { + final Properties properties = new Properties(); + properties.load(is); + downloadId = properties.getProperty("hazelcastDownloadId"); + } + } catch (IOException ignored) { + ignore(ignored); + } finally { + closeResource(is); + } + return downloadId; } private void fetchWebService(String urlStr) { @@ -305,13 +306,16 @@ private void checkClusterSizeAndSetLicense(int clusterSize, PhoneHomeParameterCr } } - private static class PhoneHomeParameterCreator { + /** + * Util class for parameters of OS and EE PhoneHome pings. + */ + public static class PhoneHomeParameterCreator { private final StringBuilder builder; private final Map parameters = new HashMap(); private boolean hasParameterBefore; - PhoneHomeParameterCreator() { + public PhoneHomeParameterCreator() { builder = new StringBuilder(); builder.append("?"); } @@ -320,7 +324,7 @@ Map getParameters() { return parameters; } - PhoneHomeParameterCreator addParam(String key, String value) { + public PhoneHomeParameterCreator addParam(String key, String value) { if (hasParameterBefore) { builder.append("&"); } else { diff --git a/hazelcast/src/test/java/com/hazelcast/test/compatibility/SamplingNodeExtension.java b/hazelcast/src/test/java/com/hazelcast/test/compatibility/SamplingNodeExtension.java index 031abfaaa665..c959de77e058 100644 --- a/hazelcast/src/test/java/com/hazelcast/test/compatibility/SamplingNodeExtension.java +++ b/hazelcast/src/test/java/com/hazelcast/test/compatibility/SamplingNodeExtension.java @@ -228,4 +228,8 @@ public DynamicConfigListener createDynamicConfigListener() { @Override public void registerPlugins(Diagnostics diagnostics) { } + + @Override + public void sendPhoneHome() { + } } diff --git a/hazelcast/src/test/java/com/hazelcast/util/PhoneHomeTest.java b/hazelcast/src/test/java/com/hazelcast/util/PhoneHomeTest.java index 7fac90d42833..38275060d3af 100644 --- a/hazelcast/src/test/java/com/hazelcast/util/PhoneHomeTest.java +++ b/hazelcast/src/test/java/com/hazelcast/util/PhoneHomeTest.java @@ -19,6 +19,7 @@ import com.hazelcast.config.Config; import com.hazelcast.config.ManagementCenterConfig; import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.instance.BuildInfoProvider; import com.hazelcast.instance.Node; import com.hazelcast.spi.properties.GroupProperty; import com.hazelcast.test.HazelcastParallelClassRunner; @@ -49,20 +50,21 @@ public class PhoneHomeTest extends HazelcastTestSupport { public void testPhoneHomeParameters() { HazelcastInstance hz = createHazelcastInstance(); Node node = getNode(hz); - PhoneHome phoneHome = new PhoneHome(); + PhoneHome phoneHome = new PhoneHome(node); sleepAtLeastMillis(1); - Map parameters = phoneHome.phoneHome(node, "test_version", false); + Map parameters = phoneHome.phoneHome(node); RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean(); - assertEquals(parameters.get("version"), "test_version"); + assertEquals(parameters.get("version"), BuildInfoProvider.getBuildInfo().getVersion()); assertEquals(parameters.get("m"), node.getLocalMember().getUuid()); - assertEquals(parameters.get("e"), "false"); - assertEquals(parameters.get("l"), ""); + assertEquals(parameters.get("e"), null); + assertEquals(parameters.get("oem"), null); + assertEquals(parameters.get("l"), null); + assertEquals(parameters.get("hdgb"), null); assertEquals(parameters.get("p"), "source"); assertEquals(parameters.get("crsz"), "A"); assertEquals(parameters.get("cssz"), "A"); - assertEquals(parameters.get("hdgb"), "0"); assertEquals(parameters.get("ccpp"), "0"); assertEquals(parameters.get("cdn"), "0"); assertEquals(parameters.get("cjv"), "0"); @@ -92,10 +94,10 @@ public void testPhoneHomeParameters_withManagementCenterConfiguredButNotAvailabl HazelcastInstance hz = createHazelcastInstance(config); Node node = getNode(hz); - PhoneHome phoneHome = new PhoneHome(); + PhoneHome phoneHome = new PhoneHome(node); sleepAtLeastMillis(1); - Map parameters = phoneHome.phoneHome(node, "test_version", false); + Map parameters = phoneHome.phoneHome(node); assertEquals(parameters.get("mcver"), "MC_NOT_AVAILABLE"); assertEquals(parameters.get("mclicense"), "MC_NOT_AVAILABLE"); } @@ -109,8 +111,8 @@ public void testScheduling_whenVersionCheckIsDisabled() { HazelcastInstance hz = createHazelcastInstance(config); Node node = getNode(hz); - PhoneHome phoneHome = new PhoneHome(); - phoneHome.check(node, "test_version", false); + PhoneHome phoneHome = new PhoneHome(node); + phoneHome.check(node); assertNull(phoneHome.phoneHomeFuture); } @@ -122,8 +124,8 @@ public void testScheduling_whenPhoneHomeIsDisabled() { HazelcastInstance hz = createHazelcastInstance(config); Node node = getNode(hz); - PhoneHome phoneHome = new PhoneHome(); - phoneHome.check(node, "test_version", false); + PhoneHome phoneHome = new PhoneHome(node); + phoneHome.check(node); assertNull(phoneHome.phoneHomeFuture); } @@ -135,8 +137,8 @@ public void testShutdown() { HazelcastInstance hz = createHazelcastInstance(config); Node node = getNode(hz); - PhoneHome phoneHome = new PhoneHome(); - phoneHome.check(node, "test_version", false); + PhoneHome phoneHome = new PhoneHome(node); + phoneHome.check(node); assertNotNull(phoneHome.phoneHomeFuture); assertFalse(phoneHome.phoneHomeFuture.isDone()); assertFalse(phoneHome.phoneHomeFuture.isCancelled()); @@ -147,7 +149,9 @@ public void testShutdown() { @Test public void testConvertToLetter() { - PhoneHome phoneHome = new PhoneHome(); + HazelcastInstance hz = createHazelcastInstance(); + Node node = getNode(hz); + PhoneHome phoneHome = new PhoneHome(node); assertEquals("A", phoneHome.convertToLetter(4)); assertEquals("B", phoneHome.convertToLetter(9)); assertEquals("C", phoneHome.convertToLetter(19));