Skip to content

Commit

Permalink
[BACKPORT] moved parameter creation part into another method at Phone…
Browse files Browse the repository at this point in the history
…Home - related to OEM changes (hazelcast#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
  • Loading branch information
hasancelik committed Aug 17, 2018
1 parent 2bf8f15 commit b76ef08
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 67 deletions.
Expand Up @@ -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;
Expand All @@ -107,6 +108,7 @@ public class DefaultNodeExtension implements NodeExtension {
protected final ILogger logger;
protected final ILogger systemLogger;
protected final List<ClusterVersionListener> clusterVersionListeners = new CopyOnWriteArrayList<ClusterVersionListener>();
protected PhoneHome phoneHome;

private final MemoryStats memoryStats = new DefaultMemoryStats();

Expand All @@ -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() {
Expand Down Expand Up @@ -285,6 +288,9 @@ public void beforeShutdown() {
@Override
public void shutdown() {
logger.info("Destroying node NodeExtension.");
if (phoneHome != null) {
phoneHome.shutdown();
}
}

@Override
Expand Down Expand Up @@ -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);
}
}
8 changes: 1 addition & 7 deletions hazelcast/src/main/java/com/hazelcast/instance/Node.java
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -478,9 +475,6 @@ private void shutdownServices(boolean terminate) {
if (nodeExtension != null) {
nodeExtension.beforeShutdown();
}
if (phoneHome != null) {
phoneHome.shutdown();
}
if (managementCenterService != null) {
managementCenterService.shutdown();
}
Expand Down
Expand Up @@ -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();
}
94 changes: 49 additions & 45 deletions hazelcast/src/main/java/com/hazelcast/util/PhoneHome.java
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;

Expand All @@ -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.");
Expand All @@ -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.");
}
Expand Down Expand Up @@ -138,52 +140,36 @@ public String convertToLetter(int size) {
return letter;
}

public Map<String, String> 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<String, String> 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())
.addParam("jvmv", System.getProperty("java.version"))
.addParam("jetv", jetBuildInfo == null ? "" : jetBuildInfo.getVersion());
addClientInfo(hazelcastNode, parameterCreator);
addOSInfo(parameterCreator);

boolean isManagementCenterConfigEnabled = hazelcastNode.config.getManagementCenterConfig().isEnabled();
if (isManagementCenterConfigEnabled) {
addManCenterInfo(hazelcastNode, clusterSize, parameterCreator);
Expand All @@ -192,10 +178,25 @@ public Map<String, String> 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) {
Expand Down Expand Up @@ -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<String, String> parameters = new HashMap<String, String>();
private boolean hasParameterBefore;

PhoneHomeParameterCreator() {
public PhoneHomeParameterCreator() {
builder = new StringBuilder();
builder.append("?");
}
Expand All @@ -320,7 +324,7 @@ Map<String, String> getParameters() {
return parameters;
}

PhoneHomeParameterCreator addParam(String key, String value) {
public PhoneHomeParameterCreator addParam(String key, String value) {
if (hasParameterBefore) {
builder.append("&");
} else {
Expand Down
Expand Up @@ -228,4 +228,8 @@ public DynamicConfigListener createDynamicConfigListener() {
@Override
public void registerPlugins(Diagnostics diagnostics) {
}

@Override
public void sendPhoneHome() {
}
}
34 changes: 19 additions & 15 deletions hazelcast/src/test/java/com/hazelcast/util/PhoneHomeTest.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String, String> parameters = phoneHome.phoneHome(node, "test_version", false);
Map<String, String> 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");
Expand Down Expand Up @@ -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<String, String> parameters = phoneHome.phoneHome(node, "test_version", false);
Map<String, String> parameters = phoneHome.phoneHome(node);
assertEquals(parameters.get("mcver"), "MC_NOT_AVAILABLE");
assertEquals(parameters.get("mclicense"), "MC_NOT_AVAILABLE");
}
Expand All @@ -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);
}

Expand All @@ -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);
}

Expand All @@ -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());
Expand All @@ -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));
Expand Down

0 comments on commit b76ef08

Please sign in to comment.