diff --git a/.circleci/config.yml b/.circleci/config.yml index 5a84f724fc..edf7dd5e50 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -65,9 +65,9 @@ env_vars: &env_vars #<<: *high_capacity_env_vars workflows: version: 2 - build_and_run_tests: *default_jobs + #build_and_run_tests: *default_jobs #build_and_run_tests: *with_dtest_jobs_only - #build_and_run_tests: *with_dtest_jobs + build_and_run_tests: *with_dtest_jobs docker_image: &docker_image kjellman/cassandra-test:0.4.3 version: 2 jobs: diff --git a/.gitignore b/.gitignore index 76c4bd10ca..71b30875d6 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,5 @@ lib/jsr223/scala/*.jar # Generated files from the documentation doc/source/configuration/cassandra_config_file.rst doc/source/tools/nodetool + +audit diff --git a/CHANGES.txt b/CHANGES.txt index 4ba3313a12..6b6418c4cb 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 4.0 + * Add experimental support for Java 11 (CASSANDRA-9608) * Make PeriodicCommitLogService.blockWhenSyncLagsNanos configurable (CASSANDRA-14580) * Improve logging in MessageInHandler's constructor (CASSANDRA-14576) * Set broadcast address in internode messaging handshake (CASSANDRA-14579) diff --git a/NEWS.txt b/NEWS.txt index da94422bf2..75885e970e 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -38,6 +38,11 @@ using the provided 'sstableupgrade' tool. New features ------------ + - *Experimental* support for Java 11 has been added. JVM options that differ between or are + specific for Java 8 and 11 have been moved from jvm.options into jvm8.options and jvm11.options. + IMPORTANT: Running C* on Java 11 is *experimental* and do it at your own risk. + Compilation recommendations: configure Java 11 SDK via JAVA_HOME and Java 8 SDK via JAVA8_HOME. + Release builds require Java 11 + Java 8. Development builds can use Java 8 without 11. - LCS now respects the max_threshold parameter when compacting - this was hard coded to 32 before, but now it is possible to do bigger compactions when compacting from L0 to L1. This also applies to STCS-compactions in L0 - if there are more than 32 sstables in L0 diff --git a/bin/cassandra b/bin/cassandra index 006c6aee92..f5ac0593bd 100755 --- a/bin/cassandra +++ b/bin/cassandra @@ -66,6 +66,9 @@ # POSIX sh and Solaris sh. This means, in particular, no $(( )) and no $( ). # If an include wasn't specified in the environment, then search for one... + +jvmoptions_variant="-server" + if [ "x$CASSANDRA_INCLUDE" = "x" ]; then # Locations (in order) to use when searching for an include file. for include in "`dirname "$0"`/cassandra.in.sh" \ @@ -83,27 +86,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# 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=java -fi - -if [ -z $JAVA ] ; then - echo Unable to find java executable. Check JAVA_HOME and PATH environment variables. >&2 - exit 1; -fi - # If numactl is available, use it. For Cassandra, the priority is to # avoid disk I/O. Even for the purpose of CPU efficiency, we don't # really have CPU<->data affinity anyway. Also, empirically test that numactl diff --git a/bin/cassandra.bat b/bin/cassandra.bat index a653142d39..24889d8a27 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -54,7 +54,7 @@ if NOT DEFINED JAVA_HOME goto :err REM ----------------------------------------------------------------------------- REM JVM Opts we'll use in legacy run or installation set JAVA_OPTS=-ea^ - -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^ + -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.2"^ -Xms2G^ -Xmx2G^ -XX:+HeapDumpOnOutOfMemoryError^ diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index 228cef71c0..1de93602af 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -23,11 +23,18 @@ if [ "x$CASSANDRA_CONF" = "x" ]; then CASSANDRA_CONF="$CASSANDRA_HOME/conf" fi +# The java classpath (required) +CLASSPATH="$CASSANDRA_CONF" + # This can be the path to a jar file, or a directory containing the # compiled classes. NOTE: This isn't needed by the startup script, # it's just used here in constructing the classpath. -cassandra_bin="$CASSANDRA_HOME/build/classes/main" -#cassandra_bin="$CASSANDRA_HOME/build/cassandra.jar" +if [ -d $CASSANDRA_HOME/build ] ; then + #cassandra_bin="$CASSANDRA_HOME/build/classes/main" + cassandra_bin=`ls -1 $CASSANDRA_HOME/build/apache-cassandra*.jar` + + CLASSPATH="$CLASSPATH:$cassandra_bin" +fi # the default location for commitlogs, sstables, and saved caches # if not set in cassandra.yaml @@ -36,9 +43,6 @@ cassandra_storagedir="$CASSANDRA_HOME/data" # JAVA_HOME can optionally be set here #JAVA_HOME=/usr/local/jdk6 -# The java classpath (required) -CLASSPATH="$CASSANDRA_CONF:$cassandra_bin" - for jar in "$CASSANDRA_HOME"/lib/*.jar; do CLASSPATH="$CLASSPATH:$jar" done @@ -65,11 +69,87 @@ if [ -f "$CASSANDRA_HOME"/lib/jsr223/scala/scala-compiler.jar ] ; then fi # set JVM javaagent opts to avoid warnings/errors -if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ - || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] -then - JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" -fi +JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.2.jar" # Added sigar-bin to the java.library.path CASSANDRA-7838 JAVA_OPTS="$JAVA_OPTS:-Djava.library.path=$CASSANDRA_HOME/lib/sigar-bin" + + +# +# 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=java +fi + +if [ -z $JAVA ] ; then + echo Unable to find java executable. Check JAVA_HOME and PATH environment variables. >&2 + exit 1; +fi + +# 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%_*} + +JAVA_VERSION=11 +if [ "$JVM_VERSION" = "1.8.0" ] ; then + JVM_PATCH_VERSION=${jvmver#*_} + if [ "$JVM_VERSION" \< "1.8" ] || [ "$JVM_VERSION" \> "1.8.2" ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer). Java $JVM_VERSION is not supported." + exit 1; + fi + if [ "$JVM_PATCH_VERSION" -lt 151 ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer). Java 8 update $JVM_PATCH_VERSION is not supported." + exit 1; + fi + JAVA_VERSION=8 +elif [ "$JVM_VERSION" \< "11" ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer)." + exit 1; +fi + +jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` +case "$jvm" in + OpenJDK) + JVM_VENDOR=OpenJDK + # this will be "64-Bit" or "32-Bit" + JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'` + ;; + "Java(TM)") + JVM_VENDOR=Oracle + # this will be "64-Bit" or "32-Bit" + JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'` + ;; + *) + # Help fill in other JVM values + JVM_VENDOR=other + JVM_ARCH=unknown + ;; +esac + +# Read user-defined JVM options from jvm-server.options file +JVM_OPTS_FILE=$CASSANDRA_CONF/jvm${jvmoptions_variant:--clients}.options +if [ $JAVA_VERSION -ge 11 ] ; then + JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm11${jvmoptions_variant:--clients}.options +else + JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm8${jvmoptions_variant:--clients}.options +fi + +for opt in `grep "^-" $JVM_OPTS_FILE` `grep "^-" $JVM_DEP_OPTS_FILE` +do + JVM_OPTS="$JVM_OPTS $opt" +done diff --git a/bin/debug-cql b/bin/debug-cql index 00d4093b04..c184df9dd3 100755 --- a/bin/debug-cql +++ b/bin/debug-cql @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -n "$JAVA_HOME" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA=java -fi - -if [ -z "$CASSANDRA_CONF" -o -z "$CLASSPATH" ]; then - echo "You must set the CASSANDRA_CONF and CLASSPATH vars" >&2 - exit 1 -fi - if [ -f "$CASSANDRA_CONF/cassandra-env.sh" ]; then . "$CASSANDRA_CONF/cassandra-env.sh" fi diff --git a/bin/fqltool b/bin/fqltool index 8a05af1a36..15a0b200ad 100755 --- a/bin/fqltool +++ b/bin/fqltool @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CASSANDRA_CONF" -o -z "$CLASSPATH" ]; then echo "You must set the CASSANDRA_CONF and CLASSPATH vars" >&2 exit 1 diff --git a/bin/nodetool b/bin/nodetool index 6456b19b81..3104582f2d 100755 --- a/bin/nodetool +++ b/bin/nodetool @@ -38,18 +38,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CASSANDRA_CONF" -o -z "$CLASSPATH" ]; then echo "You must set the CASSANDRA_CONF and CLASSPATH vars" >&2 exit 1 @@ -61,7 +49,7 @@ if [ -f "$CASSANDRA_CONF/cassandra-env.sh" ]; then MAX_HEAP_SIZE_SAVE=$MAX_HEAP_SIZE . "$CASSANDRA_CONF/cassandra-env.sh" MAX_HEAP_SIZE=$MAX_HEAP_SIZE_SAVE - JVM_OPTS=$JVM_OPTS_SAVE + JVM_OPTS="$JVM_OPTS_SAVE" fi # JMX Port passed via cmd line args (-p 9999 / --port 9999 / --port=9999) diff --git a/bin/sstableloader b/bin/sstableloader index 03ab4f96f1..9045adfda3 100755 --- a/bin/sstableloader +++ b/bin/sstableloader @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CLASSPATH" ]; then echo "You must set the CLASSPATH var" >&2 exit 1 diff --git a/bin/sstablescrub b/bin/sstablescrub index 366a2b7e3a..9adda77789 100755 --- a/bin/sstablescrub +++ b/bin/sstablescrub @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CLASSPATH" ]; then echo "You must set the CLASSPATH var" >&2 exit 1 diff --git a/bin/sstableupgrade b/bin/sstableupgrade index 7b307eb8e6..c48faf07ab 100755 --- a/bin/sstableupgrade +++ b/bin/sstableupgrade @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CLASSPATH" ]; then echo "You must set the CLASSPATH var" >&2 exit 1 diff --git a/bin/sstableutil b/bin/sstableutil index 7457834e8a..5d0bf1f459 100755 --- a/bin/sstableutil +++ b/bin/sstableutil @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CLASSPATH" ]; then echo "You must set the CLASSPATH var" >&2 exit 1 diff --git a/bin/sstableverify b/bin/sstableverify index 6b296cfa04..ff812b9197 100755 --- a/bin/sstableverify +++ b/bin/sstableverify @@ -32,18 +32,6 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then . "$CASSANDRA_INCLUDE" fi -# Use JAVA_HOME if set, otherwise look for java in PATH -if [ -x "$JAVA_HOME/bin/java" ]; then - JAVA="$JAVA_HOME/bin/java" -else - JAVA="`which java`" -fi - -if [ "x$JAVA" = "x" ]; then - echo "Java executable not found (hint: set JAVA_HOME)" >&2 - exit 1 -fi - if [ -z "$CLASSPATH" ]; then echo "You must set the CLASSPATH var" >&2 exit 1 diff --git a/build.xml b/build.xml index c3710e6b12..903e1ec0e8 100644 --- a/build.xml +++ b/build.xml @@ -35,7 +35,8 @@ - + + @@ -66,8 +67,14 @@ - - + + + + @@ -110,16 +117,18 @@ - + + + + + - - - - - - - - + + + + + + @@ -151,6 +160,24 @@ } + + + + + + + + + + + @@ -168,6 +195,19 @@ + + + + + + + + + + + + + @@ -189,7 +229,7 @@ - + @@ -390,7 +430,7 @@ - + @@ -398,15 +438,15 @@ - - - - - + + + + + - + @@ -419,7 +459,6 @@ - @@ -446,14 +485,14 @@ --> - - + + - + - + @@ -462,7 +501,9 @@ - + + + @@ -521,8 +562,8 @@ - - + + @@ -552,7 +593,7 @@ - + + + + + + + + @@ -737,16 +786,17 @@ - - + - + + @@ -757,25 +807,63 @@ depends="maven-ant-tasks-retrieve-build,build-project" description="Compile Cassandra classes"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + - + @@ -790,10 +878,8 @@ + source="${source.version}" target="${target.version}" + includeantruntime="false" encoding="utf-8"> @@ -804,7 +890,9 @@ - + @@ -838,8 +926,8 @@ - + - - + + @@ -884,6 +974,9 @@ + + + @@ -905,6 +998,9 @@ + + + @@ -913,6 +1009,7 @@ @@ -1058,7 +1155,7 @@ - + @@ -1081,7 +1178,7 @@ - + - + @@ -1151,6 +1248,7 @@ + + - + @@ -1708,6 +1806,7 @@ + Apache Cassandra ${eclipse.project.name} @@ -1808,7 +1907,8 @@ - + + diff --git a/conf/cassandra-env.ps1 b/conf/cassandra-env.ps1 index f17d2654ab..8ba8a5a472 100644 --- a/conf/cassandra-env.ps1 +++ b/conf/cassandra-env.ps1 @@ -380,11 +380,7 @@ Function SetCassandraEnvironment $env:JVM_OPTS = "$env:JVM_OPTS -XX:CompileCommandFile=""$env:CASSANDRA_CONF\hotspot_compiler""" # add the jamm javaagent - if (($env:JVM_VENDOR -ne "OpenJDK") -or ($env:JVM_VERSION.CompareTo("1.6.0") -eq 1) -or - (($env:JVM_VERSION -eq "1.6.0") -and ($env:JVM_PATCH_VERSION.CompareTo("22") -eq 1))) - { - $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.3.0.jar""" - } + $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.3.2.jar""" # set jvm HeapDumpPath with CASSANDRA_HEAPDUMP_DIR if ($env:CASSANDRA_HEAPDUMP_DIR) @@ -403,9 +399,10 @@ Function SetCassandraEnvironment # print an heap histogram on OutOfMemoryError # $env:JVM_OPTS="$env:JVM_OPTS -Dcassandra.printHeapHistogramOnOutOfMemoryError=true" - if ($env:JVM_VERSION.CompareTo("1.8.0") -eq -1 -or [convert]::ToInt32($env:JVM_PATCH_VERSION) -lt 40) + $env:JAVA_VERSION=11 + if ($env:JVM_VERSION.CompareTo("1.8.0") -eq -1 -or [convert]::ToInt32($env:JVM_PATCH_VERSION) -lt 151) { - echo "Cassandra 3.0 and later require Java 8u40 or later." + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer). Java $env:JVM_VERSION is not supported." exit } diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index 3ccb1e16af..dc304374d6 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -86,55 +86,27 @@ calculate_heap_sizes() fi } -# 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%_*} -JVM_PATCH_VERSION=${jvmver#*_} - -if [ "$JVM_VERSION" \< "1.8" ] ; then - echo "Cassandra 3.0 and later require Java 8u40 or later." - exit 1; -fi - -if [ "$JVM_VERSION" \< "1.8" ] && [ "$JVM_PATCH_VERSION" -lt 40 ] ; then - echo "Cassandra 3.0 and later require Java 8u40 or later." - exit 1; -fi - -jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` -case "$jvm" in - OpenJDK) - JVM_VENDOR=OpenJDK - # this will be "64-Bit" or "32-Bit" - JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'` - ;; - "Java(TM)") - JVM_VENDOR=Oracle - # this will be "64-Bit" or "32-Bit" - JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'` - ;; - *) - # Help fill in other JVM values - JVM_VENDOR=other - JVM_ARCH=unknown - ;; -esac - #GC log path has to be defined here because it needs to access CASSANDRA_HOME -JVM_OPTS="$JVM_OPTS -Xloggc:${CASSANDRA_HOME}/logs/gc.log" +if [ $JAVA_VERSION -ge 11 ] ; then + # See description of https://bugs.openjdk.java.net/browse/JDK-8046148 for details about the syntax + # The following is the equivalent to -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M + echo "$JVM_OPTS" | grep -q "^-[X]log:gc" + if [ "$?" = "1" ] ; then # [X] to prevent ccm from replacing this line + # only add -Xlog:gc if it's not mentioned in jvm-server.options file + mkdir -p ${CASSANDRA_HOME}/logs + JVM_OPTS="$JVM_OPTS -Xlog:gc=info,heap*=trace,age*=debug,safepoint=info,promotion*=trace:file=${CASSANDRA_HOME}/logs/gc.log:time,uptime,pid,tid,level:filecount=10,filesize=10485760" + fi +else + # Java 8 + echo "$JVM_OPTS" | grep -q "^-[X]loggc" + if [ "$?" = "1" ] ; then # [X] to prevent ccm from replacing this line + # only add -Xlog:gc if it's not mentioned in jvm-server.options file + mkdir -p ${CASSANDRA_HOME}/logs + JVM_OPTS="$JVM_OPTS -Xloggc:${CASSANDRA_HOME}/logs/gc.log" + fi +fi -# Here we create the arguments that will get passed to the jvm when -# starting cassandra. - -# Read user-defined JVM options from jvm.options file -JVM_OPTS_FILE=$CASSANDRA_CONF/jvm.options -for opt in `grep "^-" $JVM_OPTS_FILE` -do - JVM_OPTS="$JVM_OPTS $opt" -done - -# Check what parameters were defined on jvm.options file to avoid conflicts +# Check what parameters were defined on jvm-server.options file to avoid conflicts echo $JVM_OPTS | grep -q Xmn DEFINED_XMN=$? echo $JVM_OPTS | grep -q Xmx @@ -179,21 +151,21 @@ if [ "x$MALLOC_ARENA_MAX" = "x" ] ; then export MALLOC_ARENA_MAX=4 fi -# We only set -Xms and -Xmx if they were not defined on jvm.options file +# We only set -Xms and -Xmx if they were not defined on jvm-server.options file # If defined, both Xmx and Xms should be defined together. if [ $DEFINED_XMX -ne 0 ] && [ $DEFINED_XMS -ne 0 ]; then JVM_OPTS="$JVM_OPTS -Xms${MAX_HEAP_SIZE}" JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}" elif [ $DEFINED_XMX -ne 0 ] || [ $DEFINED_XMS -ne 0 ]; then - echo "Please set or unset -Xmx and -Xms flags in pairs on jvm.options file." + echo "Please set or unset -Xmx and -Xms flags in pairs on jvm-server.options file." exit 1 fi -# We only set -Xmn flag if it was not defined in jvm.options file +# We only set -Xmn flag if it was not defined in jvm-server.options file # and if the CMS GC is being used # If defined, both Xmn and Xmx should be defined together. if [ $DEFINED_XMN -eq 0 ] && [ $DEFINED_XMX -ne 0 ]; then - echo "Please set or unset -Xmx and -Xmn flags in pairs on jvm.options file." + echo "Please set or unset -Xmx and -Xmn flags in pairs on jvm-server.options file." exit 1 elif [ $DEFINED_XMN -ne 0 ] && [ $USING_CMS -eq 0 ]; then JVM_OPTS="$JVM_OPTS -Xmn${HEAP_NEWSIZE}" @@ -207,7 +179,7 @@ fi JVM_OPTS="$JVM_OPTS -XX:CompileCommandFile=$CASSANDRA_CONF/hotspot_compiler" # add the jamm javaagent -JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" +JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.2.jar" # set jvm HeapDumpPath with CASSANDRA_HEAPDUMP_DIR if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then diff --git a/conf/jvm-clients.options b/conf/jvm-clients.options new file mode 100644 index 0000000000..6181ed0ddb --- /dev/null +++ b/conf/jvm-clients.options @@ -0,0 +1,10 @@ +########################################################################### +# jvm-clients.options # +# # +# See jvm8-clients.options and jvm11-clients.options for Java version # +# specific options. # +########################################################################### + +# intentionally left empty + +# The newline in the end of file is intentional diff --git a/conf/jvm.options b/conf/jvm-server.options similarity index 77% rename from conf/jvm.options rename to conf/jvm-server.options index ac9834fdcc..c52e19236d 100644 --- a/conf/jvm.options +++ b/conf/jvm-server.options @@ -1,11 +1,14 @@ ########################################################################### -# jvm.options # +# jvm-server.options # # # # - all flags defined here will be used by cassandra to startup the JVM # # - one flag should be specified per line # # - lines that do not start with '-' will be ignored # # - only static flags are accepted (no variables or parameters) # # - dynamic flags will be appended to these on cassandra-env # +# # +# See jvm8-server.options and jvm11-server.options for Java version # +# specific options. # ########################################################################### ###################### @@ -94,11 +97,6 @@ # a lower priority to avoid interfering with client workload -XX:+UseThreadPriorities -# allows lowering thread priority without being root on linux - probably -# not necessary on Windows but doesn't harm anything. -# see http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html --XX:ThreadPriorityPolicy=42 - # Enable heap-dump if there's an OOM -XX:+HeapDumpOnOutOfMemoryError @@ -191,64 +189,3 @@ # * CAP_NOWARN: same as previous, except that the client warning will not be emitted. # #-Dcassandra.expiration_date_overflow_policy=REJECT - -################# -# GC SETTINGS # -################# - -### CMS Settings - --XX:+UseParNewGC --XX:+UseConcMarkSweepGC --XX:+CMSParallelRemarkEnabled --XX:SurvivorRatio=8 --XX:MaxTenuringThreshold=1 --XX:CMSInitiatingOccupancyFraction=75 --XX:+UseCMSInitiatingOccupancyOnly --XX:CMSWaitDuration=10000 --XX:+CMSParallelInitialMarkEnabled --XX:+CMSEdenChunksRecordAlways -# some JVMs will fill up their heap when accessed via JMX, see CASSANDRA-6541 --XX:+CMSClassUnloadingEnabled - -### G1 Settings (experimental, comment previous section and uncomment section below to enable) - -## Use the Hotspot garbage-first collector. -#-XX:+UseG1GC -# -## Have the JVM do less remembered set work during STW, instead -## preferring concurrent GC. Reduces p99.9 latency. -#-XX:G1RSetUpdatingPauseTimePercent=5 -# -## Main G1GC tunable: lowering the pause target will lower throughput and vise versa. -## 200ms is the JVM default and lowest viable setting -## 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml. -#-XX:MaxGCPauseMillis=500 - -## Optional G1 Settings - -# Save CPU time on large (>= 16GB) heaps by delaying region scanning -# until the heap is 70% full. The default in Hotspot 8u40 is 40%. -#-XX:InitiatingHeapOccupancyPercent=70 - -# For systems with > 8 cores, the default ParallelGCThreads is 5/8 the number of logical cores. -# Otherwise equal to the number of cores when 8 or less. -# Machines with > 10 cores should try setting these to <= full cores. -#-XX:ParallelGCThreads=16 -# By default, ConcGCThreads is 1/4 of ParallelGCThreads. -# Setting both to the same value can reduce STW durations. -#-XX:ConcGCThreads=16 - -### GC logging options -- uncomment to enable - --XX:+PrintGCDetails --XX:+PrintGCDateStamps --XX:+PrintHeapAtGC --XX:+PrintTenuringDistribution --XX:+PrintGCApplicationStoppedTime --XX:+PrintPromotionFailure -#-XX:PrintFLSStatistics=1 -#-Xloggc:/var/log/cassandra/gc.log --XX:+UseGCLogFileRotation --XX:NumberOfGCLogFiles=10 --XX:GCLogFileSize=10M diff --git a/conf/jvm11-clients.options b/conf/jvm11-clients.options new file mode 100644 index 0000000000..54465dba25 --- /dev/null +++ b/conf/jvm11-clients.options @@ -0,0 +1,21 @@ +########################################################################### +# jvm11-clients.options # +# # +# See jvm-clients.options. This file is specific for Java 11 and newer. # +########################################################################### + +################### +# JPMS SETTINGS # +################### + +-Djdk.attach.allowAttachSelf=true +--add-exports java.base/jdk.internal.misc=ALL-UNNAMED +--add-opens java.base/jdk.internal.module=ALL-UNNAMED +--add-exports java.base/jdk.internal.ref=ALL-UNNAMED +--add-exports java.base/sun.nio.ch=ALL-UNNAMED +--add-exports java.management.rmi/com.sun.jmx.remote.internal.rmi=ALL-UNNAMED +--add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED +--add-exports java.rmi/sun.rmi.server=ALL-UNNAMED +--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED + +# The newline in the end of file is intentional diff --git a/conf/jvm11-server.options b/conf/jvm11-server.options new file mode 100644 index 0000000000..08a7f2ef18 --- /dev/null +++ b/conf/jvm11-server.options @@ -0,0 +1,89 @@ +########################################################################### +# jvm11-server.options # +# # +# See jvm-server.options. This file is specific for Java 11 and newer. # +########################################################################### + +################# +# GC SETTINGS # +################# + + + +### CMS Settings +#-XX:+UseParNewGC +#-XX:+UseConcMarkSweepGC +#-XX:+CMSParallelRemarkEnabled +#-XX:SurvivorRatio=8 +#-XX:MaxTenuringThreshold=1 +#-XX:CMSInitiatingOccupancyFraction=75 +#-XX:+UseCMSInitiatingOccupancyOnly +#-XX:CMSWaitDuration=10000 +#-XX:+CMSParallelInitialMarkEnabled +#-XX:+CMSEdenChunksRecordAlways +## some JVMs will fill up their heap when accessed via JMX, see CASSANDRA-6541 +#-XX:+CMSClassUnloadingEnabled + + + +### G1 Settings +## Use the Hotspot garbage-first collector. +-XX:+UseG1GC +-XX:+ParallelRefProcEnabled + +# +## Have the JVM do less remembered set work during STW, instead +## preferring concurrent GC. Reduces p99.9 latency. +-XX:G1RSetUpdatingPauseTimePercent=5 +# +## Main G1GC tunable: lowering the pause target will lower throughput and vise versa. +## 200ms is the JVM default and lowest viable setting +## 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml. +-XX:MaxGCPauseMillis=500 + +## Optional G1 Settings +# Save CPU time on large (>= 16GB) heaps by delaying region scanning +# until the heap is 70% full. The default in Hotspot 8u40 is 40%. +#-XX:InitiatingHeapOccupancyPercent=70 + +# For systems with > 8 cores, the default ParallelGCThreads is 5/8 the number of logical cores. +# Otherwise equal to the number of cores when 8 or less. +# Machines with > 10 cores should try setting these to <= full cores. +#-XX:ParallelGCThreads=16 +# By default, ConcGCThreads is 1/4 of ParallelGCThreads. +# Setting both to the same value can reduce STW durations. +#-XX:ConcGCThreads=16 + + +### JPMS + +-Djdk.attach.allowAttachSelf=true +--add-exports java.base/jdk.internal.misc=ALL-UNNAMED +--add-opens java.base/jdk.internal.module=ALL-UNNAMED +--add-exports java.base/jdk.internal.ref=ALL-UNNAMED +--add-exports java.base/sun.nio.ch=ALL-UNNAMED +--add-exports java.management.rmi/com.sun.jmx.remote.internal.rmi=ALL-UNNAMED +--add-exports java.rmi/sun.rmi.registry=ALL-UNNAMED +--add-exports java.rmi/sun.rmi.server=ALL-UNNAMED +--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED + + +### GC logging options -- uncomment to enable + +# Java 11 (and newer) GC logging options: +# See description of https://bugs.openjdk.java.net/browse/JDK-8046148 for details about the syntax +# The following is the equivalent to -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M +#-Xlog:gc=info,heap*=trace,age*=debug,safepoint=info,promotion*=trace:file=/var/log/cassandra/gc.log:time,uptime,pid,tid,level:filecount=10,filesize=10485760 + +# Notes for Java 8 migration: +# +# -XX:+PrintGCDetails maps to -Xlog:gc*:... - i.e. add a '*' after "gc" +# -XX:+PrintGCDateStamps maps to decorator 'time' +# +# -XX:+PrintHeapAtGC maps to 'heap' with level 'trace' +# -XX:+PrintTenuringDistribution maps to 'age' with level 'debug' +# -XX:+PrintGCApplicationStoppedTime maps to 'safepoint' with level 'info' +# -XX:+PrintPromotionFailure maps to 'promotion' with level 'trace' +# -XX:PrintFLSStatistics=1 maps to 'freelist' with level 'trace' + +# The newline in the end of file is intentional diff --git a/conf/jvm8-clients.options b/conf/jvm8-clients.options new file mode 100644 index 0000000000..7d1b2ef9aa --- /dev/null +++ b/conf/jvm8-clients.options @@ -0,0 +1,9 @@ +########################################################################### +# jvm8-clients.options # +# # +# See jvm-clients.options. This file is specific for Java 8 and newer. # +########################################################################### + +# intentionally left empty + +# The newline in the end of file is intentional diff --git a/conf/jvm8-server.options b/conf/jvm8-server.options new file mode 100644 index 0000000000..14d02617cd --- /dev/null +++ b/conf/jvm8-server.options @@ -0,0 +1,76 @@ +########################################################################### +# jvm8-server.options # +# # +# See jvm-server.options. This file is specific for Java 8 and newer. # +########################################################################### + +######################## +# GENERAL JVM SETTINGS # +######################## + +# allows lowering thread priority without being root on linux - probably +# not necessary on Windows but doesn't harm anything. +# see http://tech.stolsvik.com/2010/01/linux-java-thread-priorities-workaround.html +-XX:ThreadPriorityPolicy=42 + +################# +# GC SETTINGS # +################# + +### CMS Settings +#-XX:+UseParNewGC +#-XX:+UseConcMarkSweepGC +#-XX:+CMSParallelRemarkEnabled +#-XX:SurvivorRatio=8 +#-XX:MaxTenuringThreshold=1 +#-XX:CMSInitiatingOccupancyFraction=75 +#-XX:+UseCMSInitiatingOccupancyOnly +#-XX:CMSWaitDuration=10000 +#-XX:+CMSParallelInitialMarkEnabled +#-XX:+CMSEdenChunksRecordAlways +## some JVMs will fill up their heap when accessed via JMX, see CASSANDRA-6541 +#-XX:+CMSClassUnloadingEnabled + +### G1 Settings +## Use the Hotspot garbage-first collector. +-XX:+UseG1GC +-XX:+ParallelRefProcEnabled + +# +## Have the JVM do less remembered set work during STW, instead +## preferring concurrent GC. Reduces p99.9 latency. +-XX:G1RSetUpdatingPauseTimePercent=5 +# +## Main G1GC tunable: lowering the pause target will lower throughput and vise versa. +## 200ms is the JVM default and lowest viable setting +## 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml. +-XX:MaxGCPauseMillis=500 + +## Optional G1 Settings +# Save CPU time on large (>= 16GB) heaps by delaying region scanning +# until the heap is 70% full. The default in Hotspot 8u40 is 40%. +#-XX:InitiatingHeapOccupancyPercent=70 + +# For systems with > 8 cores, the default ParallelGCThreads is 5/8 the number of logical cores. +# Otherwise equal to the number of cores when 8 or less. +# Machines with > 10 cores should try setting these to <= full cores. +#-XX:ParallelGCThreads=16 +# By default, ConcGCThreads is 1/4 of ParallelGCThreads. +# Setting both to the same value can reduce STW durations. +#-XX:ConcGCThreads=16 + +### GC logging options -- uncomment to enable + +-XX:+PrintGCDetails +-XX:+PrintGCDateStamps +-XX:+PrintHeapAtGC +-XX:+PrintTenuringDistribution +-XX:+PrintGCApplicationStoppedTime +-XX:+PrintPromotionFailure +#-XX:PrintFLSStatistics=1 +#-Xloggc:/var/log/cassandra/gc.log +-XX:+UseGCLogFileRotation +-XX:NumberOfGCLogFiles=10 +-XX:GCLogFileSize=10M + +# The newline in the end of file is intentional diff --git a/debian/cassandra.in.sh b/debian/cassandra.in.sh index 8fcaf9cc9e..552731da66 100644 --- a/debian/cassandra.in.sh +++ b/debian/cassandra.in.sh @@ -27,8 +27,84 @@ CLASSPATH="$CLASSPATH:$EXTRA_CLASSPATH" # set JVM javaagent opts to avoid warnings/errors -if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ - || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] -then - JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" +JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.2.jar" + + +# +# 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=java fi + +if [ -z $JAVA ] ; then + echo Unable to find java executable. Check JAVA_HOME and PATH environment variables. >&2 + exit 1; +fi + +# 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%_*} + +JAVA_VERSION=11 +if [ "$JVM_VERSION" = "1.8.0" ] ; then + JVM_PATCH_VERSION=${jvmver#*_} + if [ "$JVM_VERSION" \< "1.8" ] || [ "$JVM_VERSION" \> "1.8.2" ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer). Java $JVM_VERSION is not supported." + exit 1; + fi + if [ "$JVM_PATCH_VERSION" -lt 151 ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer). Java 8 update $JVM_PATCH_VERSION is not supported." + exit 1; + fi + JAVA_VERSION=8 +elif [ "$JVM_VERSION" \< "11" ] ; then + echo "Cassandra 4.0 requires either Java 8 (update 151 or newer) or Java 11 (or newer)." + exit 1; +fi + +jvm=`echo "$java_ver_output" | grep -A 1 '[openjdk|java] version' | awk 'NR==2 {print $1}'` +case "$jvm" in + OpenJDK) + JVM_VENDOR=OpenJDK + # this will be "64-Bit" or "32-Bit" + JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'` + ;; + "Java(TM)") + JVM_VENDOR=Oracle + # this will be "64-Bit" or "32-Bit" + JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'` + ;; + *) + # Help fill in other JVM values + JVM_VENDOR=other + JVM_ARCH=unknown + ;; +esac + +# Read user-defined JVM options from jvm-server.options file +JVM_OPTS_FILE=$CASSANDRA_CONF/jvm${jvmoptions_variant:--clients}.options +if [ $JAVA_VERSION -ge 11 ] ; then + JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm11${jvmoptions_variant:--clients}.options +else + JVM_DEP_OPTS_FILE=$CASSANDRA_CONF/jvm8${jvmoptions_variant:--clients}.options +fi + +for opt in `grep "^-" $JVM_OPTS_FILE` `grep "^-" $JVM_DEP_OPTS_FILE` +do + JVM_OPTS="$JVM_OPTS $opt" +done diff --git a/debian/cassandra.install b/debian/cassandra.install index 50db32d278..9043f5637d 100644 --- a/debian/cassandra.install +++ b/debian/cassandra.install @@ -5,7 +5,7 @@ conf/commitlog_archiving.properties etc/cassandra conf/cassandra-topology.properties etc/cassandra conf/logback.xml etc/cassandra conf/logback-tools.xml etc/cassandra -conf/jvm.options etc/cassandra +conf/jvm*.options etc/cassandra conf/hotspot_compiler etc/cassandra conf/triggers/* etc/cassandra/triggers debian/cassandra.in.sh usr/share/cassandra diff --git a/ide/idea-iml-file.xml b/ide/idea-iml-file.xml index 649e95e9d8..de359850db 100644 --- a/ide/idea-iml-file.xml +++ b/ide/idea-iml-file.xml @@ -18,13 +18,14 @@ --> - + - + + diff --git a/ide/idea/misc.xml b/ide/idea/misc.xml index 7aa7466b5e..7f70ab9269 100644 --- a/ide/idea/misc.xml +++ b/ide/idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/ide/idea/workspace.xml b/ide/idea/workspace.xml index 876ed58d7a..1bfc8e2073 100644 --- a/ide/idea/workspace.xml +++ b/ide/idea/workspace.xml @@ -143,7 +143,7 @@