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 @@
-
+
@@ -167,7 +167,7 @@
-
+
@@ -185,7 +185,7 @@
-
+
diff --git a/lib/asm-5.0.4.jar b/lib/asm-5.0.4.jar
deleted file mode 100644
index cdb283dd7f..0000000000
Binary files a/lib/asm-5.0.4.jar and /dev/null differ
diff --git a/lib/asm-6.2.jar b/lib/asm-6.2.jar
new file mode 100644
index 0000000000..792142a59a
Binary files /dev/null and b/lib/asm-6.2.jar differ
diff --git a/lib/chronicle-bytes-1.10.1.jar b/lib/chronicle-bytes-1.10.1.jar
deleted file mode 100644
index 94645b7cdb..0000000000
Binary files a/lib/chronicle-bytes-1.10.1.jar and /dev/null differ
diff --git a/lib/chronicle-bytes-1.16.3.jar b/lib/chronicle-bytes-1.16.3.jar
new file mode 100644
index 0000000000..1b7c3a022a
Binary files /dev/null and b/lib/chronicle-bytes-1.16.3.jar differ
diff --git a/lib/chronicle-core-1.16.3-SNAPSHOT.jar b/lib/chronicle-core-1.16.3-SNAPSHOT.jar
new file mode 100644
index 0000000000..eae29e4952
Binary files /dev/null and b/lib/chronicle-core-1.16.3-SNAPSHOT.jar differ
diff --git a/lib/chronicle-core-1.9.21.jar b/lib/chronicle-core-1.9.21.jar
deleted file mode 100644
index 03436d5312..0000000000
Binary files a/lib/chronicle-core-1.9.21.jar and /dev/null differ
diff --git a/lib/chronicle-queue-4.16.3.jar b/lib/chronicle-queue-4.16.3.jar
new file mode 100644
index 0000000000..1def472f24
Binary files /dev/null and b/lib/chronicle-queue-4.16.3.jar differ
diff --git a/lib/chronicle-queue-4.6.55.jar b/lib/chronicle-queue-4.6.55.jar
deleted file mode 100644
index 09e2b33f51..0000000000
Binary files a/lib/chronicle-queue-4.6.55.jar and /dev/null differ
diff --git a/lib/chronicle-threads-1.16.0.jar b/lib/chronicle-threads-1.16.0.jar
new file mode 100644
index 0000000000..b1f122861b
Binary files /dev/null and b/lib/chronicle-threads-1.16.0.jar differ
diff --git a/lib/chronicle-threads-1.9.1.jar b/lib/chronicle-threads-1.9.1.jar
deleted file mode 100644
index 5e69515426..0000000000
Binary files a/lib/chronicle-threads-1.9.1.jar and /dev/null differ
diff --git a/lib/chronicle-wire-1.10.1.jar b/lib/chronicle-wire-1.10.1.jar
deleted file mode 100644
index e6d8b3301a..0000000000
Binary files a/lib/chronicle-wire-1.10.1.jar and /dev/null differ
diff --git a/lib/chronicle-wire-1.16.1.jar b/lib/chronicle-wire-1.16.1.jar
new file mode 100644
index 0000000000..720d2428c1
Binary files /dev/null and b/lib/chronicle-wire-1.16.1.jar differ
diff --git a/lib/ecj-4.4.2.jar b/lib/ecj-4.4.2.jar
deleted file mode 100644
index d9411b3a1f..0000000000
Binary files a/lib/ecj-4.4.2.jar and /dev/null differ
diff --git a/lib/ecj-4.6.1.jar b/lib/ecj-4.6.1.jar
new file mode 100644
index 0000000000..1c7e9cad30
Binary files /dev/null and b/lib/ecj-4.6.1.jar differ
diff --git a/lib/jamm-0.3.0.jar b/lib/jamm-0.3.0.jar
deleted file mode 100644
index f770592963..0000000000
Binary files a/lib/jamm-0.3.0.jar and /dev/null differ
diff --git a/lib/jamm-0.3.2.jar b/lib/jamm-0.3.2.jar
new file mode 100644
index 0000000000..e0a61a15df
Binary files /dev/null and b/lib/jamm-0.3.2.jar differ
diff --git a/lib/licenses/asm-5.0.4.txt b/lib/licenses/asm-6.2.txt
similarity index 100%
rename from lib/licenses/asm-5.0.4.txt
rename to lib/licenses/asm-6.2.txt
diff --git a/lib/licenses/chronicle-bytes-1.10.1.txt b/lib/licenses/chronicle-bytes-1.16.3.txt
similarity index 100%
rename from lib/licenses/chronicle-bytes-1.10.1.txt
rename to lib/licenses/chronicle-bytes-1.16.3.txt
diff --git a/lib/licenses/chronicle-core-1.9.21.txt b/lib/licenses/chronicle-core-1.16.3-SNAPSHOT.txt
similarity index 100%
rename from lib/licenses/chronicle-core-1.9.21.txt
rename to lib/licenses/chronicle-core-1.16.3-SNAPSHOT.txt
diff --git a/lib/licenses/chronicle-queue-4.6.55.txt b/lib/licenses/chronicle-queue-4.16.3.txt
similarity index 100%
rename from lib/licenses/chronicle-queue-4.6.55.txt
rename to lib/licenses/chronicle-queue-4.16.3.txt
diff --git a/lib/licenses/chronicle-threads-1.9.1.txt b/lib/licenses/chronicle-threads-1.16.0.txt
similarity index 100%
rename from lib/licenses/chronicle-threads-1.9.1.txt
rename to lib/licenses/chronicle-threads-1.16.0.txt
diff --git a/lib/licenses/chronicle-wire-1.10.1.txt b/lib/licenses/chronicle-wire-1.16.1.txt
similarity index 100%
rename from lib/licenses/chronicle-wire-1.10.1.txt
rename to lib/licenses/chronicle-wire-1.16.1.txt
diff --git a/lib/licenses/ecj-4.4.2.txt b/lib/licenses/ecj-4.6.1.txt
similarity index 100%
rename from lib/licenses/ecj-4.4.2.txt
rename to lib/licenses/ecj-4.6.1.txt
diff --git a/lib/licenses/jamm-0.3.0.txt b/lib/licenses/jamm-0.3.2.txt
similarity index 100%
rename from lib/licenses/jamm-0.3.0.txt
rename to lib/licenses/jamm-0.3.2.txt
diff --git a/lib/licenses/ohc-0.4.4.txt b/lib/licenses/ohc-0.5.1.txt
similarity index 100%
rename from lib/licenses/ohc-0.4.4.txt
rename to lib/licenses/ohc-0.5.1.txt
diff --git a/lib/ohc-core-0.4.4.jar b/lib/ohc-core-0.4.4.jar
deleted file mode 100644
index 6d0f558312..0000000000
Binary files a/lib/ohc-core-0.4.4.jar and /dev/null differ
diff --git a/lib/ohc-core-0.5.1.jar b/lib/ohc-core-0.5.1.jar
new file mode 100644
index 0000000000..20f535fea9
Binary files /dev/null and b/lib/ohc-core-0.5.1.jar differ
diff --git a/lib/ohc-core-j8-0.4.4.jar b/lib/ohc-core-j8-0.4.4.jar
deleted file mode 100644
index f0f9452d8d..0000000000
Binary files a/lib/ohc-core-j8-0.4.4.jar and /dev/null differ
diff --git a/lib/ohc-core-j8-0.5.1.jar b/lib/ohc-core-j8-0.5.1.jar
new file mode 100644
index 0000000000..566cfb28aa
Binary files /dev/null and b/lib/ohc-core-j8-0.5.1.jar differ
diff --git a/redhat/cassandra.in.sh b/redhat/cassandra.in.sh
index ca71782093..ecca949e62 100644
--- a/redhat/cassandra.in.sh
+++ b/redhat/cassandra.in.sh
@@ -23,8 +23,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/src/java/org/apache/cassandra/cache/SerializingCache.java b/src/java/org/apache/cassandra/cache/SerializingCache.java
index 320bb15ff6..55c20ec4d7 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCache.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCache.java
@@ -76,6 +76,7 @@ public class SerializingCache implements ICache
}, serializer);
}
+ @SuppressWarnings("resource")
private V deserialize(RefCountedMemory mem)
{
try
@@ -89,6 +90,7 @@ public class SerializingCache implements ICache
}
}
+ @SuppressWarnings("resource")
private RefCountedMemory serialize(V value)
{
long serializedSize = serializer.serializedSize(value);
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 2dc3737313..6301ab0576 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -73,6 +73,12 @@ import static org.apache.cassandra.io.util.FileUtils.ONE_GB;
public class DatabaseDescriptor
{
+ static
+ {
+ // This static block covers most usages
+ FBUtilities.preventIllegalAccessWarnings();
+ }
+
private static final Logger logger = LoggerFactory.getLogger(DatabaseDescriptor.class);
/**
diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
index feb17e3c9b..71b9b895dc 100644
--- a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
@@ -70,7 +70,7 @@ public final class JavaBasedUDFunction extends UDFunction
private static final Pattern JAVA_LANG_PREFIX = Pattern.compile("\\bjava\\.lang\\.");
- static final Logger logger = LoggerFactory.getLogger(JavaBasedUDFunction.class);
+ private static final Logger logger = LoggerFactory.getLogger(JavaBasedUDFunction.class);
private static final AtomicInteger classSequence = new AtomicInteger();
@@ -257,10 +257,10 @@ public final class JavaBasedUDFunction extends UDFunction
EcjCompilationUnit compilationUnit = new EcjCompilationUnit(javaSource, targetClassName);
Compiler compiler = new Compiler(compilationUnit,
- errorHandlingPolicy,
- compilerOptions,
- compilationUnit,
- problemFactory);
+ errorHandlingPolicy,
+ compilerOptions,
+ compilationUnit,
+ problemFactory);
compiler.compile(new ICompilationUnit[]{ compilationUnit });
if (compilationUnit.problemList != null && !compilationUnit.problemList.isEmpty())
@@ -582,6 +582,7 @@ public final class JavaBasedUDFunction extends UDFunction
return findType(result.toString());
}
+ @SuppressWarnings("resource")
private NameEnvironmentAnswer findType(String className)
{
if (className.equals(this.className))
diff --git a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
index 7e8b1490a2..08d832c323 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
@@ -73,6 +73,14 @@ final class ScriptBasedUDFunction extends UDFunction
"jdk.internal.org.objectweb.asm.commons",
"jdk.nashorn.internal.runtime",
"jdk.nashorn.internal.runtime.linker",
+ // Nashorn / Java 11
+ "java.lang.ref",
+ "java.io",
+ "java.util.function",
+ "jdk.dynalink.linker",
+ "jdk.internal.org.objectweb.asm",
+ "jdk.internal.reflect",
+ "jdk.nashorn.internal.scripts",
// following required by Java Driver
"java.math",
"java.nio",
diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java
index c6158b5d25..c1626978cc 100644
--- a/src/java/org/apache/cassandra/db/Memtable.java
+++ b/src/java/org/apache/cassandra/db/Memtable.java
@@ -77,10 +77,6 @@ public class Memtable implements Comparable
case heap_buffers:
return new SlabPool(heapLimit, 0, DatabaseDescriptor.getMemtableCleanupThreshold(), new ColumnFamilyStore.FlushLargestColumnFamily());
case offheap_buffers:
- if (!FileUtils.isCleanerAvailable)
- {
- throw new IllegalStateException("Could not free direct byte buffer: offheap_buffers is not a safe memtable_allocation_type without this ability, please adjust your config. This feature is only guaranteed to work on an Oracle JVM. Refusing to start.");
- }
return new SlabPool(heapLimit, offHeapLimit, DatabaseDescriptor.getMemtableCleanupThreshold(), new ColumnFamilyStore.FlushLargestColumnFamily());
case offheap_objects:
return new NativePool(heapLimit, offHeapLimit, DatabaseDescriptor.getMemtableCleanupThreshold(), new ColumnFamilyStore.FlushLargestColumnFamily());
diff --git a/src/java/org/apache/cassandra/db/RangeTombstoneList.java b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
index 716213da55..401ff7b331 100644
--- a/src/java/org/apache/cassandra/db/RangeTombstoneList.java
+++ b/src/java/org/apache/cassandra/db/RangeTombstoneList.java
@@ -344,6 +344,7 @@ public class RangeTombstoneList implements Iterable, IMeasurable
return iterator(false);
}
+ @SuppressWarnings("resource")
public Iterator iterator(boolean reversed)
{
return reversed
diff --git a/src/java/org/apache/cassandra/db/ReadCommand.java b/src/java/org/apache/cassandra/db/ReadCommand.java
index 7b554a7de0..82ca0544f0 100644
--- a/src/java/org/apache/cassandra/db/ReadCommand.java
+++ b/src/java/org/apache/cassandra/db/ReadCommand.java
@@ -214,6 +214,7 @@ public abstract class ReadCommand extends AbstractReadQuery
protected abstract int oldestUnrepairedTombstone();
+ @SuppressWarnings("resource")
public ReadResponse createResponse(UnfilteredPartitionIterator iterator)
{
// validate that the sequence of RT markers is correct: open is followed by close, deletion times for both
diff --git a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
index 721410612d..c091bf1534 100644
--- a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
+++ b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
@@ -388,6 +388,7 @@ public class SinglePartitionReadCommand extends ReadCommand implements SinglePar
* If the partition is is not cached, we figure out what filter is "biggest", read
* that from disk, then filter the result and either cache that or return it.
*/
+ @SuppressWarnings("resource")
private UnfilteredRowIterator getThroughCache(ColumnFamilyStore cfs, ReadExecutionController executionController)
{
assert !cfs.isIndex(); // CASSANDRA-5732
@@ -710,6 +711,7 @@ public class SinglePartitionReadCommand extends ReadCommand implements SinglePar
* Note that we cannot use the Transformations framework because they greedily get the static row, which
* would cause all iterators to be initialized and hence all sstables to be accessed.
*/
+ @SuppressWarnings("resource")
private UnfilteredRowIterator withSSTablesIterated(List iterators,
TableMetrics metrics,
SSTableReadMetricsCollector metricsCollector)
diff --git a/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java b/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java
index f2c9a492df..ad22a587a5 100644
--- a/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java
+++ b/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java
@@ -55,6 +55,7 @@ public abstract class VirtualTableReadQuery extends AbstractReadQuery
}
@Override
+ @SuppressWarnings("resource")
public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
{
UnfilteredPartitionIterator resultIterator = queryVirtualTable();
diff --git a/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java b/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
index e79278d9dd..6ecdbd3c77 100644
--- a/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
@@ -102,8 +102,7 @@ public class MemoryMappedSegment extends CommitLogSegment
@Override
protected void internalClose()
{
- if (FileUtils.isCleanerAvailable)
- FileUtils.clean(buffer);
+ FileUtils.clean(buffer);
super.internalClose();
}
}
diff --git a/src/java/org/apache/cassandra/db/compaction/Scrubber.java b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
index ce749f4deb..8a7c53bee3 100644
--- a/src/java/org/apache/cassandra/db/compaction/Scrubber.java
+++ b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
@@ -355,6 +355,7 @@ public class Scrubber implements Closeable
* Only wrap with {@link FixNegativeLocalDeletionTimeIterator} if {@link #reinsertOverflowedTTLRows} option
* is specified
*/
+ @SuppressWarnings("resource")
private UnfilteredRowIterator getIterator(DecoratedKey key)
{
RowMergingSSTableIterator rowMergingIterator = new RowMergingSSTableIterator(SSTableIdentityIterator.create(sstable, dataFile, key));
diff --git a/src/java/org/apache/cassandra/db/filter/RowFilter.java b/src/java/org/apache/cassandra/db/filter/RowFilter.java
index baafe8b214..90ce73ba71 100644
--- a/src/java/org/apache/cassandra/db/filter/RowFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/RowFilter.java
@@ -279,6 +279,8 @@ public abstract class RowFilter implements Iterable
class IsSatisfiedFilter extends Transformation
{
DecoratedKey pk;
+
+ @SuppressWarnings("resource")
public UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition)
{
pk = partition.partitionKey();
diff --git a/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java b/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
index ee94963f83..6adebfd630 100644
--- a/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
+++ b/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
@@ -36,7 +36,6 @@ import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.SearchIterator;
import org.apache.cassandra.utils.btree.BTree;
import org.apache.cassandra.utils.btree.UpdateFunction;
-import org.apache.cassandra.utils.concurrent.Locks;
import org.apache.cassandra.utils.concurrent.OpOrder;
import org.apache.cassandra.utils.memory.HeapAllocator;
import org.apache.cassandra.utils.memory.MemtableAllocator;
@@ -49,7 +48,7 @@ import org.apache.cassandra.utils.memory.MemtableAllocator;
* other thread can see the state where only parts but not all rows have
* been added.
*/
-public class AtomicBTreePartition extends AbstractBTreePartition
+public final class AtomicBTreePartition extends AtomicBTreePartitionBase
{
public static final long EMPTY_SIZE = ObjectSizes.measure(new AtomicBTreePartition(null,
DatabaseDescriptor.getPartitioner().decorateKey(ByteBuffer.allocate(1)),
@@ -125,7 +124,7 @@ public class AtomicBTreePartition extends AbstractBTreePartition
{
if (usePessimisticLocking())
{
- Locks.monitorEnterUnsafe(this);
+ acquireLock();
monitorOwned = true;
}
@@ -179,7 +178,7 @@ public class AtomicBTreePartition extends AbstractBTreePartition
}
if (shouldLock)
{
- Locks.monitorEnterUnsafe(this);
+ acquireLock();
monitorOwned = true;
}
}
@@ -189,7 +188,7 @@ public class AtomicBTreePartition extends AbstractBTreePartition
{
indexer.commit();
if (monitorOwned)
- Locks.monitorExitUnsafe(this);
+ releaseLock();
}
}
diff --git a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
index b7934202d7..99220ca974 100644
--- a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
+++ b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
@@ -178,6 +178,7 @@ public class PartitionUpdate extends AbstractBTreePartition
* Warning: this method does not close the provided iterator, it is up to
* the caller to close it.
*/
+ @SuppressWarnings("resource")
public static PartitionUpdate fromIterator(UnfilteredRowIterator iterator, ColumnFilter filter)
{
iterator = UnfilteredRowIterators.withOnlyQueriedData(iterator, filter);
@@ -197,6 +198,7 @@ public class PartitionUpdate extends AbstractBTreePartition
* Warning: this method does not close the provided iterator, it is up to
* the caller to close it.
*/
+ @SuppressWarnings("resource")
public static PartitionUpdate fromIterator(RowIterator iterator, ColumnFilter filter)
{
iterator = RowIterators.withOnlyQueriedData(iterator, filter);
@@ -218,6 +220,7 @@ public class PartitionUpdate extends AbstractBTreePartition
*
* @return the deserialized update or {@code null} if {@code bytes == null}.
*/
+ @SuppressWarnings("resource")
public static PartitionUpdate fromBytes(ByteBuffer bytes, int version)
{
if (bytes == null)
diff --git a/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java b/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
index 19289d47d9..8dcd35951e 100644
--- a/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
+++ b/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
@@ -61,6 +61,7 @@ public abstract class PurgeFunction extends Transformation iterators, final int nowInSec, final MergeListener listener)
{
assert listener != null;
@@ -135,6 +136,7 @@ public abstract class UnfilteredPartitionIterators
toMerge.set(idx, current);
}
+ @SuppressWarnings("resource")
protected UnfilteredRowIterator getReduced()
{
UnfilteredRowIterators.MergeListener rowListener = listener.getRowMergeListener(partitionKey, toMerge);
@@ -190,6 +192,7 @@ public abstract class UnfilteredPartitionIterators
};
}
+ @SuppressWarnings("resource")
public static UnfilteredPartitionIterator mergeLazily(final List extends UnfilteredPartitionIterator> iterators, final int nowInSec)
{
assert !iterators.isEmpty();
diff --git a/src/java/org/apache/cassandra/db/rows/Row.java b/src/java/org/apache/cassandra/db/rows/Row.java
index f922ffb47c..f35272a425 100644
--- a/src/java/org/apache/cassandra/db/rows/Row.java
+++ b/src/java/org/apache/cassandra/db/rows/Row.java
@@ -645,6 +645,7 @@ public interface Row extends Unfiltered, Collection
lastRowSet = i;
}
+ @SuppressWarnings("resource")
public Row merge(DeletionTime activeDeletion)
{
// If for this clustering we have only one row version and have no activeDeletion (i.e. nothing to filter out),
@@ -756,6 +757,7 @@ public interface Row extends Unfiltered, Collection
return AbstractTypeVersionComparator.INSTANCE.compare(column.type, dataColumn.type) < 0;
}
+ @SuppressWarnings("resource")
protected ColumnData getReduced()
{
if (column.isSimple())
diff --git a/src/java/org/apache/cassandra/db/rows/Rows.java b/src/java/org/apache/cassandra/db/rows/Rows.java
index 79c46d0d33..8c18c821ad 100644
--- a/src/java/org/apache/cassandra/db/rows/Rows.java
+++ b/src/java/org/apache/cassandra/db/rows/Rows.java
@@ -131,6 +131,7 @@ public abstract class Rows
* @param merged the result of merging {@code inputs}.
* @param inputs the inputs whose merge yielded {@code merged}.
*/
+ @SuppressWarnings("resource")
public static void diff(RowDiffListener diffListener, Row merged, Row...inputs)
{
Clustering clustering = merged.clustering();
diff --git a/src/java/org/apache/cassandra/db/transform/BasePartitions.java b/src/java/org/apache/cassandra/db/transform/BasePartitions.java
index 2f76452aa2..7b0f56c402 100644
--- a/src/java/org/apache/cassandra/db/transform/BasePartitions.java
+++ b/src/java/org/apache/cassandra/db/transform/BasePartitions.java
@@ -77,6 +77,7 @@ implements BasePartitionIterator
return fail;
}
+ @SuppressWarnings("resource")
public final boolean hasNext()
{
BaseRowIterator> next = null;
diff --git a/src/java/org/apache/cassandra/db/transform/Filter.java b/src/java/org/apache/cassandra/db/transform/Filter.java
index 48a1634bb1..0bd3eabe6a 100644
--- a/src/java/org/apache/cassandra/db/transform/Filter.java
+++ b/src/java/org/apache/cassandra/db/transform/Filter.java
@@ -35,6 +35,7 @@ public final class Filter extends Transformation
}
@Override
+ @SuppressWarnings("resource")
protected RowIterator applyToPartition(BaseRowIterator iterator)
{
return iterator instanceof UnfilteredRows
diff --git a/src/java/org/apache/cassandra/db/transform/FilteredPartitions.java b/src/java/org/apache/cassandra/db/transform/FilteredPartitions.java
index 6a19f7637f..a1b8571a12 100644
--- a/src/java/org/apache/cassandra/db/transform/FilteredPartitions.java
+++ b/src/java/org/apache/cassandra/db/transform/FilteredPartitions.java
@@ -50,12 +50,14 @@ public final class FilteredPartitions extends BasePartitions indexes, Collection sstables)
{
return new CollatedViewIndexBuilder(cfs, indexes, new ReducingKeyIterator(sstables));
diff --git a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
index 76b7543882..abe2460952 100644
--- a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
+++ b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
@@ -686,6 +686,7 @@ public abstract class CassandraIndex implements Index
};
}
+ @SuppressWarnings("resource")
private void buildBlocking()
{
baseCfs.forceBlockingFlush();
diff --git a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
index 9045b3b8a2..e0f0a8baee 100644
--- a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
@@ -208,6 +208,7 @@ public class CompositesSearcher extends CassandraIndexSearcher
}
// We assume all rows in dataIter belong to the same partition.
+ @SuppressWarnings("resource")
private UnfilteredRowIterator filterStaleEntries(UnfilteredRowIterator dataIter,
final ByteBuffer indexValue,
final List entries,
diff --git a/src/java/org/apache/cassandra/index/sasi/utils/MappedBuffer.java b/src/java/org/apache/cassandra/index/sasi/utils/MappedBuffer.java
index efabe7bcd3..0899be6b2b 100644
--- a/src/java/org/apache/cassandra/index/sasi/utils/MappedBuffer.java
+++ b/src/java/org/apache/cassandra/index/sasi/utils/MappedBuffer.java
@@ -217,9 +217,6 @@ public class MappedBuffer implements Closeable
public void close()
{
- if (!FileUtils.isCleanerAvailable)
- return;
-
/*
* Try forcing the unmapping of pages using undocumented unsafe sun APIs.
* If this fails (non Sun JVM), we'll have to wait for the GC to finalize the mapping.
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
index 1b6a299fa2..a4787a2645 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
@@ -69,6 +69,7 @@ public class BigTableReader extends SSTableReader
return iterator(null, key, rie, slices, selectedColumns, reversed);
}
+ @SuppressWarnings("resource")
public UnfilteredRowIterator iterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
{
if (indexEntry == null)
diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java
index a0858138bb..10c12e2576 100644
--- a/src/java/org/apache/cassandra/io/util/FileUtils.java
+++ b/src/java/org/apache/cassandra/io/util/FileUtils.java
@@ -18,6 +18,9 @@
package org.apache.cassandra.io.util;
import java.io.*;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
@@ -34,13 +37,13 @@ import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.cassandra.utils.SyncUtil;
-import sun.nio.ch.DirectBuffer;
import org.apache.cassandra.concurrent.ScheduledExecutors;
import org.apache.cassandra.io.FSError;
@@ -49,6 +52,7 @@ import org.apache.cassandra.io.FSReadError;
import org.apache.cassandra.io.FSWriteError;
import org.apache.cassandra.io.sstable.CorruptSSTableException;
import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.memory.MemoryUtil;
import static org.apache.cassandra.utils.Throwables.maybeFail;
import static org.apache.cassandra.utils.Throwables.merge;
@@ -64,24 +68,31 @@ public final class FileUtils
public static final long ONE_TB = 1024 * ONE_GB;
private static final DecimalFormat df = new DecimalFormat("#.##");
- public static final boolean isCleanerAvailable;
private static final AtomicReference> fsErrorHandler = new AtomicReference<>(Optional.empty());
+ private static Class clsDirectBuffer;
+ private static MethodHandle mhDirectBufferCleaner;
+ private static MethodHandle mhCleanerClean;
+
static
{
- boolean canClean = false;
try
{
+ clsDirectBuffer = Class.forName("sun.nio.ch.DirectBuffer");
+ Method mDirectBufferCleaner = clsDirectBuffer.getMethod("cleaner");
+ mhDirectBufferCleaner = MethodHandles.lookup().unreflect(mDirectBufferCleaner);
+ Method mCleanerClean = mDirectBufferCleaner.getReturnType().getMethod("clean");
+ mhCleanerClean = MethodHandles.lookup().unreflect(mCleanerClean);
+
ByteBuffer buf = ByteBuffer.allocateDirect(1);
- ((DirectBuffer) buf).cleaner().clean();
- canClean = true;
+ clean(buf);
}
catch (Throwable t)
{
+ logger.error("FATAL: Cannot initialize optimized memory deallocator. Some data, both in-memory and on-disk, may live longer due to garbage collection.");
JVMStabilityInspector.inspectThrowable(t);
- logger.info("Cannot initialize un-mmaper. (Are you using a non-Oracle JVM?) Compacted data files will not be removed promptly. Consider using an Oracle JVM or using standard disk access mode");
+ throw new RuntimeException(t);
}
- isCleanerAvailable = canClean;
}
public static void createHardLink(String from, String to)
@@ -106,11 +117,44 @@ public final class FileUtils
}
}
+ private static final File tempDir = new File(System.getProperty("java.io.tmpdir"));
+ private static final AtomicLong tempFileNum = new AtomicLong();
+
+ public static File getTempDir()
+ {
+ return tempDir;
+ }
+
+ /**
+ * Pretty much like {@link File#createTempFile(String, String, File)}, but with
+ * the guarantee that the "random" part of the generated file name between
+ * {@code prefix} and {@code suffix} is a positive, increasing {@code long} value.
+ */
public static File createTempFile(String prefix, String suffix, File directory)
{
try
{
- return File.createTempFile(prefix, suffix, directory);
+ // Do not use java.io.File.createTempFile(), because some tests rely on the
+ // behavior that the "random" part in the temp file name is a positive 'long'.
+ // However, at least since Java 9 the code to generate the "random" part
+ // uses an _unsigned_ random long generated like this:
+ // Long.toUnsignedString(new java.util.Random.nextLong())
+
+ while (true)
+ {
+ // The contract of File.createTempFile() says, that it must not return
+ // the same file name again. We do that here in a very simple way,
+ // that probably doesn't cover all edge cases. Just rely on system
+ // wall clock and return strictly increasing values from that.
+ long num = tempFileNum.getAndIncrement();
+
+ // We have a positive long here, which is safe to use for example
+ // for CommitLogTest.
+ String fileName = prefix + Long.toString(num) + suffix;
+ File candidate = new File(directory, fileName);
+ if (candidate.createNewFile())
+ return candidate;
+ }
}
catch (IOException e)
{
@@ -120,12 +164,12 @@ public final class FileUtils
public static File createTempFile(String prefix, String suffix)
{
- return createTempFile(prefix, suffix, new File(System.getProperty("java.io.tmpdir")));
+ return createTempFile(prefix, suffix, tempDir);
}
public static File createDeletableTempFile(String prefix, String suffix)
{
- File f = createTempFile(prefix, suffix, new File(System.getProperty("java.io.tmpdir")));
+ File f = createTempFile(prefix, suffix, getTempDir());
f.deleteOnExit();
return f;
}
@@ -350,13 +394,29 @@ public final class FileUtils
public static void clean(ByteBuffer buffer)
{
- if (buffer == null)
+ if (buffer == null || !buffer.isDirect())
return;
- if (isCleanerAvailable && buffer.isDirect())
+
+ // TODO Once we can get rid of Java 8, it's simpler to call sun.misc.Unsafe.invokeCleaner(ByteBuffer),
+ // but need to take care of the attachment handling (i.e. whether 'buf' is a duplicate or slice) - that
+ // is different in sun.misc.Unsafe.invokeCleaner and this implementation.
+
+ try
{
- DirectBuffer db = (DirectBuffer) buffer;
- if (db.cleaner() != null)
- db.cleaner().clean();
+ Object cleaner = mhDirectBufferCleaner.bindTo(buffer).invoke();
+ if (cleaner != null)
+ {
+ // ((DirectBuffer) buf).cleaner().clean();
+ mhCleanerClean.bindTo(cleaner).invoke();
+ }
+ }
+ catch (RuntimeException e)
+ {
+ throw e;
+ }
+ catch (Throwable e)
+ {
+ throw new RuntimeException(e);
}
}
diff --git a/src/java/org/apache/cassandra/io/util/Memory.java b/src/java/org/apache/cassandra/io/util/Memory.java
index 431f73de65..0ca6aa214a 100644
--- a/src/java/org/apache/cassandra/io/util/Memory.java
+++ b/src/java/org/apache/cassandra/io/util/Memory.java
@@ -28,7 +28,6 @@ import org.apache.cassandra.utils.FastByteOperations;
import org.apache.cassandra.utils.concurrent.Ref;
import org.apache.cassandra.utils.memory.MemoryUtil;
import sun.misc.Unsafe;
-import sun.nio.ch.DirectBuffer;
/**
* An off-heap region of memory that must be manually free'd when no longer needed.
@@ -213,9 +212,9 @@ public class Memory implements AutoCloseable
{
setBytes(memoryOffset, buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining());
}
- else if (buffer instanceof DirectBuffer)
+ else if (buffer.isDirect())
{
- unsafe.copyMemory(((DirectBuffer) buffer).address() + buffer.position(), peer + memoryOffset, buffer.remaining());
+ unsafe.copyMemory(MemoryUtil.getAddress(buffer) + buffer.position(), peer + memoryOffset, buffer.remaining());
}
else
throw new IllegalStateException();
diff --git a/src/java/org/apache/cassandra/io/util/MmappedRegions.java b/src/java/org/apache/cassandra/io/util/MmappedRegions.java
index 13b476a9ea..0b7dd39353 100644
--- a/src/java/org/apache/cassandra/io/util/MmappedRegions.java
+++ b/src/java/org/apache/cassandra/io/util/MmappedRegions.java
@@ -325,14 +325,6 @@ public class MmappedRegions extends SharedCloseableImpl
{
accumulate = channel.close(accumulate);
- /*
- * Try forcing the unmapping of segments using undocumented unsafe sun APIs.
- * If this fails (non Sun JVM), we'll have to wait for the GC to finalize the mapping.
- * If this works and a thread tries to access any segment, hell will unleash on earth.
- */
- if (!FileUtils.isCleanerAvailable)
- return accumulate;
-
return perform(accumulate, channel.filePath(), Throwables.FileOpType.READ,
of(buffers)
.map((buffer) ->
diff --git a/src/java/org/apache/cassandra/security/ThreadAwareSecurityManager.java b/src/java/org/apache/cassandra/security/ThreadAwareSecurityManager.java
index c9402f153d..6500c8fb53 100644
--- a/src/java/org/apache/cassandra/security/ThreadAwareSecurityManager.java
+++ b/src/java/org/apache/cassandra/security/ThreadAwareSecurityManager.java
@@ -18,6 +18,7 @@
package org.apache.cassandra.security;
+import java.lang.reflect.ReflectPermission;
import java.security.AccessControlException;
import java.security.AllPermission;
import java.security.CodeSource;
@@ -66,6 +67,12 @@ public final class ThreadAwareSecurityManager extends SecurityManager
private static final RuntimePermission MODIFY_THREAD_PERMISSION = new RuntimePermission("modifyThread");
private static final RuntimePermission MODIFY_THREADGROUP_PERMISSION = new RuntimePermission("modifyThreadGroup");
+ // Nashorn / Java 11
+ private static final RuntimePermission NASHORN_GLOBAL_PERMISSION = new RuntimePermission("nashorn.createGlobal");
+ private static final ReflectPermission SUPPRESS_ACCESS_CHECKS_PERMISSION = new ReflectPermission("suppressAccessChecks");
+ private static final RuntimePermission DYNALINK_LOOKUP_PERMISSION = new RuntimePermission("dynalink.getLookup");
+ private static final RuntimePermission GET_CLASSLOADER_PERMISSION = new RuntimePermission("getClassLoader");
+
private static volatile boolean installed;
public static void install()
@@ -189,6 +196,16 @@ public final class ThreadAwareSecurityManager extends SecurityManager
if (CHECK_MEMBER_ACCESS_PERMISSION.equals(perm))
return;
+ // Nashorn / Java 11
+ if (NASHORN_GLOBAL_PERMISSION.equals(perm))
+ return;
+ if (SUPPRESS_ACCESS_CHECKS_PERMISSION.equals(perm))
+ return;
+ if (DYNALINK_LOOKUP_PERMISSION.equals(perm))
+ return;
+ if (GET_CLASSLOADER_PERMISSION.equals(perm))
+ return;
+
super.checkPermission(perm);
}
@@ -208,7 +225,5 @@ public final class ThreadAwareSecurityManager extends SecurityManager
RuntimePermission perm = new RuntimePermission("accessClassInPackage." + pkg);
throw new AccessControlException("access denied: " + perm, perm);
}
-
- super.checkPackageAccess(pkg);
}
}
diff --git a/src/java/org/apache/cassandra/service/reads/DataResolver.java b/src/java/org/apache/cassandra/service/reads/DataResolver.java
index ebf6a6f456..76e9633112 100644
--- a/src/java/org/apache/cassandra/service/reads/DataResolver.java
+++ b/src/java/org/apache/cassandra/service/reads/DataResolver.java
@@ -58,6 +58,7 @@ public class DataResolver extends ResponseResolver
return !responses.isEmpty();
}
+ @SuppressWarnings("resource")
public PartitionIterator resolve()
{
// We could get more responses while this method runs, which is ok (we're happy to ignore any response not here
diff --git a/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java b/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
index 93c02e0dcd..f603e9ba34 100644
--- a/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
+++ b/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
@@ -39,6 +39,7 @@ import org.apache.cassandra.locator.InetAddressAndPort;
*/
public class ShortReadProtection
{
+ @SuppressWarnings("resource")
public static UnfilteredPartitionIterator extend(InetAddressAndPort source, UnfilteredPartitionIterator partitions,
ReadCommand command, DataLimits.Counter mergedResultCounter,
long queryStartNanoTime, boolean enforceStrictLiveness)
diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java
index b1d01d5aa3..0c53befd75 100644
--- a/src/java/org/apache/cassandra/tools/NodeTool.java
+++ b/src/java/org/apache/cassandra/tools/NodeTool.java
@@ -44,6 +44,11 @@ import static org.apache.commons.lang3.StringUtils.*;
public class NodeTool
{
+ static
+ {
+ FBUtilities.preventIllegalAccessWarnings();
+ }
+
private static final String HISTORYFILE = "nodetool.history";
public static void main(String... args)
diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java
index 4079ee7e62..394f4b61d4 100644
--- a/src/java/org/apache/cassandra/tools/SSTableExport.java
+++ b/src/java/org/apache/cassandra/tools/SSTableExport.java
@@ -56,6 +56,10 @@ import org.apache.cassandra.utils.FBUtilities;
*/
public class SSTableExport
{
+ static
+ {
+ FBUtilities.preventIllegalAccessWarnings();
+ }
private static final String KEY_OPTION = "k";
private static final String DEBUG_OUTPUT_OPTION = "d";
@@ -102,6 +106,7 @@ public class SSTableExport
* @throws ConfigurationException
* on configuration failure (wrong params given)
*/
+ @SuppressWarnings("resource")
public static void main(String[] args) throws ConfigurationException
{
CommandLineParser parser = new PosixParser();
diff --git a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
index 32a987f53b..cb0918cd11 100644
--- a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
+++ b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
@@ -35,6 +35,8 @@ import org.slf4j.LoggerFactory;
import com.google.common.io.Files;
+import org.apache.cassandra.io.util.FileUtils;
+
/**
* Custom class loader will load the classes from the class path, CCL will load
* the classes from the the URL first, if it cannot find the required class it
@@ -76,7 +78,7 @@ public class CustomClassLoader extends URLClassLoader
};
for (File inputJar : dir.listFiles(filter))
{
- File lib = new File(System.getProperty("java.io.tmpdir"), "lib");
+ File lib = new File(FileUtils.getTempDir(), "lib");
if (!lib.exists())
{
lib.mkdir();
@@ -84,7 +86,7 @@ public class CustomClassLoader extends URLClassLoader
}
try
{
- File out = File.createTempFile("cassandra-", ".jar", lib);
+ File out = FileUtils.createTempFile("cassandra-", ".jar", lib);
out.deleteOnExit();
logger.info("Loading new jar {}", inputJar.getAbsolutePath());
Files.copy(inputJar, out);
diff --git a/src/java/org/apache/cassandra/utils/CoalescingStrategies.java b/src/java/org/apache/cassandra/utils/CoalescingStrategies.java
index 6ff91e3202..2f9e5bbf08 100644
--- a/src/java/org/apache/cassandra/utils/CoalescingStrategies.java
+++ b/src/java/org/apache/cassandra/utils/CoalescingStrategies.java
@@ -144,7 +144,7 @@ public class CoalescingStrategies
ScheduledExecutors.scheduledFastTasks.scheduleWithFixedDelay(() -> shouldLogAverage = true, 5, 5, TimeUnit.SECONDS);
try
{
- File outFile = File.createTempFile("coalescing_" + this.displayName + "_", ".log", new File(DEBUG_COALESCING_PATH));
+ File outFile = FileUtils.createTempFile("coalescing_" + this.displayName + "_", ".log", new File(DEBUG_COALESCING_PATH));
rasTemp = new RandomAccessFile(outFile, "rw");
logBufferTemp = ras.getChannel().map(MapMode.READ_WRITE, 0, Integer.MAX_VALUE);
logBufferTemp.putLong(0);
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index 4da22454db..4e7ee8e536 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -952,4 +952,28 @@ public class FBUtilities
broadcastInetAddressAndPort = null;
broadcastNativeAddress = null;
}
+
+ /**
+ * Hack to prevent the ugly "illegal access" warnings in Java 11+ like the following.
+ */
+ public static void preventIllegalAccessWarnings()
+ {
+ // Example "annoying" trace:
+ // WARNING: An illegal reflective access operation has occurred
+ // WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:...)
+ // WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
+ // WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
+ // WARNING: All illegal access operations will be denied in a future release
+ try
+ {
+ Class> c = Class.forName("jdk.internal.module.IllegalAccessLogger");
+ Field f = c.getDeclaredField("logger");
+ f.setAccessible(true);
+ f.set(null, null);
+ }
+ catch (Exception e)
+ {
+ // ignore
+ }
+ }
}
diff --git a/src/java/org/apache/cassandra/utils/JMXServerUtils.java b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
index f913baf418..c8f446436f 100644
--- a/src/java/org/apache/cassandra/utils/JMXServerUtils.java
+++ b/src/java/org/apache/cassandra/utils/JMXServerUtils.java
@@ -19,7 +19,10 @@
package org.apache.cassandra.utils;
import java.io.IOException;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
import java.lang.management.ManagementFactory;
+import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.net.Inet6Address;
@@ -44,7 +47,6 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.sun.jmx.remote.security.JMXPluggableAuthenticator;
import org.apache.cassandra.auth.jmx.AuthenticationProxy;
public class JMXServerUtils
@@ -261,6 +263,21 @@ public class JMXServerUtils
private static class JMXPluggableAuthenticatorWrapper implements JMXAuthenticator
{
+ private static final MethodHandle ctorHandle;
+ static
+ {
+ try
+ {
+ Class c = Class.forName("com.sun.jmx.remote.security.JMXPluggableAuthenticator");
+ Constructor ctor = c.getDeclaredConstructor(Map.class);
+ ctorHandle = MethodHandles.lookup().unreflectConstructor(ctor);
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException(e);
+ }
+ }
+
final Map, ?> env;
private JMXPluggableAuthenticatorWrapper(Map, ?> env)
{
@@ -269,8 +286,15 @@ public class JMXServerUtils
public Subject authenticate(Object credentials)
{
- JMXPluggableAuthenticator authenticator = new JMXPluggableAuthenticator(env);
- return authenticator.authenticate(credentials);
+ try
+ {
+ JMXAuthenticator authenticator = (JMXAuthenticator) ctorHandle.invoke(env);
+ return authenticator.authenticate(credentials);
+ }
+ catch (Throwable e)
+ {
+ throw new RuntimeException(e);
+ }
}
}
}
diff --git a/src/java/org/apache/cassandra/utils/MergeIterator.java b/src/java/org/apache/cassandra/utils/MergeIterator.java
index c9e445ba1b..1f196fbee9 100644
--- a/src/java/org/apache/cassandra/utils/MergeIterator.java
+++ b/src/java/org/apache/cassandra/utils/MergeIterator.java
@@ -31,6 +31,7 @@ public abstract class MergeIterator extends AbstractIterator implem
this.reducer = reducer;
}
+ @SuppressWarnings("resource")
public static MergeIterator get(List extends Iterator> sources,
Comparator super In> comparator,
Reducer reducer)
diff --git a/src/java/org/apache/cassandra/utils/NativeLibrary.java b/src/java/org/apache/cassandra/utils/NativeLibrary.java
index 7d5479110b..c02c6126dd 100644
--- a/src/java/org/apache/cassandra/utils/NativeLibrary.java
+++ b/src/java/org/apache/cassandra/utils/NativeLibrary.java
@@ -29,7 +29,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.jna.LastErrorException;
-import sun.nio.ch.FileChannelImpl;
import static org.apache.cassandra.utils.NativeLibrary.OSType.LINUX;
import static org.apache.cassandra.utils.NativeLibrary.OSType.MAC;
@@ -78,7 +77,14 @@ public final class NativeLibrary
static
{
FILE_DESCRIPTOR_FD_FIELD = FBUtilities.getProtectedField(FileDescriptor.class, "fd");
- FILE_CHANNEL_FD_FIELD = FBUtilities.getProtectedField(FileChannelImpl.class, "fd");
+ try
+ {
+ FILE_CHANNEL_FD_FIELD = FBUtilities.getProtectedField(Class.forName("sun.nio.ch.FileChannelImpl"), "fd");
+ }
+ catch (ClassNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
// detect the OS type the JVM is running on and then set the CLibraryWrapper
// instance to a compatable implementation of CLibraryWrapper for that OS type
diff --git a/src/java/org/apache/cassandra/utils/ObjectSizes.java b/src/java/org/apache/cassandra/utils/ObjectSizes.java
index 10dad056c6..fa02ba7bd1 100644
--- a/src/java/org/apache/cassandra/utils/ObjectSizes.java
+++ b/src/java/org/apache/cassandra/utils/ObjectSizes.java
@@ -138,7 +138,7 @@ public class ObjectSizes
* @param str String to calculate memory size of
* @return Total in-memory size of the String
*/
- //@TODO hard coding this to 2 isn't necessarily correct in Java 9
+ //@TODO hard coding this to 2 isn't necessarily correct in Java 11
public static long sizeOf(String str)
{
return STRING_EMPTY_SIZE + sizeOfArray(str.length(), 2);
diff --git a/src/java/org/apache/cassandra/utils/Throwables.java b/src/java/org/apache/cassandra/utils/Throwables.java
index 5ad9686de2..ec4e5c8490 100644
--- a/src/java/org/apache/cassandra/utils/Throwables.java
+++ b/src/java/org/apache/cassandra/utils/Throwables.java
@@ -77,7 +77,7 @@ public final class Throwables
@SafeVarargs
public static void perform(DiscreteAction extends E> ... actions) throws E
{
- perform(Stream.of(actions));
+ Throwables.perform(Stream.of(actions));
}
public static void perform(Stream extends DiscreteAction extends E>> stream, DiscreteAction extends E> ... extra) throws E
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Locks.java b/src/java/org/apache/cassandra/utils/concurrent/Locks.java
deleted file mode 100644
index dcbfe63d33..0000000000
--- a/src/java/org/apache/cassandra/utils/concurrent/Locks.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils.concurrent;
-
-import sun.misc.Unsafe;
-
-import java.lang.reflect.Field;
-
-public class Locks
-{
- static final Unsafe unsafe;
-
- static
- {
- try
- {
- Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
- field.setAccessible(true);
- unsafe = (sun.misc.Unsafe) field.get(null);
- }
- catch (Exception e)
- {
- throw new AssertionError(e);
- }
- }
-
- // enters the object's monitor IF UNSAFE IS PRESENT. If it isn't, this is a no-op.
- public static void monitorEnterUnsafe(Object object)
- {
- if (unsafe != null)
- unsafe.monitorEnter(object);
- }
-
- public static void monitorExitUnsafe(Object object)
- {
- if (unsafe != null)
- unsafe.monitorExit(object);
- }
-}
diff --git a/src/java/org/apache/cassandra/utils/memory/MemoryUtil.java b/src/java/org/apache/cassandra/utils/memory/MemoryUtil.java
index 6c2e6fd0e8..998cbbf1a0 100644
--- a/src/java/org/apache/cassandra/utils/memory/MemoryUtil.java
+++ b/src/java/org/apache/cassandra/utils/memory/MemoryUtil.java
@@ -27,7 +27,6 @@ import com.sun.jna.Native;
import org.apache.cassandra.utils.Architecture;
import sun.misc.Unsafe;
-import sun.nio.ch.DirectBuffer;
public abstract class MemoryUtil
{
@@ -337,7 +336,7 @@ public abstract class MemoryUtil
return;
if (buffer.isDirect())
- setBytes(((DirectBuffer)buffer).address() + start, address, count);
+ setBytes(getAddress(buffer) + start, address, count);
else
setBytes(address, buffer.array(), buffer.arrayOffset() + start, count);
}
diff --git a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
index 1db4b7fd50..16cb45d69d 100644
--- a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
+++ b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
@@ -26,9 +26,9 @@ import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.concurrent.OpOrder;
-import sun.nio.ch.DirectBuffer;
/**
+ * The SlabAllocator is a bump-the-pointer allocator that allocates
@@ -116,7 +116,7 @@ public class SlabAllocator extends MemtableBufferAllocator
public void setDiscarded()
{
for (Region region : offHeapRegions)
- ((DirectBuffer) region.data).cleaner().clean();
+ FileUtils.clean(region.data);
super.setDiscarded();
}
diff --git a/src/java11/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java b/src/java11/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java
new file mode 100644
index 0000000000..ac1a11d21e
--- /dev/null
+++ b/src/java11/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.partitions;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.DecoratedKey;
+
+/**
+ * Java 11 version for the partition-locks in {@link AtomicBTreePartition}.
+ */
+public abstract class AtomicBTreePartitionBase extends AbstractBTreePartition
+{
+ private static final Logger logger = LoggerFactory.getLogger(AtomicBTreePartitionBase.class);
+
+ protected AtomicBTreePartitionBase(DecoratedKey partitionKey)
+ {
+ super(partitionKey);
+ }
+
+ // Replacement for Unsafe.monitorEnter/monitorExit.
+ private final ReentrantLock lock = new ReentrantLock();
+
+ static
+ {
+ logger.info("Initializing Java 11 support for AtomicBTreePartition");
+
+ if (Runtime.version().version().get(0) < 11)
+ throw new RuntimeException("Java 11 required, but found " + Runtime.version());
+ }
+
+ protected final void acquireLock()
+ {
+ lock.lock();
+ }
+
+ protected final void releaseLock()
+ {
+ lock.unlock();
+ }
+}
diff --git a/src/java8/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java b/src/java8/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java
new file mode 100644
index 0000000000..32209e9752
--- /dev/null
+++ b/src/java8/org/apache/cassandra/db/partitions/AtomicBTreePartitionBase.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.partitions;
+
+import sun.misc.Unsafe;
+
+import java.lang.reflect.Field;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.DecoratedKey;
+
+/**
+ * Java 8 version for the partition-locks in {@link AtomicBTreePartition}.
+ */
+public abstract class AtomicBTreePartitionBase extends AbstractBTreePartition
+{
+ private static final Logger logger = LoggerFactory.getLogger(AtomicBTreePartitionBase.class);
+ private static final Unsafe unsafe;
+
+ static
+ {
+ logger.info("Initializing Java 8 support for AtomicBTreePartition");
+
+ if (!System.getProperty("java.version").startsWith("1.8.0"))
+ throw new RuntimeException("Java 8 required, but running " + System.getProperty("java.version"));
+
+ try
+ {
+ // Safety... in case someone builds only on Java 8 but runs on Java 11...
+ sun.misc.Unsafe.class.getDeclaredMethod("monitorEnter", Object.class);
+ sun.misc.Unsafe.class.getDeclaredMethod("monitorExit", Object.class);
+
+ Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
+ field.setAccessible(true);
+ unsafe = (sun.misc.Unsafe) field.get(null);
+ }
+ catch (NoSuchFieldException | NoSuchMethodException e)
+ {
+ throw new RuntimeException("This build of Cassandra has no support for Java 11 as only Java 8 was available during the build. This should never happen.");
+ }
+ catch (Exception e)
+ {
+ throw new AssertionError(e);
+ }
+ }
+
+ protected AtomicBTreePartitionBase(DecoratedKey partitionKey)
+ {
+ super(partitionKey);
+ }
+
+ protected final void acquireLock()
+ {
+ if (unsafe != null)
+ unsafe.monitorEnter(this);
+ }
+
+ protected final void releaseLock()
+ {
+ if (unsafe != null)
+ unsafe.monitorExit(this);
+ }
+}
diff --git a/src/jdkoverride/java/util/zip/CRC32.class b/src/jdkoverride/java/util/zip/CRC32.class
deleted file mode 100644
index 546199e57b..0000000000
Binary files a/src/jdkoverride/java/util/zip/CRC32.class and /dev/null differ
diff --git a/test/unit/org/apache/cassandra/audit/FullQueryLoggerTest.java b/test/unit/org/apache/cassandra/audit/FullQueryLoggerTest.java
index 14f7f23135..0cc809464b 100644
--- a/test/unit/org/apache/cassandra/audit/FullQueryLoggerTest.java
+++ b/test/unit/org/apache/cassandra/audit/FullQueryLoggerTest.java
@@ -46,6 +46,7 @@ import org.apache.cassandra.cql3.CQLTester;
import org.apache.cassandra.cql3.QueryOptions;
import org.apache.cassandra.audit.FullQueryLogger.WeighableMarshallableQuery;
import org.apache.cassandra.audit.FullQueryLogger.WeighableMarshallableBatch;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.transport.ProtocolVersion;
import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.binlog.BinLogTest;
@@ -109,9 +110,9 @@ public class FullQueryLoggerTest extends CQLTester
}
@Test(expected = IllegalArgumentException.class)
- public void testConfigureOverExistingFile() throws Exception
+ public void testConfigureOverExistingFile()
{
- File f = File.createTempFile("foo", "bar");
+ File f = FileUtils.createTempFile("foo", "bar");
f.deleteOnExit();
instance.configure(f.toPath(), "TEST_SECONDLY", true, 1, 1);
}
diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
index 68435a80ec..07ab3dc9e1 100644
--- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
+++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
@@ -168,6 +168,13 @@ public class DatabaseDescriptorRefTest
protected Class> findClass(String name) throws ClassNotFoundException
{
+ if (name.startsWith("java."))
+ // Java 11 does not allow a "custom" class loader (i.e. user code)
+ // to define classes in protected packages (like java, java.sql, etc).
+ // Therefore we have to delegate the call to the delegate class loader
+ // itself.
+ return delegate.loadClass(name);
+
Class> cls = classMap.get(name);
if (cls != null)
return cls;
@@ -182,7 +189,15 @@ public class DatabaseDescriptorRefTest
URL url = delegate.getResource(name.replace('.', '/') + ".class");
if (url == null)
- throw new ClassNotFoundException(name);
+ {
+ // For Java 11: system class files are not readable via getResource(), so
+ // try it this way
+ cls = Class.forName(name, false, delegate);
+ classMap.put(name, cls);
+ return cls;
+ }
+
+ // Java8 way + all non-system class files
try (InputStream in = url.openConnection().getInputStream())
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFJavaTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFJavaTest.java
index 975b21afc2..36e7b2961d 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFJavaTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFJavaTest.java
@@ -106,7 +106,7 @@ public class UFJavaTest extends CQLTester
catch (InvalidRequestException e)
{
Assert.assertTrue(e.getMessage(), e.getMessage().contains("Java source compilation failed"));
- Assert.assertTrue(e.getMessage(), e.getMessage().contains("foobarbaz cannot be resolved to a type"));
+ Assert.assertTrue(e.getMessage(), e.getMessage().contains("foobarbaz cannot be resolved"));
}
}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
index 4e45a8a9e8..7422db4351 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFSecurityTest.java
@@ -57,11 +57,22 @@ public class UFSecurityTest extends CQLTester
assertAccessControlException("System.getProperty(\"foo.bar.baz\"); return 0d;", e);
}
+ String[] cfnSources =
+ { "try { Class.forName(\"" + UDHelper.class.getName() + "\"); } catch (Exception e) { throw new RuntimeException(e); } return 0d;",
+ "try { Class.forName(\"sun.misc.Unsafe\"); } catch (Exception e) { throw new RuntimeException(e); } return 0d;" };
+ for (String source : cfnSources)
+ {
+ assertInvalidMessage("Java UDF validation failed: [call to java.lang.Class.forName()]",
+ "CREATE OR REPLACE FUNCTION " + KEYSPACE + ".invalid_class_access(val double) " +
+ "RETURNS NULL ON NULL INPUT " +
+ "RETURNS double " +
+ "LANGUAGE JAVA\n" +
+ "AS '" + source + "';");
+ }
+
String[][] typesAndSources =
{
- {"", "try { Class.forName(\"" + UDHelper.class.getName() + "\"); } catch (Exception e) { throw new RuntimeException(e); } return 0d;"},
{"sun.misc.Unsafe", "sun.misc.Unsafe.getUnsafe(); return 0d;"},
- {"", "try { Class.forName(\"sun.misc.Unsafe\"); } catch (Exception e) { throw new RuntimeException(e); } return 0d;"},
{"java.nio.file.FileSystems", "try {" +
" java.nio.file.FileSystems.getDefault(); return 0d;" +
"} catch (Exception t) {" +
diff --git a/test/unit/org/apache/cassandra/db/DirectoriesTest.java b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
index fa23560665..7629a5465d 100644
--- a/test/unit/org/apache/cassandra/db/DirectoriesTest.java
+++ b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
@@ -78,7 +78,7 @@ public class DirectoriesTest
.build());
}
- tempDataDir = File.createTempFile("cassandra", "unittest");
+ tempDataDir = FileUtils.createTempFile("cassandra", "unittest");
tempDataDir.delete(); // hack to create a temp dir
tempDataDir.mkdir();
diff --git a/test/unit/org/apache/cassandra/db/MmapFileTest.java b/test/unit/org/apache/cassandra/db/MmapFileTest.java
index 0c67ff7a81..71a218eff8 100644
--- a/test/unit/org/apache/cassandra/db/MmapFileTest.java
+++ b/test/unit/org/apache/cassandra/db/MmapFileTest.java
@@ -29,7 +29,7 @@ import javax.management.ObjectName;
import org.junit.Assert;
import org.junit.Test;
-import sun.nio.ch.DirectBuffer;
+import org.apache.cassandra.io.util.FileUtils;
public class MmapFileTest
{
@@ -48,9 +48,9 @@ public class MmapFileTest
Assert.assertEquals("# of mapped buffers should be 0", Long.valueOf(0L), mmapCount);
Assert.assertEquals("amount of mapped memory should be 0", Long.valueOf(0L), mmapMemoryUsed);
- File f1 = File.createTempFile("MmapFileTest1", ".bin");
- File f2 = File.createTempFile("MmapFileTest2", ".bin");
- File f3 = File.createTempFile("MmapFileTest2", ".bin");
+ File f1 = FileUtils.createTempFile("MmapFileTest1", ".bin");
+ File f2 = FileUtils.createTempFile("MmapFileTest2", ".bin");
+ File f3 = FileUtils.createTempFile("MmapFileTest2", ".bin");
try
{
@@ -87,8 +87,8 @@ public class MmapFileTest
buffer.putInt(42);
buffer.putInt(42);
buffer.putInt(42);
-
- ((DirectBuffer) buffer).cleaner().clean();
+
+ FileUtils.clean(buffer);
}
mmapCount = (Long) mbs.getAttribute(bpmName, "Count");
@@ -115,7 +115,7 @@ public class MmapFileTest
buffer.putInt(42);
buffer.putInt(42);
- ((DirectBuffer) buffer).cleaner().clean();
+ FileUtils.clean(buffer);
}
mmapCount = (Long) mbs.getAttribute(bpmName, "Count");
@@ -140,7 +140,7 @@ public class MmapFileTest
buffer.putInt(42);
buffer.putInt(42);
- ((DirectBuffer) buffer).cleaner().clean();
+ FileUtils.clean(buffer);
}
mmapCount = (Long) mbs.getAttribute(bpmName, "Count");
diff --git a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
index d1c4527ac9..c52fd3de50 100644
--- a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
+++ b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
@@ -165,12 +165,12 @@ public class RowIndexEntryTest extends CQLTester
DoubleSerializer() throws IOException
{
SequentialWriterOption option = SequentialWriterOption.newBuilder().bufferSize(1024).build();
- File f = File.createTempFile("RowIndexEntryTest-", "db");
+ File f = FileUtils.createTempFile("RowIndexEntryTest-", "db");
dataWriterNew = new SequentialWriter(f, option);
columnIndex = new org.apache.cassandra.db.ColumnIndex(header, dataWriterNew, version, Collections.emptyList(),
rieSerializer.indexInfoSerializer());
- f = File.createTempFile("RowIndexEntryTest-", "db");
+ f = FileUtils.createTempFile("RowIndexEntryTest-", "db");
dataWriterOld = new SequentialWriter(f, option);
}
@@ -421,7 +421,7 @@ public class RowIndexEntryTest extends CQLTester
ImmutableBTreePartition partition = Util.getOnlyPartitionUnfiltered(Util.cmd(cfs).build());
- File tempFile = File.createTempFile("row_index_entry_test", null);
+ File tempFile = FileUtils.createTempFile("row_index_entry_test", null);
tempFile.deleteOnExit();
SequentialWriter writer = new SequentialWriter(tempFile);
ColumnIndex columnIndex = RowIndexEntryTest.ColumnIndex.writeAndBuildIndex(partition.unfilteredIterator(), writer, header, Collections.emptySet(), BigFormat.latestVersion);
diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java
index 5513d2af5e..36af54f12e 100644
--- a/test/unit/org/apache/cassandra/db/ScrubTest.java
+++ b/test/unit/org/apache/cassandra/db/ScrubTest.java
@@ -318,7 +318,7 @@ public class ScrubTest
DatabaseDescriptor.setPartitionerUnsafe(new ByteOrderedPartitioner());
// Create out-of-order SSTable
- File tempDir = File.createTempFile("ScrubTest.testScrubOutOfOrder", "").getParentFile();
+ File tempDir = FileUtils.createTempFile("ScrubTest.testScrubOutOfOrder", "").getParentFile();
// create ks/cf directory
File tempDataDir = new File(tempDir, String.join(File.separator, KEYSPACE, CF3));
tempDataDir.mkdirs();
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
index fb7dec3d9d..e1bd96c1a3 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
@@ -38,6 +38,7 @@ import org.junit.runners.Parameterized.Parameters;
import org.apache.cassandra.SchemaLoader;
import org.apache.cassandra.Util;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.schema.TableId;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.config.DatabaseDescriptor;
@@ -500,9 +501,9 @@ public abstract class CommitLogTest
return Collections.singletonMap(EncryptionContext.ENCRYPTION_IV, Hex.bytesToHex(buf));
}
- protected File tmpFile(int version) throws IOException
+ protected File tmpFile(int version)
{
- File logFile = File.createTempFile("CommitLog-" + version + "-", ".log");
+ File logFile = FileUtils.createTempFile("CommitLog-" + version + "-", ".log");
assert logFile.length() == 0;
return logFile;
}
diff --git a/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java b/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
index d9d5e4cc5a..47e1afa898 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
@@ -42,6 +42,7 @@ import org.apache.cassandra.io.compress.ICompressor;
import org.apache.cassandra.io.compress.LZ4Compressor;
import org.apache.cassandra.io.compress.SnappyCompressor;
import org.apache.cassandra.io.util.FileDataInput;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.RandomAccessReader;
import org.apache.cassandra.security.CipherFactory;
import org.apache.cassandra.security.EncryptionUtils;
@@ -93,7 +94,7 @@ public class SegmentReaderTest
compressor.compress(plainTextBuffer, compBuffer);
compBuffer.flip();
- File compressedFile = File.createTempFile("compressed-segment-", ".log");
+ File compressedFile = FileUtils.createTempFile("compressed-segment-", ".log");
compressedFile.deleteOnExit();
FileOutputStream fos = new FileOutputStream(compressedFile);
fos.getChannel().write(compBuffer);
@@ -180,7 +181,7 @@ public class SegmentReaderTest
ByteBuffer compressedBuffer = EncryptionUtils.compress(plainTextBuffer, null, true, context.getCompressor());
Cipher cipher = cipherFactory.getEncryptor(context.getTransparentDataEncryptionOptions().cipher, context.getTransparentDataEncryptionOptions().key_alias);
- File encryptedFile = File.createTempFile("encrypted-segment-", ".log");
+ File encryptedFile = FileUtils.createTempFile("encrypted-segment-", ".log");
encryptedFile.deleteOnExit();
FileChannel channel = new RandomAccessFile(encryptedFile, "rw").getChannel();
channel.write(ByteBufferUtil.bytes(plainTextLength));
diff --git a/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java b/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
index 7325e743e8..9f4cdfb92f 100644
--- a/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
+++ b/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.RandomAccessReader;
import org.apache.cassandra.io.util.SequentialWriter;
import org.apache.cassandra.utils.ByteBufferUtil;
@@ -83,7 +84,7 @@ public class ChecksummedDataInputTest
FBUtilities.updateChecksum(crc, buffer);
// save the buffer to file to create a RAR
- File file = File.createTempFile("testReadMethods", "1");
+ File file = FileUtils.createTempFile("testReadMethods", "1");
file.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(file))
{
@@ -158,7 +159,7 @@ public class ChecksummedDataInputTest
}
// save the buffer to file to create a RAR
- File file = File.createTempFile("testResetCrc", "1");
+ File file = FileUtils.createTempFile("testResetCrc", "1");
file.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(file))
{
@@ -214,7 +215,7 @@ public class ChecksummedDataInputTest
}
// save the buffer to file to create a RAR
- File file = File.createTempFile("testFailedCrc", "1");
+ File file = FileUtils.createTempFile("testFailedCrc", "1");
file.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(file))
{
diff --git a/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java b/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
index c0e6587121..1afb7b4acd 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.db.marshal.Int32Type;
import org.apache.cassandra.db.marshal.LongType;
import org.apache.cassandra.db.marshal.UTF8Type;
import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.utils.MurmurHash;
import org.apache.cassandra.utils.Pair;
@@ -82,7 +83,7 @@ public class OnDiskIndexTest
for (Map.Entry e : data.entrySet())
addAll(builder, e.getKey(), e.getValue());
- File index = File.createTempFile("on-disk-sa-string", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-string", "db");
index.deleteOnExit();
builder.finish(index);
@@ -138,7 +139,7 @@ public class OnDiskIndexTest
for (Map.Entry e : data.entrySet())
addAll(builder, e.getKey(), e.getValue());
- File index = File.createTempFile("on-disk-sa-int", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-int", "db");
index.deleteOnExit();
builder.finish(index);
@@ -226,7 +227,7 @@ public class OnDiskIndexTest
for (int i = 0; i < iterCheckNums.size(); i++)
iterTest.add(iterCheckNums.get(i), keyAt((long) i), i);
- File iterIndex = File.createTempFile("sa-iter", ".db");
+ File iterIndex = FileUtils.createTempFile("sa-iter", ".db");
iterIndex.deleteOnExit();
iterTest.finish(iterIndex);
@@ -278,7 +279,7 @@ public class OnDiskIndexTest
addAll(this, UTF8Type.instance.decompose("Pavel"), keyBuilder(9L, 10L));
}};
- File index = File.createTempFile("on-disk-sa-multi-suffix-match", ".db");
+ File index = FileUtils.createTempFile("on-disk-sa-multi-suffix-match", ".db");
index.deleteOnExit();
builder.finish(index);
@@ -317,7 +318,7 @@ public class OnDiskIndexTest
for (long i = 0; i < numIterations; i++)
builder.add(LongType.instance.decompose(start + i), keyAt(i), i);
- File index = File.createTempFile("on-disk-sa-sparse", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-sparse", "db");
index.deleteOnExit();
builder.finish(index);
@@ -375,7 +376,7 @@ public class OnDiskIndexTest
for (Map.Entry e : data.entrySet())
addAll(builder, e.getKey(), e.getValue());
- File index = File.createTempFile("on-disk-sa-except-test", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-except-test", "db");
index.deleteOnExit();
builder.finish(index);
@@ -419,7 +420,7 @@ public class OnDiskIndexTest
for (Map.Entry e : data.entrySet())
addAll(builder, e.getKey(), e.getValue());
- File index = File.createTempFile("on-disk-sa-except-int-test", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-except-int-test", "db");
index.deleteOnExit();
builder.finish(index);
@@ -443,7 +444,7 @@ public class OnDiskIndexTest
for (long i = lower; i <= upper; i++)
builder.add(LongType.instance.decompose(i), keyAt(i), i);
- File index = File.createTempFile("on-disk-sa-except-long-ranges", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-except-long-ranges", "db");
index.deleteOnExit();
builder.finish(index);
@@ -535,8 +536,8 @@ public class OnDiskIndexTest
builder2.add(e.getKey(), key, position);
}
- File index1 = File.createTempFile("on-disk-sa-int", "db");
- File index2 = File.createTempFile("on-disk-sa-int2", "db");
+ File index1 = FileUtils.createTempFile("on-disk-sa-int", "db");
+ File index2 = FileUtils.createTempFile("on-disk-sa-int2", "db");
index1.deleteOnExit();
index2.deleteOnExit();
@@ -569,7 +570,7 @@ public class OnDiskIndexTest
for (Map.Entry entry : terms.entrySet())
addAll(builder, entry.getKey(), entry.getValue());
- File index = File.createTempFile("on-disk-sa-try-superblocks", ".db");
+ File index = FileUtils.createTempFile("on-disk-sa-try-superblocks", ".db");
index.deleteOnExit();
builder.finish(index);
@@ -597,7 +598,7 @@ public class OnDiskIndexTest
for (long i = 0; i < 100000; i++)
builder.add(LongType.instance.decompose(i), keyAt(i), i);
- File index = File.createTempFile("on-disk-sa-multi-superblock-match", ".db");
+ File index = FileUtils.createTempFile("on-disk-sa-multi-superblock-match", ".db");
index.deleteOnExit();
builder.finish(index);
@@ -652,10 +653,10 @@ public class OnDiskIndexTest
putAll(offsets, keyBuilder(100L + i));
}
- File indexA = File.createTempFile("on-disk-sa-partition-a", ".db");
+ File indexA = FileUtils.createTempFile("on-disk-sa-partition-a", ".db");
indexA.deleteOnExit();
- File indexB = File.createTempFile("on-disk-sa-partition-b", ".db");
+ File indexB = FileUtils.createTempFile("on-disk-sa-partition-b", ".db");
indexB.deleteOnExit();
builderA.finish(indexA);
@@ -682,7 +683,7 @@ public class OnDiskIndexTest
Assert.assertEquals(actual, expected);
- File indexC = File.createTempFile("on-disk-sa-partition-final", ".db");
+ File indexC = FileUtils.createTempFile("on-disk-sa-partition-final", ".db");
indexC.deleteOnExit();
OnDiskIndexBuilder combined = new OnDiskIndexBuilder(UTF8Type.instance, LongType.instance, OnDiskIndexBuilder.Mode.PREFIX);
@@ -733,7 +734,7 @@ public class OnDiskIndexTest
for (Map.Entry e : data.entrySet())
addAll(builder, e.getKey(), e.getValue());
- File index = File.createTempFile("on-disk-sa-prefix-contains-search", "db");
+ File index = FileUtils.createTempFile("on-disk-sa-prefix-contains-search", "db");
index.deleteOnExit();
builder.finish(index);
diff --git a/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java b/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
index 597993af60..72b9e0d338 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
@@ -116,7 +116,7 @@ public class TokenTreeTest
public void testSerializedSize(final TokenTreeBuilder builder) throws Exception
{
builder.finish();
- final File treeFile = File.createTempFile("token-tree-size-test", "tt");
+ final File treeFile = FileUtils.createTempFile("token-tree-size-test", "tt");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
@@ -148,7 +148,7 @@ public class TokenTreeTest
{
builder.finish();
- final File treeFile = File.createTempFile("token-tree-iterate-test1", "tt");
+ final File treeFile = FileUtils.createTempFile("token-tree-iterate-test1", "tt");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
@@ -227,7 +227,7 @@ public class TokenTreeTest
public void buildSerializeIterateAndSkip(TokenTreeBuilder builder, SortedMap tokens) throws Exception
{
builder.finish();
- final File treeFile = File.createTempFile("token-tree-iterate-test2", "tt");
+ final File treeFile = FileUtils.createTempFile("token-tree-iterate-test2", "tt");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
@@ -286,7 +286,7 @@ public class TokenTreeTest
public void skipPastEnd(TokenTreeBuilder builder, SortedMap tokens) throws Exception
{
builder.finish();
- final File treeFile = File.createTempFile("token-tree-skip-past-test", "tt");
+ final File treeFile = FileUtils.createTempFile("token-tree-skip-past-test", "tt");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
@@ -430,7 +430,7 @@ public class TokenTreeTest
private static TokenTree buildTree(TokenTreeBuilder builder) throws Exception
{
builder.finish();
- final File treeFile = File.createTempFile("token-tree-", "db");
+ final File treeFile = FileUtils.createTempFile("token-tree-", "db");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
@@ -648,7 +648,7 @@ public class TokenTreeTest
final TokenTreeBuilder builder = isStatic ? new StaticTokenTreeBuilder(new FakeCombinedTerm(toks)) : new DynamicTokenTreeBuilder(toks);
builder.finish();
- final File treeFile = File.createTempFile("token-tree-get-test", "tt");
+ final File treeFile = FileUtils.createTempFile("token-tree-get-test", "tt");
treeFile.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(treeFile, DEFAULT_OPT))
diff --git a/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java b/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
index 7ffebf166b..e55f6bac91 100644
--- a/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
@@ -449,7 +449,7 @@ public class MappedBufferTest
@Test
public void testOpenWithoutPageBits() throws IOException
{
- File tmp = File.createTempFile("mapped-buffer", "tmp");
+ File tmp = FileUtils.createTempFile("mapped-buffer", "tmp");
tmp.deleteOnExit();
RandomAccessFile file = new RandomAccessFile(tmp, "rw");
@@ -490,7 +490,7 @@ public class MappedBufferTest
private MappedBuffer createTestFile(long numCount, int typeSize, int numPageBits, int padding) throws IOException
{
- final File testFile = File.createTempFile("mapped-buffer-test", "db");
+ final File testFile = FileUtils.createTempFile("mapped-buffer-test", "db");
testFile.deleteOnExit();
RandomAccessFile file = new RandomAccessFile(testFile, "rw");
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
index 06dd27883b..5153310338 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
@@ -54,46 +54,46 @@ public class CompressedRandomAccessReaderTest
public void testResetAndTruncate() throws IOException
{
// test reset in current buffer or previous one
- testResetAndTruncate(File.createTempFile("normal", "1"), false, false, 10, 0);
- testResetAndTruncate(File.createTempFile("normal", "2"), false, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
+ testResetAndTruncate(FileUtils.createTempFile("normal", "1"), false, false, 10, 0);
+ testResetAndTruncate(FileUtils.createTempFile("normal", "2"), false, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
}
@Test
public void testResetAndTruncateCompressed() throws IOException
{
// test reset in current buffer or previous one
- testResetAndTruncate(File.createTempFile("compressed", "1"), true, false, 10, 0);
- testResetAndTruncate(File.createTempFile("compressed", "2"), true, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
+ testResetAndTruncate(FileUtils.createTempFile("compressed", "1"), true, false, 10, 0);
+ testResetAndTruncate(FileUtils.createTempFile("compressed", "2"), true, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
}
@Test
public void testResetAndTruncateCompressedMmap() throws IOException
{
// test reset in current buffer or previous one
- testResetAndTruncate(File.createTempFile("compressed_mmap", "1"), true, true, 10, 0);
- testResetAndTruncate(File.createTempFile("compressed_mmap", "2"), true, true, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_mmap", "1"), true, true, 10, 0);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_mmap", "2"), true, true, CompressionParams.DEFAULT_CHUNK_LENGTH, 0);
}
@Test
public void testResetAndTruncateCompressedUncompressedChunks() throws IOException
{
// test reset in current buffer or previous one
- testResetAndTruncate(File.createTempFile("compressed_uchunks", "1"), true, false, 10, 3);
- testResetAndTruncate(File.createTempFile("compressed_uchunks", "2"), true, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 3);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_uchunks", "1"), true, false, 10, 3);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_uchunks", "2"), true, false, CompressionParams.DEFAULT_CHUNK_LENGTH, 3);
}
@Test
public void testResetAndTruncateCompressedUncompressedChunksMmap() throws IOException
{
// test reset in current buffer or previous one
- testResetAndTruncate(File.createTempFile("compressed_uchunks_mmap", "1"), true, true, 10, 3);
- testResetAndTruncate(File.createTempFile("compressed_uchunks_mmap", "2"), true, true, CompressionParams.DEFAULT_CHUNK_LENGTH, 3);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_uchunks_mmap", "1"), true, true, 10, 3);
+ testResetAndTruncate(FileUtils.createTempFile("compressed_uchunks_mmap", "2"), true, true, CompressionParams.DEFAULT_CHUNK_LENGTH, 3);
}
@Test
public void test6791() throws IOException, ConfigurationException
{
- File f = File.createTempFile("compressed6791_", "3");
+ File f = FileUtils.createTempFile("compressed6791_", "3");
String filename = f.getAbsolutePath();
MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
try(CompressedSequentialWriter writer = new CompressedSequentialWriter(f, filename + ".metadata",
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
index e07381aeec..0c0a33f345 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
@@ -56,22 +56,22 @@ public class CompressedSequentialWriterTest extends SequentialWriterTest
private void runTests(String testName) throws IOException
{
// Test small < 1 chunk data set
- testWrite(File.createTempFile(testName + "_small", "1"), 25, false);
+ testWrite(FileUtils.createTempFile(testName + "_small", "1"), 25, false);
// Test to confirm pipeline w/chunk-aligned data writes works
- testWrite(File.createTempFile(testName + "_chunkAligned", "1"), CompressionParams.DEFAULT_CHUNK_LENGTH, false);
+ testWrite(FileUtils.createTempFile(testName + "_chunkAligned", "1"), CompressionParams.DEFAULT_CHUNK_LENGTH, false);
// Test to confirm pipeline on non-chunk boundaries works
- testWrite(File.createTempFile(testName + "_large", "1"), CompressionParams.DEFAULT_CHUNK_LENGTH * 3 + 100, false);
+ testWrite(FileUtils.createTempFile(testName + "_large", "1"), CompressionParams.DEFAULT_CHUNK_LENGTH * 3 + 100, false);
// Test small < 1 chunk data set
- testWrite(File.createTempFile(testName + "_small", "2"), 25, true);
+ testWrite(FileUtils.createTempFile(testName + "_small", "2"), 25, true);
// Test to confirm pipeline w/chunk-aligned data writes works
- testWrite(File.createTempFile(testName + "_chunkAligned", "2"), CompressionParams.DEFAULT_CHUNK_LENGTH, true);
+ testWrite(FileUtils.createTempFile(testName + "_chunkAligned", "2"), CompressionParams.DEFAULT_CHUNK_LENGTH, true);
// Test to confirm pipeline on non-chunk boundaries works
- testWrite(File.createTempFile(testName + "_large", "2"), CompressionParams.DEFAULT_CHUNK_LENGTH * 3 + 100, true);
+ testWrite(FileUtils.createTempFile(testName + "_large", "2"), CompressionParams.DEFAULT_CHUNK_LENGTH * 3 + 100, true);
}
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
index 617e04eafa..1d37ad4eab 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
@@ -31,6 +31,7 @@ import static org.junit.Assert.*;
import org.junit.Assert;
import org.junit.Test;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.RandomAccessReader;
import org.apache.cassandra.utils.ByteBufferUtil;
@@ -121,7 +122,7 @@ public class CompressorTest
src.flip();
// create a temp file
- File temp = File.createTempFile("tempfile", ".tmp");
+ File temp = FileUtils.createTempFile("tempfile", ".tmp");
temp.deleteOnExit();
// Prepend some random bytes to the output and compress
diff --git a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
index ef1b7853c8..5671e220d8 100644
--- a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
@@ -27,6 +27,7 @@ import org.junit.Test;
import org.apache.cassandra.db.Directories;
import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.Pair;
@@ -42,7 +43,7 @@ public class DescriptorTest
public DescriptorTest() throws IOException
{
// create CF directories, one without CFID and one with it
- tempDataDir = File.createTempFile("DescriptorTest", null).getParentFile();
+ tempDataDir = FileUtils.createTempFile("DescriptorTest", null).getParentFile();
}
@Test
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
index d3eef0134c..441a3b9df6 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.IOException;
import java.util.*;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.schema.Schema;
import org.apache.cassandra.db.*;
@@ -71,7 +72,7 @@ public class SSTableUtils
public static File tempSSTableFile(String keyspaceName, String cfname, int generation) throws IOException
{
- File tempdir = File.createTempFile(keyspaceName, cfname);
+ File tempdir = FileUtils.createTempFile(keyspaceName, cfname);
if(!tempdir.delete() || !tempdir.mkdir())
throw new IOException("Temporary directory creation failed.");
tempdir.deleteOnExit();
diff --git a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
index 7d8150c1a2..8ab1511c37 100644
--- a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
@@ -28,6 +28,7 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.schema.TableMetadata;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.db.SerializationHeader;
@@ -79,7 +80,7 @@ public class MetadataSerializerTest
throws IOException
{
// Serialize to tmp file
- File statsFile = File.createTempFile(Component.STATS.name, null);
+ File statsFile = FileUtils.createTempFile(Component.STATS.name, null);
try (DataOutputStreamPlus out = new BufferedDataOutputStreamPlus(new FileOutputStream(statsFile)))
{
serializer.serialize(metadata, out, version);
diff --git a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
index 2386160090..764190c0f1 100644
--- a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
+++ b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
@@ -143,7 +143,7 @@ public class BufferedRandomAccessFileTest
@Test
public void testReadAndWriteOnCapacity() throws IOException
{
- File tmpFile = File.createTempFile("readtest", "bin");
+ File tmpFile = FileUtils.createTempFile("readtest", "bin");
try (SequentialWriter w = new SequentialWriter(tmpFile))
{
// Fully write the file and sync..
@@ -170,7 +170,7 @@ public class BufferedRandomAccessFileTest
@Test
public void testLength() throws IOException
{
- File tmpFile = File.createTempFile("lengthtest", "bin");
+ File tmpFile = FileUtils.createTempFile("lengthtest", "bin");
try (SequentialWriter w = new SequentialWriter(tmpFile))
{
assertEquals(0, w.length());
@@ -423,7 +423,7 @@ public class BufferedRandomAccessFileTest
@Test
public void testBytesPastMark() throws IOException
{
- File tmpFile = File.createTempFile("overflowtest", "bin");
+ File tmpFile = FileUtils.createTempFile("overflowtest", "bin");
tmpFile.deleteOnExit();
// Create the BRAF by filename instead of by file.
@@ -588,7 +588,7 @@ public class BufferedRandomAccessFileTest
@Test (expected=IllegalArgumentException.class)
public void testSetNegativeLength() throws IOException, IllegalArgumentException
{
- File tmpFile = File.createTempFile("set_negative_length", "bin");
+ File tmpFile = FileUtils.createTempFile("set_negative_length", "bin");
try (SequentialWriter file = new SequentialWriter(tmpFile))
{
file.truncate(-8L);
@@ -597,7 +597,7 @@ public class BufferedRandomAccessFileTest
private SequentialWriter createTempFile(String name) throws IOException
{
- File tempFile = File.createTempFile(name, null);
+ File tempFile = FileUtils.createTempFile(name, null);
tempFile.deleteOnExit();
return new SequentialWriter(tempFile);
@@ -605,7 +605,7 @@ public class BufferedRandomAccessFileTest
private File writeTemporaryFile(byte[] data) throws IOException
{
- File f = File.createTempFile("BRAFTestFile", null);
+ File f = FileUtils.createTempFile("BRAFTestFile", null);
f.deleteOnExit();
FileOutputStream fout = new FileOutputStream(f);
fout.write(data);
diff --git a/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
index 545c3e3c03..4963712fc0 100644
--- a/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
@@ -42,8 +42,8 @@ public class ChecksummedRandomAccessReaderTest
@Test
public void readFully() throws IOException
{
- final File data = File.createTempFile("testReadFully", "data");
- final File crc = File.createTempFile("testReadFully", "crc");
+ final File data = FileUtils.createTempFile("testReadFully", "data");
+ final File crc = FileUtils.createTempFile("testReadFully", "crc");
final byte[] expected = new byte[70 * 1024]; // bit more than crc chunk size, so we can test rebuffering.
ThreadLocalRandom.current().nextBytes(expected);
@@ -70,8 +70,8 @@ public class ChecksummedRandomAccessReaderTest
@Test
public void seek() throws IOException
{
- final File data = File.createTempFile("testSeek", "data");
- final File crc = File.createTempFile("testSeek", "crc");
+ final File data = FileUtils.createTempFile("testSeek", "data");
+ final File crc = FileUtils.createTempFile("testSeek", "crc");
final byte[] dataBytes = new byte[70 * 1024]; // bit more than crc chunk size
ThreadLocalRandom.current().nextBytes(dataBytes);
@@ -104,8 +104,8 @@ public class ChecksummedRandomAccessReaderTest
@Test(expected = CorruptFileException.class)
public void corruptionDetection() throws IOException
{
- final File data = File.createTempFile("corruptionDetection", "data");
- final File crc = File.createTempFile("corruptionDetection", "crc");
+ final File data = FileUtils.createTempFile("corruptionDetection", "data");
+ final File crc = FileUtils.createTempFile("corruptionDetection", "crc");
final byte[] expected = new byte[5 * 1024];
Arrays.fill(expected, (byte) 0);
diff --git a/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java b/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
index cffb49d0f7..2814bab6ec 100644
--- a/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
+++ b/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
@@ -67,7 +67,7 @@ public class MmappedRegionsTest
private static File writeFile(String fileName, ByteBuffer buffer) throws IOException
{
- File ret = File.createTempFile(fileName, "1");
+ File ret = FileUtils.createTempFile(fileName, "1");
ret.deleteOnExit();
try (SequentialWriter writer = new SequentialWriter(ret))
@@ -298,10 +298,10 @@ public class MmappedRegionsTest
MmappedRegions.MAX_SEGMENT_SIZE = 1024;
ByteBuffer buffer = allocateBuffer(128 * 1024);
- File f = File.createTempFile("testMapForCompressionMetadata", "1");
+ File f = FileUtils.createTempFile("testMapForCompressionMetadata", "1");
f.deleteOnExit();
- File cf = File.createTempFile(f.getName() + ".metadata", "1");
+ File cf = FileUtils.createTempFile(f.getName() + ".metadata", "1");
cf.deleteOnExit();
MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
diff --git a/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java b/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
index 7b91ccb12e..7feeb43c96 100644
--- a/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
+++ b/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
@@ -222,7 +222,7 @@ public class NIODataInputStreamTest
is.read(new byte[10]);
assertEquals(8190 - 10 - 4096, is.available());
- File f = File.createTempFile("foo", "bar");
+ File f = FileUtils.createTempFile("foo", "bar");
RandomAccessFile fos = new RandomAccessFile(f, "rw");
fos.write(new byte[10]);
fos.seek(0);
diff --git a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
index 3a34855870..d1dc35d964 100644
--- a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
@@ -266,7 +266,7 @@ public class RandomAccessReaderTest
private static File writeFile(Parameters params) throws IOException
{
- final File f = File.createTempFile("testReadFully", "1");
+ final File f = FileUtils.createTempFile("testReadFully", "1");
f.deleteOnExit();
try(SequentialWriter writer = new SequentialWriter(f))
@@ -319,7 +319,7 @@ public class RandomAccessReaderTest
@Test
public void testReadBytes() throws IOException
{
- File f = File.createTempFile("testReadBytes", "1");
+ File f = FileUtils.createTempFile("testReadBytes", "1");
final String expected = "The quick brown fox jumps over the lazy dog";
try(SequentialWriter writer = new SequentialWriter(f))
@@ -348,7 +348,7 @@ public class RandomAccessReaderTest
@Test
public void testReset() throws IOException
{
- File f = File.createTempFile("testMark", "1");
+ File f = FileUtils.createTempFile("testMark", "1");
final String expected = "The quick brown fox jumps over the lazy dog";
final int numIterations = 10;
@@ -424,7 +424,7 @@ public class RandomAccessReaderTest
private static void testSeek(int numThreads) throws IOException, InterruptedException
{
- final File f = File.createTempFile("testMark", "1");
+ final File f = FileUtils.createTempFile("testMark", "1");
final byte[] expected = new byte[1 << 16];
long seed = System.nanoTime();
diff --git a/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java b/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java
index 1803c51cdf..08c9ddf4e4 100644
--- a/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java
+++ b/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java
@@ -42,7 +42,7 @@ public class RewindableDataInputStreamPlusTest
@Before
public void setup() throws Exception
{
- this.file = new File(System.getProperty("java.io.tmpdir"), "subdir/test.buffer");
+ this.file = new File(FileUtils.getTempDir(), "subdir/test.buffer");
}
@Test
diff --git a/test/unit/org/apache/cassandra/net/async/MessageOutHandlerTest.java b/test/unit/org/apache/cassandra/net/async/MessageOutHandlerTest.java
index 86112ae3cf..9aa26251cf 100644
--- a/test/unit/org/apache/cassandra/net/async/MessageOutHandlerTest.java
+++ b/test/unit/org/apache/cassandra/net/async/MessageOutHandlerTest.java
@@ -19,7 +19,6 @@
package org.apache.cassandra.net.async;
import java.io.IOException;
-import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Optional;
import java.util.UUID;
@@ -31,7 +30,6 @@ import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
-import com.sun.org.apache.bcel.internal.generic.DDIV;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
@@ -49,7 +47,6 @@ import org.apache.cassandra.net.MessageOut;
import org.apache.cassandra.net.MessagingService;
import org.apache.cassandra.net.ParameterType;
import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.UUIDGen;
public class MessageOutHandlerTest
{
diff --git a/test/unit/org/apache/cassandra/schema/MockSchema.java b/test/unit/org/apache/cassandra/schema/MockSchema.java
index 05de7ac567..98bf9ca3ba 100644
--- a/test/unit/org/apache/cassandra/schema/MockSchema.java
+++ b/test/unit/org/apache/cassandra/schema/MockSchema.java
@@ -169,16 +169,9 @@ public class MockSchema
private static File temp(String id)
{
- try
- {
- File file = File.createTempFile(id, "tmp");
- file.deleteOnExit();
- return file;
- }
- catch (IOException e)
- {
- throw new RuntimeException(e);
- }
+ File file = FileUtils.createTempFile(id, "tmp");
+ file.deleteOnExit();
+ return file;
}
public static void cleanup()
diff --git a/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java b/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
index 70b327ec9a..0fd46b8178 100644
--- a/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
+++ b/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
@@ -38,6 +38,7 @@ import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.config.TransparentDataEncryptionOptions;
import org.apache.cassandra.io.compress.ICompressor;
import org.apache.cassandra.io.compress.LZ4Compressor;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.RandomAccessReader;
public class EncryptionUtilsTest
@@ -79,7 +80,7 @@ public class EncryptionUtilsTest
CipherFactory cipherFactory = new CipherFactory(tdeOptions);
Cipher encryptor = cipherFactory.getEncryptor(tdeOptions.cipher, tdeOptions.key_alias);
- File f = File.createTempFile("commitlog-enc-utils-", ".tmp");
+ File f = FileUtils.createTempFile("commitlog-enc-utils-", ".tmp");
f.deleteOnExit();
FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
EncryptionUtils.encryptAndWrite(ByteBuffer.wrap(buf), channel, true, encryptor);
@@ -108,7 +109,7 @@ public class EncryptionUtilsTest
// encrypt
CipherFactory cipherFactory = new CipherFactory(tdeOptions);
Cipher encryptor = cipherFactory.getEncryptor(tdeOptions.cipher, tdeOptions.key_alias);
- File f = File.createTempFile("commitlog-enc-utils-", ".tmp");
+ File f = FileUtils.createTempFile("commitlog-enc-utils-", ".tmp");
f.deleteOnExit();
FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
EncryptionUtils.encryptAndWrite(compressedBuffer, channel, true, encryptor);
diff --git a/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java b/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
index dbca906399..14321fa0fd 100644
--- a/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
+++ b/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
@@ -30,6 +30,7 @@ import org.apache.cassandra.io.compress.CompressedSequentialWriter;
import org.apache.cassandra.io.compress.CompressionMetadata;
import org.apache.cassandra.io.sstable.format.SSTableReader;
import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.SequentialWriterOption;
import org.apache.cassandra.schema.CompressionParams;
import org.apache.cassandra.io.sstable.Component;
@@ -108,7 +109,7 @@ public class CompressedInputStreamTest
assert valuesToCheck != null && valuesToCheck.length > 0;
// write compressed data file of longs
- File parentDir = new File(System.getProperty("java.io.tmpdir"));
+ File parentDir = FileUtils.getTempDir();
Descriptor desc = new Descriptor(parentDir, "ks", "cf", 1);
File tmp = new File(desc.filenameFor(Component.DATA));
MetadataCollector collector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
diff --git a/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java b/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
index 64b0d4f769..d564e41203 100644
--- a/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
+++ b/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
@@ -36,6 +36,7 @@ import net.openhft.chronicle.queue.ExcerptTailer;
import net.openhft.chronicle.queue.RollCycles;
import net.openhft.chronicle.wire.WireOut;
import org.apache.cassandra.Util;
+import org.apache.cassandra.io.util.FileUtils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -46,7 +47,7 @@ public class BinLogTest
{
public static Path tempDir() throws Exception
{
- File f = File.createTempFile("foo", "bar");
+ File f = FileUtils.createTempFile("foo", "bar");
f.delete();
f.mkdir();
return Paths.get(f.getPath());
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java b/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
index 7ea23ebab5..0d1f9f61c7 100644
--- a/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
+++ b/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
@@ -36,6 +36,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicReference;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.utils.ObjectSizes;
import org.apache.cassandra.utils.Pair;
import org.apache.cassandra.utils.concurrent.Ref.Visitor;
@@ -342,7 +343,7 @@ public class RefCountedTest
for (int i = 0; i < entryCount; i += 2)
objects[i] = new Object();
- File f = File.createTempFile("foo", "bar");
+ File f = FileUtils.createTempFile("foo", "bar");
RefCounted.Tidy tidier = new RefCounted.Tidy() {
Object ref = objects;
//Checking we don't get an infinite loop out of traversing file refs
diff --git a/tools/bin/cassandra-stress b/tools/bin/cassandra-stress
index 82a3eb5d27..a5821d358b 100755
--- a/tools/bin/cassandra-stress
+++ b/tools/bin/cassandra-stress
@@ -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/tools/bin/cassandra-stressd b/tools/bin/cassandra-stressd
index 48fbef61db..83f8006ca5 100755
--- a/tools/bin/cassandra-stressd
+++ b/tools/bin/cassandra-stressd
@@ -33,18 +33,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/tools/bin/cassandra.in.sh b/tools/bin/cassandra.in.sh
index 2f0d1ec205..869eb224fa 100644
--- a/tools/bin/cassandra.in.sh
+++ b/tools/bin/cassandra.in.sh
@@ -23,12 +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_bin:$CASSANDRA_HOME/build/classes/stress"
-#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`
+ cassandra_bin="$cassandra_bin:$CASSANDRA_HOME/build/classes/stress"
+ CLASSPATH="$CLASSPATH:$cassandra_bin"
+fi
# the default location for commitlogs, sstables, and saved caches
# if not set in cassandra.yaml
@@ -37,12 +43,89 @@ 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"/tools/lib/*.jar; do
CLASSPATH="$CLASSPATH:$jar"
done
for jar in "$CASSANDRA_HOME"/lib/*.jar; do
CLASSPATH="$CLASSPATH:$jar"
done
+
+
+#
+# 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/tools/bin/compaction-stress b/tools/bin/compaction-stress
index f169f2fc37..d5315614a7 100755
--- a/tools/bin/compaction-stress
+++ b/tools/bin/compaction-stress
@@ -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/tools/bin/sstabledump b/tools/bin/sstabledump
index 92ad5c527e..0f4cfd3e95 100755
--- a/tools/bin/sstabledump
+++ b/tools/bin/sstabledump
@@ -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/tools/bin/sstableexpiredblockers b/tools/bin/sstableexpiredblockers
index c1c7e41b77..a843a644bc 100755
--- a/tools/bin/sstableexpiredblockers
+++ b/tools/bin/sstableexpiredblockers
@@ -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/tools/bin/sstablelevelreset b/tools/bin/sstablelevelreset
index ec602fd3b2..b63fff770e 100755
--- a/tools/bin/sstablelevelreset
+++ b/tools/bin/sstablelevelreset
@@ -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/tools/bin/sstablemetadata b/tools/bin/sstablemetadata
index addf39b538..eb0d44757c 100755
--- a/tools/bin/sstablemetadata
+++ b/tools/bin/sstablemetadata
@@ -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/tools/bin/sstableofflinerelevel b/tools/bin/sstableofflinerelevel
index 4e34515b9f..9e173a6009 100755
--- a/tools/bin/sstableofflinerelevel
+++ b/tools/bin/sstableofflinerelevel
@@ -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/tools/bin/sstablerepairedset b/tools/bin/sstablerepairedset
index 225cd11622..ecd7958746 100755
--- a/tools/bin/sstablerepairedset
+++ b/tools/bin/sstablerepairedset
@@ -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/tools/bin/sstablesplit b/tools/bin/sstablesplit
index 037cb63d8c..77d0a5f186 100755
--- a/tools/bin/sstablesplit
+++ b/tools/bin/sstablesplit
@@ -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/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
index 90bb99a7be..d040cccbe3 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
@@ -30,6 +30,7 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
+import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.stress.util.ResultLogger;
public class SettingsGraph implements Serializable
@@ -54,14 +55,7 @@ public class SettingsGraph implements Serializable
if (inGraphMode())
{
- try
- {
- temporaryLogFile = File.createTempFile("cassandra-stress", ".log");
- }
- catch (IOException e)
- {
- throw new RuntimeException("Cannot open temporary file");
- }
+ temporaryLogFile = FileUtils.createTempFile("cassandra-stress", ".log");
}
else
{