From c7fd24ca1569a809b499caf34077599e463bb8d6 Mon Sep 17 00:00:00 2001 From: Henning Andersen <33268011+henningandersen@users.noreply.github.com> Date: Mon, 6 Jan 2020 12:18:12 +0100 Subject: [PATCH] Workaround for JDK 14 EA FileChannel.map issue (#50523) FileChannel.map provokes static initialization of ExtendedMapMode in JDK14 EA, which needs elevated privileges. Relates #50512 --- .../elasticsearch/bootstrap/Bootstrap.java | 24 +++++++++++++++++-- .../bootstrap/BootstrapForTesting.java | 2 ++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java b/server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java index f59f082596d7b..2c3184ed9812b 100644 --- a/server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java +++ b/server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java @@ -19,14 +19,13 @@ package org.elasticsearch.bootstrap; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.appender.ConsoleAppender; import org.apache.logging.log4j.core.config.Configurator; import org.apache.lucene.util.Constants; -import org.elasticsearch.core.internal.io.IOUtils; import org.apache.lucene.util.StringHelper; import org.elasticsearch.ElasticsearchException; import org.elasticsearch.Version; @@ -41,6 +40,7 @@ import org.elasticsearch.common.settings.SecureSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.BoundTransportAddress; +import org.elasticsearch.core.internal.io.IOUtils; import org.elasticsearch.env.Environment; import org.elasticsearch.monitor.jvm.JvmInfo; import org.elasticsearch.monitor.os.OsProbe; @@ -158,6 +158,24 @@ static void initializeProbes() { JvmInfo.jvmInfo(); } + /** + * JDK 14 bug: + * https://github.com/elastic/elasticsearch/issues/50512 + * We circumvent it here by loading the offending class before installing security manager. + * + * To be removed once the JDK is fixed. + */ + static void fixJDK14EAFileChannelMap() { + // minor time-bomb here to ensure that we reevaluate if final 14 version does not include fix. + if (System.getProperty("java.version").equals("14-ea")) { + try { + Class.forName("jdk.internal.misc.ExtendedMapMode", true, Bootstrap.class.getClassLoader()); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Unable to lookup ExtendedMapMode class", e); + } + } + } + private void setup(boolean addShutdownHook, Environment environment) throws BootstrapException { Settings settings = environment.settings(); @@ -209,6 +227,8 @@ public void run() { // Log ifconfig output before SecurityManager is installed IfConfig.logIfNecessary(); + fixJDK14EAFileChannelMap(); + // install SM after natives, shutdown hooks, etc. try { Security.configure(environment, BootstrapSettings.SECURITY_FILTER_BAD_DEFAULTS_SETTING.get(settings)); diff --git a/test/framework/src/main/java/org/elasticsearch/bootstrap/BootstrapForTesting.java b/test/framework/src/main/java/org/elasticsearch/bootstrap/BootstrapForTesting.java index e035b779b3f02..c67eea7524951 100644 --- a/test/framework/src/main/java/org/elasticsearch/bootstrap/BootstrapForTesting.java +++ b/test/framework/src/main/java/org/elasticsearch/bootstrap/BootstrapForTesting.java @@ -102,6 +102,8 @@ public class BootstrapForTesting { // Log ifconfig output before SecurityManager is installed IfConfig.logIfNecessary(); + Bootstrap.fixJDK14EAFileChannelMap(); + // install security manager if requested if (systemPropertyAsBoolean("tests.security.manager", true)) { try {