diff --git a/CHANGES.txt b/CHANGES.txt index 152f63056f..d1ed33baee 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 5.1 + * Limit cassandra startup to supported JDKs, allow higher JDKs by setting CASSANDRA_JDK_UNSUPPORTED (CASSANDRA-18688) * Standardize nodetool tablestats formatting of data units (CASSANDRA-19104) * Make nodetool tablestats use number of significant digits for time and average values consistently (CASSANDRA-19015) * Upgrade jackson to 2.15.3 and snakeyaml to 2.1 (CASSANDRA-18875) diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index dfa17643fd..6b347da7a8 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -48,7 +48,7 @@ fi cassandra_storagedir="$CASSANDRA_HOME/data" # JAVA_HOME can optionally be set here -#JAVA_HOME=/usr/local/jdk6 +# JAVA_HOME=/usr/local/jdk11 for jar in "$CASSANDRA_HOME"/lib/*.jar; do CLASSPATH="$CLASSPATH:$jar" @@ -116,19 +116,34 @@ if [ -z $JAVA ] ; then exit 1; fi +# Matches variable 'java.supported' in build.xml +java_versions_supported=11,17 + # Determine the sort of JVM we'll be running on. java_ver_output=`"${JAVA:-java}" -version 2>&1` jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1` JVM_VERSION=${jvmver%_*} short=$(echo "${jvmver}" | cut -c1-2) -JAVA_VERSION=17 -if [ "$short" = "11" ] ; then - JAVA_VERSION=11 -elif [ "$JVM_VERSION" \< "17" ] ; then - echo "Cassandra 5.0 requires Java 11 or Java 17." +# Unsupported JDKs below the upper supported version are not allowed +if [ "$short" != "$(echo "$java_versions_supported" | cut -d, -f1)" ] && [ "$JVM_VERSION" \< "$(echo "$java_versions_supported" | cut -d, -f2)" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" exit 1; fi +# Allow execution of supported Java versions, and newer if CASSANDRA_JDK_UNSUPPORTED is set +is_supported_version=$(echo "$java_versions_supported" | tr "," '\n' | grep -F -x "$short") +if [ -z "$is_supported_version" ] ; then + if [ -z "$CASSANDRA_JDK_UNSUPPORTED" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" + echo "If you would like to test with newer Java versions set CASSANDRA_JDK_UNSUPPORTED to any value (for example, CASSANDRA_JDK_UNSUPPORTED=true). Unset the parameter for default behavior" + exit 1; + else + echo "######################################################################" + echo "Warning! You are using JDK$short. This Cassandra version only supports $java_versions_supported." + echo "######################################################################" + fi +fi +JAVA_VERSION=$short jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` case "$jvm" in diff --git a/debian/patches/cassandra_in.sh_dirs.diff b/debian/patches/cassandra_in.sh_dirs.diff index 6642165beb..2926966c42 100644 --- a/debian/patches/cassandra_in.sh_dirs.diff +++ b/debian/patches/cassandra_in.sh_dirs.diff @@ -33,7 +33,7 @@ +cassandra_storagedir=/var/lib/cassandra # JAVA_HOME can optionally be set here - #JAVA_HOME=/usr/local/jdk6 + #JAVA_HOME=/usr/local/jdk11 @@ -47,6 +47,10 @@ for jar in "$CASSANDRA_HOME"/lib/*.jar; do CLASSPATH="$CLASSPATH:$jar" done @@ -45,3 +45,55 @@ CLASSPATH="$CLASSPATH:$EXTRA_CLASSPATH" # JSR223 - collect all JSR223 engines' jars + # + # Java executable and per-Java version JVM settings + # + + # Use JAVA_HOME if set, otherwise look for java in PATH + if [ -n "$JAVA_HOME" ]; then + # Why we can't have nice things: Solaris combines x86 and x86_64 + # installations in the same tree, using an unconventional path for the + # 64bit JVM. Since we prefer 64bit, search the alternate path first, + # (see https://issues.apache.org/jira/browse/CASSANDRA-4638). + for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do + if [ -x "$java" ]; then + JAVA="$java" + break + fi + done + else + JAVA=`command -v java 2> /dev/null` + fi + + if [ -z $JAVA ] ; then + echo Unable to find java executable. Check JAVA_HOME and PATH environment variables. >&2 + exit 1; + fi + + # Matches variable 'java.supported' in build.xml ++java_versions_supported=11,17 + # Determine the sort of JVM we'll be running on. + java_ver_output=`"${JAVA:-java}" -version 2>&1` + jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1` + JVM_VERSION=${jvmver%_*} + short=$(echo "${jvmver}" | cut -c1-2) + +# Unsupported JDKs below the upper supported version are not allowed ++if [ "$short" != "$(echo "$java_versions_supported" | cut -d, -f1)" ] && [ "$JVM_VERSION" \< "$(echo "$java_versions_supported" | cut -d, -f2)" ] ; then ++ echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" + exit 1; + fi +# Allow execution of supported Java versions, and newer if CASSANDRA_JDK_UNSUPPORTED is set ++is_supported_version=$(echo "$java_versions_supported" | tr "," '\n' | grep -F -x "$short") ++if [ -z "$is_supported_version" ] ; then ++ if [ -z "$CASSANDRA_JDK_UNSUPPORTED" ] ; then ++ echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" ++ echo "If you would like to test with newer Java versions set CASSANDRA_JDK_UNSUPPORTED to any value (for example, CASSANDRA_JDK_UNSUPPORTED=true). Unset the parameter for default behavior" ++ exit 1; ++ else ++ echo "######################################################################" ++ echo "Warning! You are using JDK$short. This Cassandra version only supports $java_versions_supported." ++ echo "######################################################################" ++ fi ++fi ++JAVA_VERSION=$short diff --git a/redhat/cassandra.in.sh b/redhat/cassandra.in.sh index 7f5a374514..9a89bc3564 100644 --- a/redhat/cassandra.in.sh +++ b/redhat/cassandra.in.sh @@ -74,19 +74,34 @@ if [ -z $JAVA ] ; then exit 1; fi +# Matches variable 'java.supported' in build.xml +java_versions_supported=11,17 + # Determine the sort of JVM we'll be running on. java_ver_output=`"${JAVA:-java}" -version 2>&1` jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1` JVM_VERSION=${jvmver%_*} short=$(echo "${jvmver}" | cut -c1-2) -JAVA_VERSION=17 -if [ "$short" = "11" ] ; then - JAVA_VERSION=11 -elif [ "$JVM_VERSION" \< "17" ] ; then - echo "Cassandra 5.0 requires Java 11 or Java 17." +# Unsupported JDKs below the upper supported version are not allowed +if [ "$short" != "$(echo "$java_versions_supported" | cut -d, -f1)" ] && [ "$JVM_VERSION" \< "$(echo "$java_versions_supported" | cut -d, -f2)" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" exit 1; fi +# Allow execution of supported Java versions, and newer if CASSANDRA_JDK_UNSUPPORTED is set +is_supported_version=$(echo "$java_versions_supported" | tr "," '\n' | grep -F -x "$short") +if [ -z "$is_supported_version" ] ; then + if [ -z "$CASSANDRA_JDK_UNSUPPORTED" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" + echo "If you would like to test with newer Java versions set CASSANDRA_JDK_UNSUPPORTED to any value (for example, CASSANDRA_JDK_UNSUPPORTED=true). Unset the parameter for default behavior" + exit 1; + else + echo "######################################################################" + echo "Warning! You are using JDK$short. This Cassandra version only supports $java_versions_supported." + echo "######################################################################" + fi +fi +JAVA_VERSION=$short jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` case "$jvm" in diff --git a/tools/bin/cassandra.in.sh b/tools/bin/cassandra.in.sh index 632fc06a54..50b9a54e61 100644 --- a/tools/bin/cassandra.in.sh +++ b/tools/bin/cassandra.in.sh @@ -41,7 +41,7 @@ fi cassandra_storagedir="$CASSANDRA_HOME/data" # JAVA_HOME can optionally be set here -#JAVA_HOME=/usr/local/jdk6 +#JAVA_HOME=/usr/local/jdk11 for jar in "$CASSANDRA_HOME"/tools/lib/*.jar; do CLASSPATH="$CLASSPATH:$jar" @@ -76,19 +76,36 @@ if [ -z $JAVA ] ; then exit 1; fi +# Matches variable 'java.supported' in build.xml +java_versions_supported=11,17 + # Determine the sort of JVM we'll be running on. java_ver_output=`"${JAVA:-java}" -version 2>&1` jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1` JVM_VERSION=${jvmver%_*} short=$(echo "${jvmver}" | cut -c1-2) -JAVA_VERSION=17 -if [ "$short" = "11" ] ; then - JAVA_VERSION=11 -elif [ "$JVM_VERSION" \< "17" ] ; then - echo "Cassandra 5.0 requires Java 11 or Java 17(or newer)." +# Unsupported JDKs below the upper supported version are not allowed +if [ "$short" != "$(echo "$java_versions_supported" | cut -d, -f1)" ] && [ "$JVM_VERSION" \< "$(echo "$java_versions_supported" | cut -d, -f2)" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" + exit 1; fi +# Allow execution of supported Java versions, and newer if CASSANDRA_JDK_UNSUPPORTED is set +is_supported_version=$(echo "$java_versions_supported" | tr "," '\n' | grep -F -x "$short") +if [ -z "$is_supported_version" ] ; then + if [ -z "$CASSANDRA_JDK_UNSUPPORTED" ] ; then + echo "Unsupported Java $JVM_VERSION. Supported are $java_versions_supported" + echo "If you would like to test with newer Java versions set CASSANDRA_JDK_UNSUPPORTED to any value (for example, CASSANDRA_JDK_UNSUPPORTED=true). Unset the parameter for default behavior" + exit 1; + else + echo "######################################################################" + echo "Warning! You are using JDK$short. This Cassandra version only supports $java_versions_supported." + echo "######################################################################" + fi +fi +JAVA_VERSION=$short + jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` case "$jvm" in OpenJDK)