diff --git a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java index 2157729c7e0..6985516f84b 100644 --- a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java +++ b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java @@ -44,7 +44,7 @@ import org.apache.commons.exec.Executor; import org.apache.commons.exec.LogOutputStream; import org.apache.commons.exec.PumpStreamHandler; -import org.apache.commons.exec.environment.EnvironmentUtils; +import org.assertj.core.util.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -268,8 +268,11 @@ public void reloadCore(int node, String keyspace, String table, boolean reindex) public void start() { if (started.compareAndSet(false, true)) { + List cmdAndArgs = Lists.newArrayList("start", jvmArgs, "--wait-for-binary-proto"); + overrideJvmVersionForDseWorkloads() + .ifPresent(jvmVersion -> cmdAndArgs.add(String.format("--jvm_version=%d", jvmVersion))); try { - execute("start", jvmArgs, "--wait-for-binary-proto"); + execute(cmdAndArgs.toArray(new String[0])); } catch (RuntimeException re) { // if something went wrong starting CCM, see if we can also dump the error executeCheckLogError(); @@ -297,7 +300,10 @@ public void resume(int n) { } public void start(int n) { - execute("node" + n, "start"); + List cmdAndArgs = Lists.newArrayList("node" + n, "start"); + overrideJvmVersionForDseWorkloads() + .ifPresent(jvmVersion -> cmdAndArgs.add(String.format("--jvm_version=%d", jvmVersion))); + execute(cmdAndArgs.toArray(new String[0])); } public void stop(int n) { @@ -379,21 +385,7 @@ protected void processLine(String line, int logLevel) { executor.setStreamHandler(streamHandler); executor.setWatchdog(watchDog); - // under java11+, ccm selects wrong java version for dse - // force it to use java8 by mapping JAVA8_HOME to JAVA_HOME - Map ccmEnv = null; - String javaVersion = System.getProperty("java.version"); - if (DSE_ENABLEMENT && !javaVersion.startsWith("1.8")) { - String java8Home = System.getenv("JAVA8_HOME"); - if (java8Home != null && !java8Home.isEmpty()) { - ccmEnv = EnvironmentUtils.getProcEnvironment(); - ccmEnv.put("JAVA_HOME", java8Home); - LOG.debug("Setting JAVA_HOME for ccm to " + java8Home); - } else { - LOG.warn("Dse is enabled but you are not running java8, consider setting JAVA8_HOME"); - } - } - int retValue = executor.execute(cli, ccmEnv); + int retValue = executor.execute(cli); if (retValue != 0) { LOG.error("Non-zero exit code ({}) returned from executing ccm command: {}", retValue, cli); } @@ -431,6 +423,44 @@ private static File createTempStore(String storePath) { return f; } + /** + * Get the current JVM major version (1.8.0_372 -> 8, 11.0.19 -> 11) + * + * @return major version of current JVM + */ + private static int getCurrentJvmMajorVersion() { + String version = System.getProperty("java.version"); + if (version.startsWith("1.")) { + version = version.substring(2, 3); + } else { + int dot = version.indexOf("."); + if (dot != -1) { + version = version.substring(0, dot); + } + } + return Integer.parseInt(version); + } + + private Optional overrideJvmVersionForDseWorkloads() { + if (getCurrentJvmMajorVersion() <= 8) { + return Optional.empty(); + } + + if (!DSE_ENABLEMENT || !getDseVersion().isPresent()) { + return Optional.empty(); + } + + if (getDseVersion().get().compareTo(Version.parse("6.8.19")) < 0) { + return Optional.empty(); + } + + if (dseWorkloads.contains("graph")) { + return Optional.of(8); + } + + return Optional.empty(); + } + public static Builder builder() { return new Builder(); }