From 3c8ff45917ac7cb5a154a4c8e4fd298490f466a4 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Tue, 27 Sep 2016 20:13:12 -0400 Subject: [PATCH] Add production warning for pre-release builds This commit adds a usage warning when Elasticsearch is started with a pre-release build. Relates #20674 --- .../main/java/org/elasticsearch/Version.java | 5 +++ .../java/org/elasticsearch/node/Node.java | 20 +++++++++--- .../org/elasticsearch/node/NodeTests.java | 31 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/Version.java b/core/src/main/java/org/elasticsearch/Version.java index 367d3a1d41d..83f706664a5 100644 --- a/core/src/main/java/org/elasticsearch/Version.java +++ b/core/src/main/java/org/elasticsearch/Version.java @@ -352,4 +352,9 @@ public class Version { public boolean isRC() { return build > 50 && build < 99; } + + public boolean isRelease() { + return build == 99; + } + } diff --git a/core/src/main/java/org/elasticsearch/node/Node.java b/core/src/main/java/org/elasticsearch/node/Node.java index 0fc2d98c1b8..2d03a057b58 100644 --- a/core/src/main/java/org/elasticsearch/node/Node.java +++ b/core/src/main/java/org/elasticsearch/node/Node.java @@ -104,9 +104,9 @@ import org.elasticsearch.plugins.ClusterPlugin; import org.elasticsearch.plugins.DiscoveryPlugin; import org.elasticsearch.plugins.IngestPlugin; import org.elasticsearch.plugins.MapperPlugin; +import org.elasticsearch.plugins.MetaDataUpgrader; import org.elasticsearch.plugins.NetworkPlugin; import org.elasticsearch.plugins.Plugin; -import org.elasticsearch.plugins.MetaDataUpgrader; import org.elasticsearch.plugins.PluginsService; import org.elasticsearch.plugins.RepositoryPlugin; import org.elasticsearch.plugins.ScriptPlugin; @@ -255,11 +255,10 @@ public class Node implements Closeable { NODE_NAME_SETTING.get(tmpSettings), NODE_NAME_SETTING.getKey()); } - final String displayVersion = Version.CURRENT + (Build.CURRENT.isSnapshot() ? "-SNAPSHOT" : ""); final JvmInfo jvmInfo = JvmInfo.jvmInfo(); logger.info( "version[{}], pid[{}], build[{}/{}], OS[{}/{}/{}], JVM[{}/{}/{}/{}]", - displayVersion, + displayVersion(Version.CURRENT, Build.CURRENT.isSnapshot()), jvmInfo.pid(), Build.CURRENT.shortHash(), Build.CURRENT.date(), @@ -270,7 +269,7 @@ public class Node implements Closeable { Constants.JVM_NAME, Constants.JAVA_VERSION, Constants.JVM_VERSION); - + warnIfPreRelease(Version.CURRENT, Build.CURRENT.isSnapshot(), logger); if (logger.isDebugEnabled()) { logger.debug("using config [{}], data [{}], logs [{}], plugins [{}]", @@ -445,6 +444,19 @@ public class Node implements Closeable { } } + // visible for testing + static void warnIfPreRelease(final Version version, final boolean isSnapshot, final Logger logger) { + if (!version.isRelease() || isSnapshot) { + logger.warn( + "version [{}] is a pre-release version of Elasticsearch and is not suitable for production", + displayVersion(version, isSnapshot)); + } + } + + private static String displayVersion(final Version version, final boolean isSnapshot) { + return version + (isSnapshot ? "-SNAPSHOT" : ""); + } + protected TransportService newTransportService(Settings settings, Transport transport, ThreadPool threadPool, TransportInterceptor interceptor) { return new TransportService(settings, transport, threadPool, interceptor); diff --git a/test/framework/src/main/java/org/elasticsearch/node/NodeTests.java b/test/framework/src/main/java/org/elasticsearch/node/NodeTests.java index db8b6825ec8..cf565499a8d 100644 --- a/test/framework/src/main/java/org/elasticsearch/node/NodeTests.java +++ b/test/framework/src/main/java/org/elasticsearch/node/NodeTests.java @@ -18,6 +18,8 @@ */ package org.elasticsearch.node; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.Version; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.common.network.NetworkModule; import org.elasticsearch.common.settings.Settings; @@ -30,6 +32,10 @@ import java.nio.file.Path; import java.util.Collections; import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; public class NodeTests extends ESTestCase { @@ -55,4 +61,29 @@ public class NodeTests extends ESTestCase { } } } + + public void testWarnIfPreRelease() { + final Logger logger = mock(Logger.class); + + final int id = randomIntBetween(1, 9) * 1000000; + final Version releaseVersion = Version.fromId(id + 99); + final Version preReleaseVersion = Version.fromId(id + randomIntBetween(0, 98)); + + Node.warnIfPreRelease(releaseVersion, false, logger); + verifyNoMoreInteractions(logger); + + reset(logger); + Node.warnIfPreRelease(releaseVersion, true, logger); + verify(logger).warn( + "version [{}] is a pre-release version of Elasticsearch and is not suitable for production", releaseVersion + "-SNAPSHOT"); + + reset(logger); + final boolean isSnapshot = randomBoolean(); + Node.warnIfPreRelease(preReleaseVersion, isSnapshot, logger); + verify(logger).warn( + "version [{}] is a pre-release version of Elasticsearch and is not suitable for production", + preReleaseVersion + (isSnapshot ? "-SNAPSHOT" : "")); + + } + }