瀏覽代碼

Add production warning for pre-release builds

This commit adds a usage warning when Elasticsearch is started with a
pre-release build.

Relates #20674
Jason Tedor 9 年之前
父節點
當前提交
3c8ff45917

+ 5 - 0
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;
+    }
+
 }

+ 16 - 4
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);

+ 31 - 0
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" : ""));
+
+    }
+
 }