You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by to...@apache.org on 2025/05/18 17:41:20 UTC

(cassandra) branch trunk updated: Migrate sstableloader code to its own tools directory and artifact

This is an automated email from the ASF dual-hosted git repository.

tolbertam pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new f80a234d1e Migrate sstableloader code to its own tools directory and artifact
f80a234d1e is described below

commit f80a234d1ec33dbe927bc8af28f1a290335819a3
Author: Andy Tolbert <68...@users.noreply.github.com>
AuthorDate: Tue May 13 08:23:50 2025 -0500

    Migrate sstableloader code to its own tools directory and artifact
    
    As part of a broader effort to decouple java driver code from the
    server code, this moves sstableloader to its own tools directory.
    
    As sstableloader is also used as a library (CASSANDRA-10637), added
    a new artifact 'cassandra-sstableloader' that will get deployed to
    maven along with 'cassandra-all'.
    
    While I expect this is likely a niche use case, this will allow users
    to continue using BulkExport as a library.
    
    Moves sstableloader-specific targets to its own build.xml in
    tools/sstableloader/build.xml.
    
    Also updates IDE project files and circleci to utilize new
    sstableloader-specific targets.
    
    patch by Andy Tolbert; reviewed by Stefan Miklosovic and Mick Semb Wever for CASSANDRA-20328
---
 .build/README.md                                   |    1 +
 .build/build-sonar.xml                             |    4 +-
 ...-template.xml => cassandra-build-maven-pom.xml} |    0
 ...s-template.xml => cassandra-deps-maven-pom.xml} |    0
 .build/docker/run-tests.sh                         |    4 +-
 ...arent-pom-template.xml => parent-maven-pom.xml} |    2 +-
 .build/run-tests.sh                                |    9 +-
 .build/sstableloader-deps-maven-pom.xml            |   48 +
 .circleci/config.yml                               | 1308 +++++++++++++++++++-
 .circleci/config.yml.FREE                          | 1308 +++++++++++++++++++-
 .circleci/config.yml.PAID                          | 1308 +++++++++++++++++++-
 .circleci/config_template.yml                      |  113 ++
 .circleci/generate.sh                              |   16 +-
 .jenkins/Jenkinsfile                               |    7 +-
 CHANGES.txt                                        |    1 +
 bin/sstableloader                                  |   18 +-
 build.xml                                          |   97 +-
 debian/cassandra.install                           |    2 +-
 debian/rules                                       |    4 +
 ide/idea-iml-file.xml                              |    2 +
 ide/idea/workspace.xml                             |    1 +
 ide/nbproject/ide-actions.xml                      |    1 +
 ide/nbproject/project.xml                          |   45 +-
 redhat/cassandra.spec                              |    3 +
 .../org/apache/cassandra/tools/CmdLineOptions.java |   73 ++
 .../cassandra/tools/StandaloneSSTableUtil.java     |    1 -
 .../apache/cassandra/tools/StandaloneScrubber.java |    1 -
 .../apache/cassandra/tools/StandaloneSplitter.java |    2 +-
 .../apache/cassandra/tools/StandaloneUpgrader.java |    1 -
 .../apache/cassandra/tools/StandaloneVerifier.java |    1 -
 tools/bin/cassandra.in.sh                          |    2 +-
 {bin => tools/bin}/sstableloader                   |    0
 tools/sstableloader/build.xml                      |  125 ++
 .../cassandra/tools/BulkLoadConnectionFactory.java |    0
 .../apache/cassandra/tools/BulkLoadException.java  |    0
 .../org/apache/cassandra/tools/BulkLoader.java     |   50 -
 .../org/apache/cassandra/tools/LoaderOptions.java  |    4 +-
 .../cassandra/utils/NativeSSTableLoaderClient.java |    0
 .../apache/cassandra/tools/LoaderOptionsTest.java  |   42 +-
 39 files changed, 4406 insertions(+), 198 deletions(-)

diff --git a/.build/README.md b/.build/README.md
index 4c15297908..c62424d894 100644
--- a/.build/README.md
+++ b/.build/README.md
@@ -100,6 +100,7 @@ Running other types of tests with docker:
     .build/docker/run-tests.sh -a test
     .build/docker/run-tests.sh -a stress-test
     .build/docker/run-tests.sh -a fqltool-test
+    .build/docker/run-tests.sh -a sstableloader-test
     .build/docker/run-tests.sh -a microbench
     .build/docker/run-tests.sh -a test-cdc
     .build/docker/run-tests.sh -a test-compression
diff --git a/.build/build-sonar.xml b/.build/build-sonar.xml
index 250191064c..31472d0071 100644
--- a/.build/build-sonar.xml
+++ b/.build/build-sonar.xml
@@ -226,9 +226,9 @@
             <arg value="-Dsonar.working.directory=${sonar.workdir}/scanner"/>
             <arg value="-Dsonar.sourceEncoding=UTF-8"/>
             <arg value="-Dsonar.scm.disabled=true"/>
-            <arg value="-Dsonar.sources=${build.src.java},${fqltool.build.src},${stress.build.src}"/>
+            <arg value="-Dsonar.sources=${build.src.java},${fqltool.build.src},${sstableloader.build.src},${stress.build.src}"/>
             <arg value="-Dsonar.java.libraries=${build.dir.lib}/jars/jsr305-*.jar"/>
-            <arg value="-Dsonar.java.binaries=${build.classes.main},${fqltool.build.classes},${stress.build.classes}"/>
+            <arg value="-Dsonar.java.binaries=${build.classes.main},${fqltool.build.classes},${sstableloader.build.classes},${stress.build.classes}"/>
             <arg value="-Dsonar.java.source=11"/>
             <arg value="-Dsonar.projectVersion=${timestamp}"/>
             <arg value="-Dsonar.qualitygate.wait=true"/>
diff --git a/.build/cassandra-build-deps-template.xml b/.build/cassandra-build-maven-pom.xml
similarity index 100%
rename from .build/cassandra-build-deps-template.xml
rename to .build/cassandra-build-maven-pom.xml
diff --git a/.build/cassandra-deps-template.xml b/.build/cassandra-deps-maven-pom.xml
similarity index 100%
rename from .build/cassandra-deps-template.xml
rename to .build/cassandra-deps-maven-pom.xml
diff --git a/.build/docker/run-tests.sh b/.build/docker/run-tests.sh
index 7bb8fc9d1e..3bfbec718a 100755
--- a/.build/docker/run-tests.sh
+++ b/.build/docker/run-tests.sh
@@ -40,7 +40,7 @@ error() {
 
 # legacy argument handling
 case ${1} in
-  "build_dtest_jars" | "stress-test" | "fqltool-test" | "microbench" | "test-burn" | "long-test" | "cqlsh-test" | "simulator-dtest" | "dtest" | "dtest-novnode" | "dtest-latest" | "dtest-large" | "dtest-large-novnode" | "dtest-upgrade" | "dtest-upgrade-novnode"| "dtest-upgrade-large" | "dtest-upgrade-novnode-large" | "test" | "test-cdc" | "test-compression" | "test-oa" | "test-system-keyspace-directory" | "test-latest" | "jvm-dtest" | "jvm-dtest-upgrade" | "jvm-dtest-novnode" | "jvm-dtest [...]
+  "build_dtest_jars" | "stress-test" | "fqltool-test" | "sstableloader-test" | "microbench" | "test-burn" | "long-test" | "cqlsh-test" | "simulator-dtest" | "dtest" | "dtest-novnode" | "dtest-latest" | "dtest-large" | "dtest-large-novnode" | "dtest-upgrade" | "dtest-upgrade-novnode"| "dtest-upgrade-large" | "dtest-upgrade-novnode-large" | "test" | "test-cdc" | "test-compression" | "test-oa" | "test-system-keyspace-directory" | "test-latest" | "jvm-dtest" | "jvm-dtest-upgrade" | "jvm-dtes [...]
     test_type="-a ${1}"
     if [[ -z ${2} ]]; then
       test_list=""
@@ -182,7 +182,7 @@ docker_flags="-m 5g --memory-swap 5g"
 case ${test_target/-repeat/} in
     "build_dtest_jars")
     ;;
-    "stress-test" | "fqltool-test" )
+    "stress-test" | "fqltool-test" | "sstableloader-test" )
         [[ ${mem} -gt $((1 * 1024 * 1024 * 1024 * ${jenkins_executors})) ]] || { error 1 "${target} require minimum docker memory 1g (per jenkins executor (${jenkins_executors})), found ${mem}"; }
     ;;
     # test-burn doesn't have enough tests in it to split beyond 8, and burn and long we want a bit more resources anyway
diff --git a/.build/parent-pom-template.xml b/.build/parent-maven-pom.xml
similarity index 99%
rename from .build/parent-pom-template.xml
rename to .build/parent-maven-pom.xml
index 714f18b8e5..a42991bca4 100644
--- a/.build/parent-pom-template.xml
+++ b/.build/parent-maven-pom.xml
@@ -671,7 +671,7 @@
       <dependency>
         <groupId>org.apache.cassandra</groupId>
         <artifactId>cassandra-all</artifactId>
-        <version>4.1-alpha2-SNAPSHOT</version>
+        <version>@version@</version>
       </dependency>
       <dependency>
         <groupId>io.dropwizard.metrics</groupId>
diff --git a/.build/run-tests.sh b/.build/run-tests.sh
index ad2e04b40b..0c5c5ce558 100755
--- a/.build/run-tests.sh
+++ b/.build/run-tests.sh
@@ -66,7 +66,7 @@ print_help() {
 
 # legacy argument handling
 case ${1} in
-  "build_dtest_jars" | "stress-test" | "fqltool-test" | "microbench" | "test-burn" | "long-test" | "cqlsh-test" | "simulator-dtest" | "test" | "test-cdc" | "test-compression" | "test-oa" | "test-system-keyspace-directory" | "test-latest" | "jvm-dtest" | "jvm-dtest-upgrade" | "jvm-dtest-novnode" | "jvm-dtest-upgrade-novnode")
+  "build_dtest_jars" | "stress-test" | "fqltool-test" | "sstableloader-test" | "microbench" | "test-burn" | "long-test" | "cqlsh-test" | "simulator-dtest" | "test" | "test-cdc" | "test-compression" | "test-oa" | "test-system-keyspace-directory" | "test-latest" | "jvm-dtest" | "jvm-dtest-upgrade" | "jvm-dtest-novnode" | "jvm-dtest-upgrade-novnode")
     test_type="-a ${1}"
     if [[ -z ${2} ]]; then
       test_list=""
@@ -285,7 +285,7 @@ _main() {
   # check split_chunk is compatible with target (if not a regexp)
   if [[ "${_split_chunk}" =~ ^\d+/\d+$ ]] && [[ "1/1" != "${split_chunk}" ]] ; then
     case ${target} in
-      "stress-test" | "fqltool-test" | "microbench" | "cqlsh-test" | "simulator-dtest")
+      "stress-test" | "fqltool-test" | "sstableloader-test" | "microbench" | "cqlsh-test" | "simulator-dtest")
           error 1 "Target ${target} does not suport splits."
           ;;
         *)
@@ -344,6 +344,11 @@ _main() {
       ant fqltool-build-test ${ANT_TEST_OPTS}
       ant $target ${ANT_TEST_OPTS} || echo "failed ${target} ${split_chunk}"
       ;;
+    "sstableloader-test")
+      # hard fail on test compilation, but dont fail the test run so unstable test reports are processed
+      ant sstableloader-build-test ${ANT_TEST_OPTS}
+      ant $target ${ANT_TEST_OPTS} || echo "failed ${target} ${split_chunk}"
+      ;;
     "microbench")
       ant $target ${ANT_TEST_OPTS} -Dmaven.test.failure.ignore=true
       ;;
diff --git a/.build/sstableloader-deps-maven-pom.xml b/.build/sstableloader-deps-maven-pom.xml
new file mode 100644
index 0000000000..2eeafd891e
--- /dev/null
+++ b/.build/sstableloader-deps-maven-pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.apache.cassandra</groupId>
+    <artifactId>cassandra-parent</artifactId>
+    <version>@version@</version>
+    <relativePath>@final.name@-parent.pom</relativePath>
+  </parent>
+  <artifactId>cassandra-sstableloader</artifactId>
+  <version>@version@</version>
+  <name>Apache Cassandra SSTableLoader</name>
+  <description>Standalone SSTableLoader for Apache Cassandra.</description>
+  <url>https://cassandra.apache.org</url>
+  <inceptionYear>2025</inceptionYear>
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
+    </license>
+  </licenses>
+  <scm>
+    <connection>scm:https://gitbox.apache.org/repos/asf/cassandra.git</connection>
+    <developerConnection>scm:https://gitbox.apache.org/repos/asf/cassandra.git</developerConnection>
+    <url>https://gitbox.apache.org/repos/asf?p=cassandra.git</url>
+  </scm>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.cassandra</groupId>
+      <artifactId>cassandra-all</artifactId>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 864919b8f4..edcbb164c3 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -53,7 +53,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -84,6 +84,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -191,6 +193,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -308,6 +312,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -373,6 +379,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -431,7 +439,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -462,6 +470,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -595,6 +605,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -660,6 +672,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -778,6 +792,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -886,6 +902,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1040,6 +1058,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1172,6 +1192,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1281,6 +1303,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1398,6 +1422,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1457,7 +1483,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1488,6 +1514,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1606,6 +1634,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1714,6 +1744,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1773,7 +1805,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1804,6 +1836,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1912,6 +1946,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2045,6 +2081,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2199,6 +2237,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2316,6 +2356,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2375,7 +2417,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2406,6 +2448,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2514,6 +2558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2622,6 +2668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2681,7 +2729,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2712,6 +2760,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2735,6 +2785,80 @@ jobs:
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j11_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -2770,7 +2894,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2801,6 +2925,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2919,6 +3045,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3019,6 +3147,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -3114,6 +3243,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3199,6 +3330,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3223,6 +3356,97 @@ jobs:
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
   j11_dtests_large_vnode_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -3332,6 +3556,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3417,6 +3643,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3476,7 +3704,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -3507,6 +3735,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3625,6 +3855,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3758,6 +3990,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3876,6 +4110,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3976,6 +4212,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -4071,6 +4308,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4177,6 +4416,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4294,6 +4535,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4353,7 +4596,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4384,6 +4627,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4501,6 +4746,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4572,6 +4819,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4631,7 +4880,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4662,6 +4911,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4721,7 +4972,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4752,6 +5003,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4855,6 +5108,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4927,6 +5182,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4986,7 +5243,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5017,6 +5274,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5130,6 +5389,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5248,6 +5509,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5320,6 +5583,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5379,7 +5644,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5410,6 +5675,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5517,6 +5784,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5649,6 +5918,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5767,6 +6038,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5885,6 +6158,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6018,6 +6293,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6076,7 +6353,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6107,6 +6384,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6192,6 +6471,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6325,6 +6606,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6384,7 +6667,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6415,6 +6698,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6486,6 +6771,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6570,6 +6857,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6678,6 +6967,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6737,7 +7028,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6768,6 +7059,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6827,7 +7120,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6858,6 +7151,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6967,6 +7262,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7031,6 +7328,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7139,6 +7438,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7257,6 +7558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7365,6 +7668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7473,6 +7778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7590,6 +7897,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7697,6 +8006,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7814,6 +8125,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7885,6 +8198,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7991,6 +8306,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8050,7 +8367,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8081,6 +8398,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8166,6 +8485,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8230,6 +8551,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8315,6 +8638,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8424,6 +8749,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8541,6 +8868,173 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8599,7 +9093,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8630,6 +9124,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8714,6 +9210,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8772,7 +9270,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8803,6 +9301,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8875,6 +9375,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8933,7 +9435,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8964,6 +9466,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9048,6 +9552,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9107,7 +9613,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9138,6 +9644,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9270,6 +9778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9328,7 +9838,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9359,6 +9869,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9417,7 +9929,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9448,6 +9960,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9481,302 +9995,587 @@ workflows:
     - j11_build:
         requires:
         - start_j11_build
+        upstream:
+          start_j11_build:
+          - success
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
         requires:
         - start_j11_unit_tests
         - j11_build
+        upstream:
+          start_j11_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests:
         type: approval
     - j11_jvm_dtests:
         requires:
         - start_j11_jvm_dtests
         - j11_build
+        upstream:
+          start_j11_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests_latest_vnode:
         type: approval
     - j11_jvm_dtests_latest_vnode:
         requires:
         - start_j11_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j11_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j11_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_simulator_dtests:
         type: approval
     - j11_simulator_dtests:
         requires:
         - start_j11_simulator_dtests
         - j11_build
+        upstream:
+          start_j11_simulator_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_cython_tests:
         type: approval
     - j11_cqlshlib_cython_tests:
         requires:
         - start_j11_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j11_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_oa:
         type: approval
     - j11_utests_oa:
         requires:
         - start_j11_utests_oa
         - j11_build
+        upstream:
+          start_j11_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j11_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_j11_utests_long
         - j11_build
+        upstream:
+          start_j11_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j11_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_j11_utests_cdc
         - j11_build
+        upstream:
+          start_j11_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j11_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_j11_utests_compression
         - j11_build
+        upstream:
+          start_j11_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j11_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_latest:
         type: approval
     - j11_utests_latest:
         requires:
         - start_j11_utests_latest
         - j11_build
+        upstream:
+          start_j11_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j11_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_j11_utests_stress
         - j11_build
+        upstream:
+          start_j11_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j11_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_j11_utests_fqltool
         - j11_build
+        upstream:
+          start_j11_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j11_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_j11_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_j11_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j11_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - start_j11_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j11_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j11_dtest_jars_build:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_j11_dtest_jars_build
+        upstream:
+          j11_build:
+          - success
+          start_j11_dtest_jars_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_jvm_upgrade_dtests:
         requires:
         - start_jvm_upgrade_dtests
         - j11_dtest_jars_build
+        upstream:
+          start_jvm_upgrade_dtests:
+          - success
+          j11_dtest_jars_build:
+          - success
     - start_j11_dtests:
         type: approval
     - j11_dtests:
         requires:
         - start_j11_dtests
         - j11_build
+        upstream:
+          start_j11_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_vnode:
         type: approval
     - j11_dtests_vnode:
         requires:
         - start_j11_dtests_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_latest:
         type: approval
     - j11_dtests_latest:
         requires:
         - start_j11_dtests_latest
         - j11_build
+        upstream:
+          start_j11_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j11_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j11_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large_vnode:
         type: approval
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests:
         type: approval
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests_latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - start_j11_upgrade_dtests
         - j11_build
+        upstream:
+          start_j11_upgrade_dtests:
+          - success
+          j11_build:
+          - success
   java11_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -9784,207 +10583,428 @@ workflows:
     - j11_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j11_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_simulator_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - j17_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_jvm_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_jvm_upgrade_dtests:
+          - success
     - j11_jvm_upgrade_dtests:
         requires:
         - j11_dtest_jars_build
+        upstream:
+          j11_dtest_jars_build:
+          - success
     - j11_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_cqlsh_dtests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - j11_build
         - start_j11_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_j11_upgrade_dtests:
+          - success
   java17_separate_tests:
     jobs:
     - start_j17_build:
@@ -9992,142 +11012,276 @@ workflows:
     - j17_build:
         requires:
         - start_j17_build
+        upstream:
+          start_j17_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j17_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j17_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j17_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j17_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j17_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j17_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j17_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j17_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j17_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j17_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j17_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j17_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j17_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
   java17_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -10135,101 +11289,207 @@ workflows:
     - j17_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j17_unit_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_oa:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_utests_long
         - j17_build
+        upstream:
+          start_utests_long:
+          - success
+          j17_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j17_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j17_build
+        upstream:
+          start_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j17_build
+        upstream:
+          start_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j17_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j17_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
diff --git a/.circleci/config.yml.FREE b/.circleci/config.yml.FREE
index 864919b8f4..edcbb164c3 100644
--- a/.circleci/config.yml.FREE
+++ b/.circleci/config.yml.FREE
@@ -53,7 +53,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -84,6 +84,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -191,6 +193,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -308,6 +312,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -373,6 +379,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -431,7 +439,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -462,6 +470,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -595,6 +605,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -660,6 +672,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -778,6 +792,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -886,6 +902,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1040,6 +1058,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1172,6 +1192,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1281,6 +1303,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1398,6 +1422,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1457,7 +1483,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1488,6 +1514,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1606,6 +1634,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1714,6 +1744,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1773,7 +1805,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1804,6 +1836,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1912,6 +1946,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2045,6 +2081,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2199,6 +2237,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2316,6 +2356,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2375,7 +2417,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2406,6 +2448,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2514,6 +2558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2622,6 +2668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2681,7 +2729,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2712,6 +2760,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2735,6 +2785,80 @@ jobs:
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j11_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -2770,7 +2894,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2801,6 +2925,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2919,6 +3045,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3019,6 +3147,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -3114,6 +3243,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3199,6 +3330,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3223,6 +3356,97 @@ jobs:
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
   j11_dtests_large_vnode_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -3332,6 +3556,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3417,6 +3643,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3476,7 +3704,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -3507,6 +3735,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3625,6 +3855,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3758,6 +3990,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3876,6 +4110,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3976,6 +4212,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -4071,6 +4308,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4177,6 +4416,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4294,6 +4535,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4353,7 +4596,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4384,6 +4627,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4501,6 +4746,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4572,6 +4819,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4631,7 +4880,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4662,6 +4911,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4721,7 +4972,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4752,6 +5003,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4855,6 +5108,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4927,6 +5182,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4986,7 +5243,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5017,6 +5274,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5130,6 +5389,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5248,6 +5509,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5320,6 +5583,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5379,7 +5644,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5410,6 +5675,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5517,6 +5784,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5649,6 +5918,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5767,6 +6038,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5885,6 +6158,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6018,6 +6293,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6076,7 +6353,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6107,6 +6384,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6192,6 +6471,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6325,6 +6606,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6384,7 +6667,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6415,6 +6698,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6486,6 +6771,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6570,6 +6857,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6678,6 +6967,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6737,7 +7028,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6768,6 +7059,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6827,7 +7120,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6858,6 +7151,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6967,6 +7262,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7031,6 +7328,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7139,6 +7438,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7257,6 +7558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7365,6 +7668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7473,6 +7778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7590,6 +7897,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7697,6 +8006,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7814,6 +8125,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7885,6 +8198,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7991,6 +8306,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8050,7 +8367,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8081,6 +8398,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8166,6 +8485,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8230,6 +8551,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8315,6 +8638,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8424,6 +8749,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8541,6 +8868,173 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8599,7 +9093,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8630,6 +9124,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8714,6 +9210,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8772,7 +9270,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8803,6 +9301,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8875,6 +9375,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8933,7 +9435,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8964,6 +9466,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9048,6 +9552,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9107,7 +9613,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9138,6 +9644,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9270,6 +9778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9328,7 +9838,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9359,6 +9869,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9417,7 +9929,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9448,6 +9960,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9481,302 +9995,587 @@ workflows:
     - j11_build:
         requires:
         - start_j11_build
+        upstream:
+          start_j11_build:
+          - success
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
         requires:
         - start_j11_unit_tests
         - j11_build
+        upstream:
+          start_j11_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests:
         type: approval
     - j11_jvm_dtests:
         requires:
         - start_j11_jvm_dtests
         - j11_build
+        upstream:
+          start_j11_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests_latest_vnode:
         type: approval
     - j11_jvm_dtests_latest_vnode:
         requires:
         - start_j11_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j11_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j11_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_simulator_dtests:
         type: approval
     - j11_simulator_dtests:
         requires:
         - start_j11_simulator_dtests
         - j11_build
+        upstream:
+          start_j11_simulator_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_cython_tests:
         type: approval
     - j11_cqlshlib_cython_tests:
         requires:
         - start_j11_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j11_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_oa:
         type: approval
     - j11_utests_oa:
         requires:
         - start_j11_utests_oa
         - j11_build
+        upstream:
+          start_j11_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j11_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_j11_utests_long
         - j11_build
+        upstream:
+          start_j11_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j11_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_j11_utests_cdc
         - j11_build
+        upstream:
+          start_j11_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j11_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_j11_utests_compression
         - j11_build
+        upstream:
+          start_j11_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j11_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_latest:
         type: approval
     - j11_utests_latest:
         requires:
         - start_j11_utests_latest
         - j11_build
+        upstream:
+          start_j11_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j11_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_j11_utests_stress
         - j11_build
+        upstream:
+          start_j11_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j11_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_j11_utests_fqltool
         - j11_build
+        upstream:
+          start_j11_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j11_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_j11_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_j11_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j11_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - start_j11_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j11_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j11_dtest_jars_build:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_j11_dtest_jars_build
+        upstream:
+          j11_build:
+          - success
+          start_j11_dtest_jars_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_jvm_upgrade_dtests:
         requires:
         - start_jvm_upgrade_dtests
         - j11_dtest_jars_build
+        upstream:
+          start_jvm_upgrade_dtests:
+          - success
+          j11_dtest_jars_build:
+          - success
     - start_j11_dtests:
         type: approval
     - j11_dtests:
         requires:
         - start_j11_dtests
         - j11_build
+        upstream:
+          start_j11_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_vnode:
         type: approval
     - j11_dtests_vnode:
         requires:
         - start_j11_dtests_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_latest:
         type: approval
     - j11_dtests_latest:
         requires:
         - start_j11_dtests_latest
         - j11_build
+        upstream:
+          start_j11_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j11_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j11_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large_vnode:
         type: approval
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests:
         type: approval
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests_latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - start_j11_upgrade_dtests
         - j11_build
+        upstream:
+          start_j11_upgrade_dtests:
+          - success
+          j11_build:
+          - success
   java11_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -9784,207 +10583,428 @@ workflows:
     - j11_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j11_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_simulator_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - j17_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_jvm_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_jvm_upgrade_dtests:
+          - success
     - j11_jvm_upgrade_dtests:
         requires:
         - j11_dtest_jars_build
+        upstream:
+          j11_dtest_jars_build:
+          - success
     - j11_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_cqlsh_dtests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - j11_build
         - start_j11_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_j11_upgrade_dtests:
+          - success
   java17_separate_tests:
     jobs:
     - start_j17_build:
@@ -9992,142 +11012,276 @@ workflows:
     - j17_build:
         requires:
         - start_j17_build
+        upstream:
+          start_j17_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j17_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j17_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j17_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j17_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j17_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j17_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j17_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j17_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j17_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j17_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j17_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j17_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j17_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
   java17_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -10135,101 +11289,207 @@ workflows:
     - j17_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j17_unit_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_oa:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_utests_long
         - j17_build
+        upstream:
+          start_utests_long:
+          - success
+          j17_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j17_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j17_build
+        upstream:
+          start_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j17_build
+        upstream:
+          start_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j17_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j17_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
diff --git a/.circleci/config.yml.PAID b/.circleci/config.yml.PAID
index 02e3aed428..e10097a426 100644
--- a/.circleci/config.yml.PAID
+++ b/.circleci/config.yml.PAID
@@ -53,7 +53,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified te [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -84,6 +84,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -191,6 +193,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -308,6 +312,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -373,6 +379,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -431,7 +439,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -462,6 +470,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -595,6 +605,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -660,6 +672,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -778,6 +792,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -886,6 +902,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1040,6 +1058,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1172,6 +1192,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1281,6 +1303,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1398,6 +1422,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1457,7 +1483,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1488,6 +1514,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1606,6 +1634,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1714,6 +1744,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1773,7 +1805,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1804,6 +1836,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -1912,6 +1946,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2045,6 +2081,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2199,6 +2237,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2316,6 +2356,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2375,7 +2417,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2406,6 +2448,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2514,6 +2558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2622,6 +2668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2681,7 +2729,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and au [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2712,6 +2760,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2735,6 +2785,80 @@ jobs:
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j11_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -2770,7 +2894,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2801,6 +2925,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -2919,6 +3045,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3019,6 +3147,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -3114,6 +3243,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3199,6 +3330,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3223,6 +3356,97 @@ jobs:
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 25
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
   j11_dtests_large_vnode_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -3332,6 +3556,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3417,6 +3643,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3476,7 +3704,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -3507,6 +3735,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3625,6 +3855,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3758,6 +3990,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3876,6 +4110,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -3976,6 +4212,7 @@ jobs:
                     $target == "test-oa" || \
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
+                    $target == "sstableloader-test" || \
                     $target == "long-test" || \
                     $target == "stress-test" || \
                     $target == "test-simulator-dtest" ]]; then
@@ -4071,6 +4308,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4177,6 +4416,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4294,6 +4535,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4353,7 +4596,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4384,6 +4627,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4501,6 +4746,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4572,6 +4819,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4631,7 +4880,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4662,6 +4911,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4721,7 +4972,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4752,6 +5003,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4855,6 +5108,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4927,6 +5182,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -4986,7 +5243,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5017,6 +5274,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5130,6 +5389,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5248,6 +5509,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5320,6 +5583,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5379,7 +5644,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5410,6 +5675,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5517,6 +5784,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5649,6 +5918,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5767,6 +6038,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -5885,6 +6158,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6018,6 +6293,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6076,7 +6353,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6107,6 +6384,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6192,6 +6471,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6325,6 +6606,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6384,7 +6667,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6415,6 +6698,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6486,6 +6771,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6570,6 +6857,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6678,6 +6967,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6737,7 +7028,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6768,6 +7059,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6827,7 +7120,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6858,6 +7151,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -6967,6 +7262,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7031,6 +7328,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7139,6 +7438,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7257,6 +7558,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7365,6 +7668,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7473,6 +7778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7590,6 +7897,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7697,6 +8006,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7814,6 +8125,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7885,6 +8198,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -7991,6 +8306,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8050,7 +8367,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8081,6 +8398,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8166,6 +8485,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8230,6 +8551,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8315,6 +8638,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8424,6 +8749,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8541,6 +8868,173 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-17-openjdk-amd64
+  j11_utests_sstableloader_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 25
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_SSTABLELOADER_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_SSTABLELOADER_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specifie [...]
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j17_utests_sstableloader:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run Unit Tests (sstableloader-test)
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant sstableloader-test -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8599,7 +9093,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and  [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8630,6 +9124,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8714,6 +9210,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8772,7 +9270,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8803,6 +9301,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8875,6 +9375,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -8933,7 +9435,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically de [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8964,6 +9466,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9048,6 +9552,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9107,7 +9613,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automati [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9138,6 +9644,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9270,6 +9778,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9328,7 +9838,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9359,6 +9869,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9417,7 +9929,7 @@ jobs:
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automa [...]
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9448,6 +9960,8 @@ jobs:
     - REPEATED_UTESTS_COUNT: 500
     - REPEATED_UTESTS_FQLTOOL: null
     - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_SSTABLELOADER: null
+    - REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
     - REPEATED_UTESTS_LONG: null
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
@@ -9481,302 +9995,587 @@ workflows:
     - j11_build:
         requires:
         - start_j11_build
+        upstream:
+          start_j11_build:
+          - success
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
         requires:
         - start_j11_unit_tests
         - j11_build
+        upstream:
+          start_j11_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests:
         type: approval
     - j11_jvm_dtests:
         requires:
         - start_j11_jvm_dtests
         - j11_build
+        upstream:
+          start_j11_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_jvm_dtests_latest_vnode:
         type: approval
     - j11_jvm_dtests_latest_vnode:
         requires:
         - start_j11_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j11_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j11_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j11_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_simulator_dtests:
         type: approval
     - j11_simulator_dtests:
         requires:
         - start_j11_simulator_dtests
         - j11_build
+        upstream:
+          start_j11_simulator_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlshlib_cython_tests:
         type: approval
     - j11_cqlshlib_cython_tests:
         requires:
         - start_j11_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j11_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j11_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j11_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_oa:
         type: approval
     - j11_utests_oa:
         requires:
         - start_j11_utests_oa
         - j11_build
+        upstream:
+          start_j11_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j11_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_j11_utests_long
         - j11_build
+        upstream:
+          start_j11_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j11_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_j11_utests_cdc
         - j11_build
+        upstream:
+          start_j11_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j11_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_j11_utests_compression
         - j11_build
+        upstream:
+          start_j11_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j11_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_latest:
         type: approval
     - j11_utests_latest:
         requires:
         - start_j11_utests_latest
         - j11_build
+        upstream:
+          start_j11_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j11_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_j11_utests_stress
         - j11_build
+        upstream:
+          start_j11_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j11_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_j11_utests_fqltool
         - j11_build
+        upstream:
+          start_j11_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j11_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_j11_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_j11_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j11_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j11_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_j11_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - start_j11_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j11_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_j11_dtest_jars_build:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_j11_dtest_jars_build
+        upstream:
+          j11_build:
+          - success
+          start_j11_dtest_jars_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_jvm_upgrade_dtests:
         requires:
         - start_jvm_upgrade_dtests
         - j11_dtest_jars_build
+        upstream:
+          start_jvm_upgrade_dtests:
+          - success
+          j11_dtest_jars_build:
+          - success
     - start_j11_dtests:
         type: approval
     - j11_dtests:
         requires:
         - start_j11_dtests
         - j11_build
+        upstream:
+          start_j11_dtests:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_vnode:
         type: approval
     - j11_dtests_vnode:
         requires:
         - start_j11_dtests_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_latest:
         type: approval
     - j11_dtests_latest:
         requires:
         - start_j11_dtests_latest
         - j11_build
+        upstream:
+          start_j11_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j11_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j11_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j11_dtests_large_vnode:
         type: approval
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j11_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j11_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests:
         type: approval
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - start_j11_cqlsh_tests
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j11_cqlsh_tests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j11_build:
+          - success
     - start_j17_cqlsh_tests_latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh_tests_latest
         - j11_build
+        upstream:
+          start_j17_cqlsh_tests_latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - start_j11_upgrade_dtests
         - j11_build
+        upstream:
+          start_j11_upgrade_dtests:
+          - success
+          j11_build:
+          - success
   java11_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -9784,207 +10583,428 @@ workflows:
     - j11_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j11_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_simulator_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_unit_tests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_oa:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_utests_long:
         type: approval
     - j11_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - j17_utests_long:
         requires:
         - start_utests_long
         - j11_build
+        upstream:
+          start_utests_long:
+          - success
+          j11_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j11_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j11_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j11_build:
+          - success
     - start_utests_compression:
         type: approval
     - j11_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j11_build
+        upstream:
+          start_utests_compression:
+          - success
+          j11_build:
+          - success
     - start_utests_stress:
         type: approval
     - j11_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j11_build
+        upstream:
+          start_utests_stress:
+          - success
+          j11_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j11_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j11_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j11_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j11_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j11_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j11_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j11_build:
+          - success
     - start_jvm_upgrade_dtests:
         type: approval
     - j11_dtest_jars_build:
         requires:
         - j11_build
         - start_jvm_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_jvm_upgrade_dtests:
+          - success
     - j11_jvm_upgrade_dtests:
         requires:
         - j11_dtest_jars_build
+        upstream:
+          j11_dtest_jars_build:
+          - success
     - j11_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_dtests_large_vnode:
         requires:
         - start_j11_dtests_large
         - j11_build
+        upstream:
+          start_j11_dtests_large:
+          - success
+          j11_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j11_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j11_cqlsh_dtests_latest:
         type: approval
     - j11_cqlsh_dtests_py38_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j11_cqlsh_dtests_py311_latest:
         requires:
         - start_j11_cqlsh_dtests_latest
         - j11_build
+        upstream:
+          start_j11_cqlsh_dtests_latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j11_build
+        upstream:
+          j11_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j11_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j11_build:
+          - success
     - start_j11_upgrade_dtests:
         type: approval
     - j11_upgrade_dtests:
         requires:
         - j11_build
         - start_j11_upgrade_dtests
+        upstream:
+          j11_build:
+          - success
+          start_j11_upgrade_dtests:
+          - success
   java17_separate_tests:
     jobs:
     - start_j17_build:
@@ -9992,142 +11012,276 @@ workflows:
     - j17_build:
         requires:
         - start_j17_build
+        upstream:
+          start_j17_build:
+          - success
     - start_j17_unit_tests:
         type: approval
     - j17_unit_tests:
         requires:
         - start_j17_unit_tests
         - j17_build
+        upstream:
+          start_j17_unit_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests:
         type: approval
     - j17_jvm_dtests:
         requires:
         - start_j17_jvm_dtests
         - j17_build
+        upstream:
+          start_j17_jvm_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_jvm_dtests_latest_vnode:
         type: approval
     - j17_jvm_dtests_latest_vnode:
         requires:
         - start_j17_jvm_dtests_latest_vnode
         - j17_build
+        upstream:
+          start_j17_jvm_dtests_latest_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_tests:
         type: approval
     - j17_cqlshlib_tests:
         requires:
         - start_j17_cqlshlib_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlshlib_cython_tests:
         type: approval
     - j17_cqlshlib_cython_tests:
         requires:
         - start_j17_cqlshlib_cython_tests
         - j17_build
+        upstream:
+          start_j17_cqlshlib_cython_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests:
         type: approval
     - j17_dtests:
         requires:
         - start_j17_dtests
         - j17_build
+        upstream:
+          start_j17_dtests:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_vnode:
         type: approval
     - j17_dtests_vnode:
         requires:
         - start_j17_dtests_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_latest:
         type: approval
     - j17_dtests_latest:
         requires:
         - start_j17_dtests_latest
         - j17_build
+        upstream:
+          start_j17_dtests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - start_j17_dtests_large_vnode:
         type: approval
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large_vnode
         - j17_build
+        upstream:
+          start_j17_dtests_large_vnode:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh_tests:
         type: approval
     - j17_cqlsh_dtests_py38:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - start_j17_cqlsh_tests
         - j17_build
+        upstream:
+          start_j17_cqlsh_tests:
+          - success
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_oa:
         type: approval
     - j17_utests_oa:
         requires:
         - start_j17_utests_oa
         - j17_build
+        upstream:
+          start_j17_utests_oa:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_j17_utests_long
         - j17_build
+        upstream:
+          start_j17_utests_long:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_j17_utests_cdc
         - j17_build
+        upstream:
+          start_j17_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_j17_utests_compression
         - j17_build
+        upstream:
+          start_j17_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_latest:
         type: approval
     - j17_utests_latest:
         requires:
         - start_j17_utests_latest
         - j17_build
+        upstream:
+          start_j17_utests_latest:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_j17_utests_stress
         - j17_build
+        upstream:
+          start_j17_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_j17_utests_fqltool
         - j17_build
+        upstream:
+          start_j17_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_j17_utests_sstableloader
+        - j17_build
+        upstream:
+          start_j17_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_j17_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_j17_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
   java17_pre-commit_tests:
     jobs:
     - start_pre-commit_tests:
@@ -10135,101 +11289,207 @@ workflows:
     - j17_build:
         requires:
         - start_pre-commit_tests
+        upstream:
+          start_pre-commit_tests:
+          - success
     - j17_unit_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_oa:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_utests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_jvm_dtests_latest_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlshlib_cython_tests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_dtests_latest:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_dtests_large:
         type: approval
     - j17_dtests_large:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_dtests_large_vnode:
         requires:
         - start_j17_dtests_large
         - j17_build
+        upstream:
+          start_j17_dtests_large:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py38_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_vnode:
         requires:
         - j17_build
+        upstream:
+          j17_build:
+          - success
     - start_j17_cqlsh-dtests-latest:
         type: approval
     - j17_cqlsh_dtests_py38_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - j17_cqlsh_dtests_py311_latest:
         requires:
         - start_j17_cqlsh-dtests-latest
         - j17_build
+        upstream:
+          start_j17_cqlsh-dtests-latest:
+          - success
+          j17_build:
+          - success
     - start_utests_long:
         type: approval
     - j17_utests_long:
         requires:
         - start_utests_long
         - j17_build
+        upstream:
+          start_utests_long:
+          - success
+          j17_build:
+          - success
     - start_utests_cdc:
         type: approval
     - j17_utests_cdc:
         requires:
         - start_utests_cdc
         - j17_build
+        upstream:
+          start_utests_cdc:
+          - success
+          j17_build:
+          - success
     - start_utests_compression:
         type: approval
     - j17_utests_compression:
         requires:
         - start_utests_compression
         - j17_build
+        upstream:
+          start_utests_compression:
+          - success
+          j17_build:
+          - success
     - start_utests_stress:
         type: approval
     - j17_utests_stress:
         requires:
         - start_utests_stress
         - j17_build
+        upstream:
+          start_utests_stress:
+          - success
+          j17_build:
+          - success
     - start_utests_fqltool:
         type: approval
     - j17_utests_fqltool:
         requires:
         - start_utests_fqltool
         - j17_build
+        upstream:
+          start_utests_fqltool:
+          - success
+          j17_build:
+          - success
+    - start_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+        - start_utests_sstableloader
+        - j17_build
+        upstream:
+          start_utests_sstableloader:
+          - success
+          j17_build:
+          - success
     - start_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
         requires:
         - start_utests_system_keyspace_directory
         - j17_build
+        upstream:
+          start_utests_system_keyspace_directory:
+          - success
+          j17_build:
+          - success
diff --git a/.circleci/config_template.yml b/.circleci/config_template.yml
index d015b5e872..a3e09b1fa0 100644
--- a/.circleci/config_template.yml
+++ b/.circleci/config_template.yml
@@ -63,6 +63,13 @@ default_env_vars: &default_env_vars
     # The number of times that new, modified or manually specified fqltool unit tests should be run.
     REPEATED_UTESTS_FQLTOOL_COUNT: 500
 
+    # Comma-separated list of tests that should be included in the repeated run for sstableloader unit tests,
+    # in addition to automatically detected new and modified tests. For example:
+    # REPEATED_UTESTS_SSTABLELOADER: org.apache.cassandra.tools.LoaderOptionsTest
+    REPEATED_UTESTS_SSTABLELOADER:
+    # The number of times that new, modified or manually specified sstableloader unit tests should be run.
+    REPEATED_UTESTS_SSTABLELOADER_COUNT: 500
+
     # Comma-separated list of tests that should be included in the repeated run for long unit tests,
     # in addition to automatically detected new and modified tests. For example:
     # REPEATED_UTESTS_LONG: org.apache.cassandra.db.commitlog.CommitLogStressTest
@@ -537,6 +544,30 @@ j11_separate_jobs: &j11_separate_jobs
         requires:
           - start_j17_utests_fqltool_repeat
           - j11_build
+    - start_j11_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+          - start_j11_utests_sstableloader
+          - j11_build
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+          - start_j17_utests_sstableloader
+          - j11_build
+    - start_j11_utests_sstableloader_repeat:
+        type: approval
+    - j11_utests_sstableloader_repeat:
+        requires:
+          - start_j11_utests_sstableloader_repeat
+          - j11_build
+    - start_j17_utests_sstableloader_repeat:
+        type: approval
+    - j17_utests_sstableloader_repeat:
+        requires:
+          - start_j17_utests_sstableloader_repeat
+          - j11_build
     - start_j11_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
@@ -974,6 +1005,24 @@ j11_pre-commit_jobs: &j11_pre-commit_jobs
         requires:
           - start_utests_fqltool
           - j11_build
+    - start_utests_sstableloader:
+        type: approval
+    - j11_utests_sstableloader:
+        requires:
+          - start_utests_sstableloader
+          - j11_build
+    - j17_utests_sstableloader:
+        requires:
+          - start_utests_sstableloader
+          - j11_build
+    - j11_utests_sstableloader_repeat:
+        requires:
+          - start_utests_sstableloader
+          - j11_build
+    - j17_utests_sstableloader_repeat:
+        requires:
+          - start_utests_sstableloader
+          - j11_build
     - start_utests_system_keyspace_directory:
         type: approval
     - j11_utests_system_keyspace_directory:
@@ -1356,6 +1405,18 @@ j17_separate_jobs: &j17_separate_jobs
         requires:
           - start_j17_utests_fqltool_repeat
           - j17_build
+    - start_j17_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+          - start_j17_utests_sstableloader
+          - j17_build
+    - start_j17_utests_sstableloader_repeat:
+        type: approval
+    - j17_utests_sstableloader_repeat:
+        requires:
+          - start_j17_utests_sstableloader_repeat
+          - j17_build
     - start_j17_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
@@ -1541,6 +1602,16 @@ j17_pre-commit_jobs: &j17_pre-commit_jobs
         requires:
           - start_utests_fqltool
           - j17_build
+    - start_utests_sstableloader:
+        type: approval
+    - j17_utests_sstableloader:
+        requires:
+          - start_utests_sstableloader
+          - j17_build
+    - j17_utests_sstableloader_repeat:
+        requires:
+          - start_utests_sstableloader
+          - j17_build
     - start_utests_system_keyspace_directory:
         type: approval
     - j17_utests_system_keyspace_directory:
@@ -1875,6 +1946,22 @@ jobs:
       - run_junit_tests:
           target: fqltool-test
 
+  j11_utests_sstableloader:
+    <<: *j11_seq_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - run_junit_tests:
+          target: sstableloader-test
+
+  j17_utests_sstableloader:
+    <<: *j17_seq_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - run_junit_tests:
+          target: sstableloader-test
+
   j11_utests_system_keyspace_directory:
     <<: *j11_par_executor
     steps:
@@ -2380,6 +2467,22 @@ jobs:
       - log_environment
       - run_utests_fqltool_repeat
 
+  j11_utests_sstableloader_repeat:
+    <<: *j11_repeated_utest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - log_environment
+      - run_utests_sstableloader_repeat
+
+  j17_utests_sstableloader_repeat:
+    <<: *j17_repeated_utest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - log_environment
+      - run_utests_sstableloader_repeat
+
   j11_utests_long_repeat:
     <<: *j11_repeated_utest_executor
     steps:
@@ -3114,6 +3217,14 @@ commands:
           count: ${REPEATED_UTESTS_FQLTOOL_COUNT}
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
 
+  run_utests_sstableloader_repeat:
+    steps:
+      - run_repeated_utests:
+          target: sstableloader-test
+          tests: ${REPEATED_UTESTS_SSTABLELOADER}
+          count: ${REPEATED_UTESTS_SSTABLELOADER_COUNT}
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+
   run_utests_stress_repeat:
     steps:
       - run_repeated_utests:
@@ -3237,6 +3348,7 @@ commands:
                       $target == "test-oa" || \
                       $target == "test-system-keyspace-directory" || \
                       $target == "fqltool-test" || \
+                      $target == "sstableloader-test" || \
                       $target == "long-test" || \
                       $target == "stress-test" || \
                       $target == "test-simulator-dtest" ]]; then
@@ -3365,6 +3477,7 @@ commands:
                       $target == "test-oa" || \
                       $target == "test-system-keyspace-directory" || \
                       $target == "fqltool-test" || \
+                      $target == "sstableloader-test" || \
                       $target == "long-test" || \
                       $target == "stress-test" || \
                       $target == "test-simulator-dtest" ]]; then
diff --git a/.circleci/generate.sh b/.circleci/generate.sh
index 97a433e2d7..26d68dc2a3 100755
--- a/.circleci/generate.sh
+++ b/.circleci/generate.sh
@@ -51,6 +51,8 @@ print_help()
   echo "                   -e REPEATED_UTESTS_COUNT=500"
   echo "                   -e REPEATED_UTESTS_FQLTOOL=org.apache.cassandra.fqltool.FQLCompareTest"
   echo "                   -e REPEATED_UTESTS_FQLTOOL_COUNT=500"
+  echo "                   -e REPEATED_UTESTS_SSTABLELOADER=org.apache.cassandra.tools.LoaderOptionsTest"
+  echo "                   -e REPEATED_UTESTS_SSTABLELOADER_COUNT=500"
   echo "                   -e REPEATED_UTESTS_LONG=org.apache.cassandra.db.commitlog.CommitLogStressTest"
   echo "                   -e REPEATED_UTESTS_LONG_COUNT=100"
   echo "                   -e REPEATED_UTESTS_STRESS=org.apache.cassandra.stress.generate.DistributionGaussianTest"
@@ -131,6 +133,8 @@ if $has_env_vars && $check_env_vars; then
        [ "$key" != "REPEATED_UTESTS_COUNT" ] &&
        [ "$key" != "REPEATED_UTESTS_FQLTOOL" ] &&
        [ "$key" != "REPEATED_UTESTS_FQLTOOL_COUNT" ] &&
+       [ "$key" != "REPEATED_UTESTS_SSTABLELOADER" ] &&
+       [ "$key" != "REPEATED_UTESTS_SSTABLELOADER_COUNT" ] &&
        [ "$key" != "REPEATED_UTESTS_LONG" ] &&
        [ "$key" != "REPEATED_UTESTS_LONG_COUNT" ] &&
        [ "$key" != "REPEATED_UTESTS_STRESS" ] &&
@@ -171,7 +175,7 @@ if $free; then
 elif $paid; then
   ($all || $free) && die "Cannot use option -p with options -a or -f"
   echo "Generating new config.yml file for paid tier from config_template.yml"
-  patch -o $BASEDIR/config_template.yml.PAID $BASEDIR/config_template.yml $BASEDIR/config_template.yml.PAID.patch
+  patch --silent -o $BASEDIR/config_template.yml.PAID $BASEDIR/config_template.yml $BASEDIR/config_template.yml.PAID.patch
   circleci config process $BASEDIR/config_template.yml.PAID > $BASEDIR/config.yml.PAID.tmp
   cat $BASEDIR/license.yml $BASEDIR/config.yml.PAID.tmp > $BASEDIR/config.yml
   rm $BASEDIR/config_template.yml.PAID $BASEDIR/config.yml.PAID.tmp
@@ -188,7 +192,7 @@ elif $all; then
   rm $BASEDIR/config.yml.FREE.tmp
 
   # setup config for paid tier
-  patch -o $BASEDIR/config_template.yml.PAID $BASEDIR/config_template.yml $BASEDIR/config_template.yml.PAID.patch
+  patch --silent -o $BASEDIR/config_template.yml.PAID $BASEDIR/config_template.yml $BASEDIR/config_template.yml.PAID.patch
   circleci config process $BASEDIR/config_template.yml.PAID > $BASEDIR/config.yml.PAID.tmp
   cat $BASEDIR/license.yml $BASEDIR/config.yml.PAID.tmp > $BASEDIR/config.yml.PAID
   rm $BASEDIR/config_template.yml.PAID $BASEDIR/config.yml.PAID.tmp
@@ -241,6 +245,7 @@ if $detect_changed_tests; then
   add_diff_tests "REPEATED_UTESTS_LONG" "test/long/" "org.apache.cassandra"
   add_diff_tests "REPEATED_UTESTS_STRESS" "tools/stress/test/unit/" "org.apache.cassandra.stress"
   add_diff_tests "REPEATED_UTESTS_FQLTOOL" "tools/fqltool/test/unit/" "org.apache.cassandra.fqltool"
+  add_diff_tests "REPEATED_UTESTS_SSTABLELOADER" "tools/sstableloader/test/unit/" "org.apache.cassandra.tools"
   add_diff_tests "REPEATED_SIMULATOR_DTESTS" "test/simulator/test/" "org.apache.cassandra.simulator.test"
   add_diff_tests "REPEATED_JVM_DTESTS" "test/distributed/" "org.apache.cassandra.distributed.test"
   add_diff_tests "REPEATED_JVM_UPGRADE_DTESTS" "test/distributed/" "org.apache.cassandra.distributed.upgrade"
@@ -305,6 +310,10 @@ delete_repeated_jobs()
     delete_job "$1" "j11_utests_fqltool_repeat"
     delete_job "$1" "j17_utests_fqltool_repeat"
   fi
+  if (! (echo "$env_vars" | grep -q "REPEATED_UTESTS_SSTABLELOADER=")); then
+    delete_job "$1" "j11_utests_sstableloader_repeat"
+    delete_job "$1" "j17_utests_sstableloader_repeat"
+  fi
   if (! (echo "$env_vars" | grep -q "REPEATED_SIMULATOR_DTESTS=")); then
     delete_job "$1" "j11_simulator_dtests_repeat"
   fi
@@ -386,6 +395,7 @@ build_dev_min_jobs()
   delete_job "$1" "j11_utests_cdc"
   delete_job "$1" "j11_utests_compression"
   delete_job "$1" "j11_utests_fqltool"
+  delete_job "$1" "j11_utests_sstableloader"
   delete_job "$1" "j11_utests_long"
   delete_job "$1" "j11_utests_stress"
   delete_job "$1" "j11_utests_system_keyspace_directory"
@@ -394,6 +404,7 @@ build_dev_min_jobs()
   delete_job "$1" "j17_utests_cdc"
   delete_job "$1" "j17_utests_compression"
   delete_job "$1" "j17_utests_fqltool"
+  delete_job "$1" "j17_utests_sstableloader"
   delete_job "$1" "j17_utests_long"
   delete_job "$1" "j17_utests_stress"
   delete_job "$1" "j11_utests_latest"
@@ -403,6 +414,7 @@ build_dev_min_jobs()
   delete_job "$1" "start_utests_stress"
   delete_job "$1" "start_utests_long"
   delete_job "$1" "start_utests_fqltool"
+  delete_job "$1" "start_utests_sstableloader"
   delete_job "$1" "start_utests_compression"
   delete_job "$1" "start_utests_cdc"
   delete_job "$1" "start_j17_cqlsh-dtests-latest"
diff --git a/.jenkins/Jenkinsfile b/.jenkins/Jenkinsfile
index fd32596c64..60e1f093cc 100644
--- a/.jenkins/Jenkinsfile
+++ b/.jenkins/Jenkinsfile
@@ -127,9 +127,9 @@ def pipelineProfiles() {
   return [
     'packaging': ['artifacts', 'lint', 'debian', 'redhat'],
     'skinny': ['lint', 'cqlsh-test', 'test', 'jvm-dtest', 'simulator-dtest', 'dtest'],
-    'pre-commit': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'cqlsh-test', 'test', 'test-latest', 'stress-test', 'test-burn', 'jvm-dtest', 'simulator-dtest', 'dtest', 'dtest-latest'],
-    'pre-commit w/ upgrades': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'cqlsh-test', 'test', 'test-latest', 'stress-test', 'test-burn', 'jvm-dtest', 'jvm-dtest-upgrade', 'simulator-dtest', 'dtest', 'dtest-novnode', 'dtest-latest', 'dtest-upgrade'],
-    'post-commit': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'cqlsh-test', 'test-cdc', 'test', 'test-latest', 'test-compression', 'stress-test', 'test-burn', 'long-test', 'test-oa', 'test-system-keyspace-directory', 'jvm-dtest', 'jvm-dtest-upgrade', 'simulator-dtest', 'dtest', 'dtest-novnode', 'dtest-latest', 'dtest-large', 'dtest-large-novnode', 'dtest-large-latest', 'dtest-upgrade', 'dtest-upgrade-novnode', 'dtest-upgrade-large', 'dtest-upgrade-novnode-large'],
+    'pre-commit': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'sstableloader-test', 'cqlsh-test', 'test', 'test-latest', 'stress-test', 'test-burn', 'jvm-dtest', 'simulator-dtest', 'dtest', 'dtest-latest'],
+    'pre-commit w/ upgrades': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'sstableloader-test', 'cqlsh-test', 'test', 'test-latest', 'stress-test', 'test-burn', 'jvm-dtest', 'jvm-dtest-upgrade', 'simulator-dtest', 'dtest', 'dtest-novnode', 'dtest-latest', 'dtest-upgrade'],
+    'post-commit': ['artifacts', 'lint', 'debian', 'redhat', 'fqltool-test', 'sstableloader-test', 'cqlsh-test', 'test-cdc', 'test', 'test-latest', 'test-compression', 'stress-test', 'test-burn', 'long-test', 'test-oa', 'test-system-keyspace-directory', 'jvm-dtest', 'jvm-dtest-upgrade', 'simulator-dtest', 'dtest', 'dtest-novnode', 'dtest-latest', 'dtest-large', 'dtest-large-novnode', 'dtest-large-latest', 'dtest-upgrade', 'dtest-upgrade-novnode', 'dtest-upgrade-large', 'dtest-upgrade-nov [...]
     'custom': []
   ]
 }
@@ -164,6 +164,7 @@ def tasks() {
      //   (some buffer on the heaviest split under the 1h max is required, ref `timeout(…)` in `test(…)`)
     'cqlsh-test': [splits: 1],
     'fqltool-test': [splits: 1, size: 'small'],
+    'sstableloader-test': [splits: 1, size: 'small'],
     'test-cdc': [splits: 20],
     'test': [splits: 20],
     'test-latest': [splits: 20],
diff --git a/CHANGES.txt b/CHANGES.txt
index 4ae4657a94..abbf17c276 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 5.1
+ * Migrate sstableloader code to its own tools directory and artifact (CASSANDRA-20328)
  * Stop AutoRepair monitoring thread upon Cassandra shutdown (CASSANDRA-20623)
  * Avoid duplicate hardlink error upon forceful taking of ephemeral snapshots during repair (CASSANDRA-20490)
  * When a custom disk error handler fails to initiate, fail the startup of a node instead of using the no-op handler (CASSANDRA-20614)
diff --git a/bin/sstableloader b/bin/sstableloader
index 9045adfda3..74cc041538 100755
--- a/bin/sstableloader
+++ b/bin/sstableloader
@@ -32,18 +32,16 @@ elif [ -r "$CASSANDRA_INCLUDE" ]; then
     . "$CASSANDRA_INCLUDE"
 fi
 
-if [ -z "$CLASSPATH" ]; then
-    echo "You must set the CLASSPATH var" >&2
-    exit 1
-fi
+# SSTableLoader has been moved to tools/bin, this script simply
+# invokes the script in the new path.
+SSTABLELOADER_PATH="$CASSANDRA_HOME/tools/bin/sstableloader"
 
-if [ "x$MAX_HEAP_SIZE" = "x" ]; then
-    MAX_HEAP_SIZE="256M"
+if [ ! -f "$SSTABLELOADER_PATH" ]; then
+    echo "Error: sstableloader has moved to the tools directory. \
+Detected that $SSTABLELOADER_PATH does not exist." >&2
+    exit 2
 fi
 
-"$JAVA" $JAVA_AGENT -ea -cp "$CLASSPATH" $JVM_OPTS -Xmx$MAX_HEAP_SIZE \
-        -Dcassandra.storagedir="$cassandra_storagedir" \
-        -Dlogback.configurationFile=logback-tools.xml \
-        org.apache.cassandra.tools.BulkLoader "$@"
+"$SSTABLELOADER_PATH" "$@"
 
 # vi:ai sw=4 ts=4 tw=0 et
diff --git a/build.xml b/build.xml
index ef1fdd661d..9fbbc815d0 100644
--- a/build.xml
+++ b/build.xml
@@ -385,26 +385,38 @@
         </fileset>
     </path>
 
-  <macrodef name="create-javadoc">
-    <attribute name="destdir"/>
-    <element name="filesets"/>
-    <sequential>
-      <javadoc destdir="@{destdir}" author="true" version="true" use="true"
-        windowtitle="${ant.project.name} API" classpathref="cassandra.classpath"
-        bottom="Copyright &amp;copy; 2009- The Apache Software Foundation"
-        useexternalfile="yes" encoding="UTF-8" failonerror="false"
-        maxmemory="256m" additionalparam="${jdk11plus-javac-exports}">
-        <filesets/>
-      </javadoc>
-      <fail message="javadoc failed">
-        <condition>
-            <not>
-                <available file="@{destdir}/index-all.html" />
-            </not>
-        </condition>
-      </fail>
-    </sequential>
-  </macrodef>
+    <macrodef name="create-javadoc">
+      <attribute name="destdir"/>
+      <element name="filesets"/>
+      <sequential>
+        <javadoc destdir="@{destdir}" author="true" version="true" use="true"
+          windowtitle="${ant.project.name} API" classpathref="cassandra.classpath"
+          bottom="Copyright &amp;copy; 2009- The Apache Software Foundation"
+          useexternalfile="yes" encoding="UTF-8" failonerror="false"
+          maxmemory="256m" additionalparam="${jdk11plus-javac-exports}">
+          <filesets/>
+        </javadoc>
+        <fail message="javadoc failed">
+          <condition>
+              <not>
+                  <available file="@{destdir}/index-all.html" />
+              </not>
+          </condition>
+        </fail>
+      </sequential>
+    </macrodef>
+
+    <!-- filterset to apply to pom templates -->
+    <filterset id="pom-template">
+        <filter token="version" value="${version}"/>
+        <filter token="final.name" value="${final.name}"/>
+        <filter token="jamm.version" value="${jamm.version}"/>
+        <filter token="allocation-instrumenter.version" value="${allocation-instrumenter.version}"/>
+        <filter token="ecj.version" value="${ecj.version}"/>
+        <filter token="asm.version" value="${asm.version}"/>
+        <filter token="jacoco.version" value="${jacoco.version}"/>
+        <filter token="jflex.version" value="${jflex.version}"/>
+    </filterset>
 
     <!--
         Setup the output directories.
@@ -746,24 +758,13 @@
     </target>
 
     <target name="write-poms" unless="without.maven">
-        <filterset id="pom-template">
-            <filter token="version" value="${version}"/>
-            <filter token="final.name" value="${final.name}"/>
-            <filter token="jamm.version" value="${jamm.version}"/>
-            <filter token="allocation-instrumenter.version" value="${allocation-instrumenter.version}"/>
-            <filter token="ecj.version" value="${ecj.version}"/>
-            <filter token="asm.version" value="${asm.version}"/>
-            <filter token="jacoco.version" value="${jacoco.version}"/>
-            <filter token="jflex.version" value="${jflex.version}"/>
-        </filterset>
-
-        <copy file=".build/cassandra-deps-template.xml" tofile="${build.dir}/${final.name}.pom">
+        <copy file=".build/cassandra-deps-maven-pom.xml" tofile="${build.dir}/${final.name}.pom">
             <filterset refid="pom-template"/>
         </copy>
-        <copy file=".build/parent-pom-template.xml" tofile="${build.dir}/${final.name}-parent.pom">
+        <copy file=".build/parent-maven-pom.xml" tofile="${build.dir}/${final.name}-parent.pom">
             <filterset refid="pom-template"/>
         </copy>
-        <copy file=".build/cassandra-build-deps-template.xml" tofile="${build.dir}/tmp-${final.name}-deps.pom">
+        <copy file=".build/cassandra-build-maven-pom.xml" tofile="${build.dir}/tmp-${final.name}-deps.pom">
             <filterset refid="pom-template"/>
         </copy>
     </target>
@@ -864,7 +865,7 @@
     </target>
 
     <target name="jar"
-            depends="_main-jar,build-test,stress-jar,fqltool-jar,simulator-jars,write-poms"
+            depends="_main-jar,build-test,stress-jar,fqltool-jar,simulator-jars,sstableloader-jar,write-poms"
             description="Assemble Cassandra JAR files">
     </target>
 
@@ -949,7 +950,7 @@
     </target>
 
     <!-- creates release tarballs -->
-    <target name="artifacts" depends="_artifacts-init,check,sources-jar"
+    <target name="artifacts" depends="_artifacts-init,check,sources-jar,sstableloader-sources-jar"
             description="Create Cassandra tarball and maven artifacts">
       <tar compression="gzip" longfile="gnu"
         destfile="${build.dir}/${final.name}-bin.tar.gz">
@@ -1082,7 +1083,7 @@
     <antcall target="build-test" inheritRefs="true"/>
   </target>
 
-  <target name="build-test" depends="_main-jar,stress-build-test,fqltool-build,resolver-dist-lib,simulator-jars"
+  <target name="build-test" depends="_main-jar,stress-build-test,fqltool-build-test,sstableloader-build-test,resolver-dist-lib,simulator-jars"
           description="Compile test classes">
     <antcall target="_build-test"/>
     <antcall target="_check-test-names"/>
@@ -1101,6 +1102,7 @@
      <classpath>
         <path refid="cassandra.classpath.test"/>
         <pathelement location="${fqltool.build.classes}"/>
+        <pathelement location="${sstableloader.build.classes}"/>
      </classpath>
      <compilerarg value="-XDignore.symbol.file"/>
      <!-- needed to compile org.apache.cassandra.utils.memory.BufferPoolTest -->
@@ -1129,7 +1131,7 @@
     <macrodef name="check-test-names">
         <attribute name="annotationName"/>
         <attribute name="regex"/>
-        <attribute name="scanClassPath" default="${test.classes}:${fqltool.test.classes}:${stress.test.classes}"/>
+        <attribute name="scanClassPath" default="${test.classes}:${fqltool.test.classes}:${stress.test.classes}:${sstableloader.test.classes}"/>
         <attribute name="packageName" default="org.apache.cassandra"/>
         <attribute name="expand" default="true"/>
         <attribute name="normalize" default="true"/>
@@ -1141,9 +1143,11 @@
                     <path refid="cassandra.classpath.test"/>
                     <pathelement location="${fqltool.build.classes}"/>
                     <pathelement location="${stress.build.classes}"/>
+                    <pathelement location="${sstableloader.build.classes}"/>
                     <pathelement location="${test.classes}"/>
                     <pathelement location="${fqltool.test.classes}"/>
                     <pathelement location="${stress.test.classes}"/>
+                    <pathelement location="${sstableloader.test.classes}"/>
                 </classpath>
                 <jvmarg line="${java-jvmargs}"/>
                 <jvmarg value="-DscanClassPath=@{scanClassPath}"/>
@@ -1270,10 +1274,12 @@
           <pathelement path="${java.class.path}"/>
           <pathelement location="${stress.build.classes}"/>
           <pathelement location="${fqltool.build.classes}"/>
+          <pathelement location="${sstableloader.build.classes}"/>
           <pathelement location="${test.classes}"/>
           <path refid="cassandra.classpath.test" />
           <pathelement location="${stress.test.classes}"/>
           <pathelement location="${fqltool.test.classes}"/>
+          <pathelement location="${sstableloader.test.classes}"/>
           <pathelement location="${test.conf}"/>
           <pathelement path="${java.class.path}"/>
           <path refid="cassandra.classpath" />
@@ -2079,8 +2085,10 @@
   <classpathentry kind="src" output="${test.classes}" path="test/resources" />
   <classpathentry kind="src" path="tools/stress/src"/>
   <classpathentry kind="src" path="tools/fqltool/src"/>
+  <classpathentry kind="src" path="tools/sstableloader/src"/>
   <classpathentry kind="src" output="build/test/stress-classes" path="tools/stress/test/unit" />
   <classpathentry kind="src" output="build/test/fqltool-classes" path="tools/fqltool/test/unit" />
+  <classpathentry kind="src" output="build/test/sstableloader-classes" path="tools/sstableloader/test/unit" />
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="build/classes/eclipse"/>
   <classpathentry kind="lib" path="test/conf"/>
@@ -2140,7 +2148,7 @@
 
   <!-- Publish artifacts to remote Maven repository -->
   <target name="publish"
-          depends="mvn-install,artifacts"
+          depends="mvn-install,sstableloader-mvn-install,artifacts"
           description="Publishes the artifacts to the Maven repository">
     <!-- Accord -->
     <deploy pomFile="${accord.local.repository}/${accord.final.name}.pom"
@@ -2170,6 +2178,16 @@
             file="${build.dir}/${final.name}-javadoc.jar"
             classifier="javadoc"/>
 
+    <!-- the cassandra-sstableloader jar -->
+    <deploy pomFile="${build.dir}/${final.name}-sstableloader.pom"
+            file="${build.dir}/tools/lib/sstableloader.jar"/>
+    <deploy pomFile="${build.dir}/${final.name}-sstableloader.pom"
+            file="${build.dir}/${final.name}-sstableloader-sources.jar"
+            classifier="sources"/>
+    <deploy pomFile="${build.dir}/${final.name}-sstableloader.pom"
+            file="${build.dir}/${final.name}-sstableloader-javadoc.jar"
+            classifier="javadoc"/>
+
     <!-- the distribution -->
     <sign-dist file="${build.dir}/${final.name}-bin.tar.gz" />
     <sign-dist file="${build.dir}/${final.name}-src.tar.gz" />
@@ -2185,4 +2203,5 @@
   <import file="${build.helpers.dir}/build-bench.xml"/>
   <import file="${build.helpers.dir}/build-sonar.xml"/>
   <import file="${build.helpers.dir}/build-accord.xml" />
+  <import file="${basedir}/tools/sstableloader/build.xml"/>
 </project>
diff --git a/debian/cassandra.install b/debian/cassandra.install
index 7ee058bb59..0573128ddd 100644
--- a/debian/cassandra.install
+++ b/debian/cassandra.install
@@ -16,7 +16,6 @@ bin/cassandra.in.sh usr/share/cassandra
 bin/cassandra usr/sbin
 bin/nodetool usr/bin
 bin/sstableutil usr/bin
-bin/sstableloader usr/bin
 bin/cqlsh usr/bin
 bin/cqlsh.py usr/bin
 bin/sstablescrub usr/bin
@@ -28,6 +27,7 @@ tools/bin/auditlogviewer usr/bin
 tools/bin/jmxtool usr/bin
 tools/bin/hash_password usr/bin
 tools/bin/sstablepartitions usr/bin
+tools/bin/sstableloader usr/bin
 lib/*.jar usr/share/cassandra/lib
 lib/*.zip usr/share/cassandra/lib
 lib/x86_64/* usr/share/cassandra/lib/x86_64
diff --git a/debian/rules b/debian/rules
index b3de486117..70305b41e9 100755
--- a/debian/rules
+++ b/debian/rules
@@ -67,6 +67,10 @@ install: build
 	dh_install $(BUILD_DIR)/tools/lib/fqltool.jar \
 		usr/share/cassandra
 
+	# Copy sstableloader jars
+	dh_install $(BUILD_DIR)/tools/lib/sstableloader.jar \
+		usr/share/cassandra
+
 	dh_link usr/share/cassandra/apache-cassandra-$(VERSION).jar \
 		usr/share/cassandra/apache-cassandra.jar
 
diff --git a/ide/idea-iml-file.xml b/ide/idea-iml-file.xml
index 1d189db8d6..4daf6af096 100644
--- a/ide/idea-iml-file.xml
+++ b/ide/idea-iml-file.xml
@@ -30,6 +30,8 @@
             <sourceFolder url="file://$MODULE_DIR$/tools/stress/test/unit" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/tools/fqltool/src" isTestSource="false" />
             <sourceFolder url="file://$MODULE_DIR$/tools/fqltool/test/unit" isTestSource="true" />
+            <sourceFolder url="file://$MODULE_DIR$/tools/sstableloader/src" isTestSource="false" />
+            <sourceFolder url="file://$MODULE_DIR$/tools/sstableloader/test/unit" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/unit" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/long" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/memory" isTestSource="true" />
diff --git a/ide/idea/workspace.xml b/ide/idea/workspace.xml
index 13018f4052..5eb1a70b78 100644
--- a/ide/idea/workspace.xml
+++ b/ide/idea/workspace.xml
@@ -360,6 +360,7 @@
         <filter targetName="build-project" isVisible="false" />
         <filter targetName="stress-build" isVisible="true" />
         <filter targetName="fqltool-build" isVisible="true" />
+        <filter targetName="sstableloader-build" isVisible="true" />
         <filter targetName="_write-poms" isVisible="false" />
         <filter targetName="write-poms" isVisible="false" />
         <filter targetName="jar" isVisible="true" />
diff --git a/ide/nbproject/ide-actions.xml b/ide/nbproject/ide-actions.xml
index a53cd96071..b7b9860437 100644
--- a/ide/nbproject/ide-actions.xml
+++ b/ide/nbproject/ide-actions.xml
@@ -5,6 +5,7 @@
         <ant antfile="../build.xml" inheritall="false" target="build"/>
         <ant antfile="../build.xml" inheritall="false" target="build-test"/>
         <ant antfile="../build.xml" inheritall="false" target="fqltool-build-test"/>
+        <ant antfile="../build.xml" inheritall="false" target="sstableloader-build-test"/>
         <ant antfile="../build.xml" inheritall="false" target="stress-build-test"/>
     </target>
     <target name="clean">
diff --git a/ide/nbproject/project.xml b/ide/nbproject/project.xml
index f770d1e68d..cce2bfdadc 100644
--- a/ide/nbproject/project.xml
+++ b/ide/nbproject/project.xml
@@ -35,6 +35,12 @@
                     <location>${project.dir}/tools/fqltool/src</location>
                     <encoding>UTF-8</encoding>
                 </source-folder>
+                <source-folder>
+                    <label>src/sstableloader</label>
+                    <type>java</type>
+                    <location>${project.dir}/tools/sstableloader/src</location>
+                    <encoding>UTF-8</encoding>
+                </source-folder>
                 <source-folder>
                     <label>src/stress</label>
                     <type>java</type>
@@ -53,6 +59,12 @@
                     <location>${project.dir}/tools/fqltool/test/unit</location>
                     <encoding>UTF-8</encoding>
                 </source-folder>
+                <source-folder>
+                    <label>test/sstableloader/</label>
+                    <type>java</type>
+                    <location>${project.dir}/tools/sstableloader/test/unit</location>
+                    <encoding>UTF-8</encoding>
+                </source-folder>
                 <source-folder>
                     <label>test/stress</label>
                     <type>java</type>
@@ -164,6 +176,12 @@
                 <script>../build.xml</script>
                 <build-target>fqltool-build</build-target>
             </export>
+            <export>
+                <type>folder</type>
+                <location>${project.dir}/build/classes/sstableloader</location>
+                <script>../build.xml</script>
+                <build-target>sstableloader-build</build-target>
+            </export>
             <export>
                 <type>folder</type>
                 <location>${project.dir}/build/classes/stress</location>
@@ -194,6 +212,12 @@
                 <script>../build.xml</script>
                 <build-target>fqltool-build-test</build-target>
             </export>
+            <export>
+                <type>folder</type>
+                <location>${project.dir}/build/test/sstableloader-classes</location>
+                <script>../build.xml</script>
+                <build-target>sstableloader-build-test</build-target>
+            </export>
             <export>
                 <type>folder</type>
                 <location>${project.dir}/build/test/stress-classes</location>
@@ -214,6 +238,10 @@
                         <label>src/fqltool</label>
                         <location>${project.dir}/tools/fqltool/src</location>
                     </source-folder>
+                    <source-folder style="packages">
+                        <label>src/sstableloader</label>
+                        <location>${project.dir}/tools/sstableloader/src</location>
+                    </source-folder>
                     <source-folder style="packages">
                         <label>src/stress</label>
                         <location>${project.dir}/tools/stress/src</location>
@@ -226,6 +254,10 @@
                         <label>test/fqltool/</label>
                         <location>${project.dir}/tools/fqltool/test/unit</location>
                     </source-folder>
+                    <source-folder style="packages">
+                        <label>test/sstableloader/</label>
+                        <location>${project.dir}/tools/sstableloader/test/unit</location>
+                    </source-folder>
                     <source-folder style="packages">
                         <label>test/stress</label>
                         <location>${project.dir}/tools/stress/test/unit</location>
@@ -295,6 +327,11 @@
                 <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main</classpath>
                 <built-to>${project.dir}/build/classes/fqltool</built-to>
             </compilation-unit>
+            <compilation-unit>
+                <package-root>${project.dir}/tools/sstableloader/src</package-root>
+                <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main</classpath>
+                <built-to>${project.dir}/build/classes/sstableloader</built-to>
+            </compilation-unit>
             <compilation-unit>
                 <package-root>${project.dir}/tools/stress/src</package-root>
                 <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main</classpath>
@@ -313,7 +350,7 @@
                 <package-root>${project.dir}/test/simulator/test</package-root>
                 <package-root>${project.dir}/test/harry/main</package-root>
                 <unit-tests/>
-                <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main:${project.dir}/build/classes/fqltool/:${project.dir}/build/classes/stress/</classpath>
+                <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main:${project.dir}/build/classes/fqltool/:${project.dir}/build/classes/sstableloader:${project.dir}/build/classes/stress/</classpath>
                 <built-to>${project.dir}/build/test/classes</built-to>
             </compilation-unit>
             <compilation-unit>
@@ -322,6 +359,12 @@
                 <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main:${project.dir}/build/classes/fqltool/</classpath>
                 <built-to>${project.dir}/build/test/fqltool-classes</built-to>
             </compilation-unit>
+            <compilation-unit>
+                <package-root>${project.dir}/tools/sstableloader/test/unit</package-root>
+                <unit-tests/>
+                <classpath mode="compile">${cassandra.classpath.jars}:${project.dir}/build/classes/main:${project.dir}/build/classes/sstableloader/</classpath>
+                <built-to>${project.dir}/build/test/sstableloader-classes</built-to>
+            </compilation-unit>
             <compilation-unit>
                 <package-root>${project.dir}/tools/stress/test/unit</package-root>
                 <unit-tests/>
diff --git a/redhat/cassandra.spec b/redhat/cassandra.spec
index 90251725cc..c151ebaa12 100644
--- a/redhat/cassandra.spec
+++ b/redhat/cassandra.spec
@@ -120,6 +120,9 @@ cp -p %{_get_dist_dir}/tools/lib/stress.jar %{buildroot}/usr/share/%{username}/
 # copy fqltool jar
 cp -p %{_get_dist_dir}/tools/lib/fqltool.jar %{buildroot}/usr/share/%{username}/
 
+# copy sstableloader jar
+cp -p %{_get_dist_dir}/tools/lib/sstableloader.jar %{buildroot}/usr/share/%{username}/
+
 # copy binaries
 mv bin/cassandra %{buildroot}/usr/sbin/
 cp -p bin/* %{buildroot}/usr/bin/
diff --git a/src/java/org/apache/cassandra/tools/CmdLineOptions.java b/src/java/org/apache/cassandra/tools/CmdLineOptions.java
new file mode 100644
index 0000000000..504ac1aaf6
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/CmdLineOptions.java
@@ -0,0 +1,73 @@
+/*
+ * 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.tools;
+
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+
+public class CmdLineOptions extends Options
+{
+    /**
+     * Add option with argument and argument name
+     *
+     * @param opt         shortcut for option name
+     * @param longOpt     complete option name
+     * @param argName     argument name
+     * @param description description of the option
+     * @return updated Options object
+     */
+    public Options addOption(String opt, String longOpt, String argName, String description)
+    {
+        Option option = new Option(opt, longOpt, true, description);
+        option.setArgName(argName);
+
+        return addOption(option);
+    }
+
+    /**
+     * Add option with argument and argument name that accepts being defined multiple times as a list
+     *
+     * @param opt         shortcut for option name
+     * @param longOpt     complete option name
+     * @param argName     argument name
+     * @param description description of the option
+     * @return updated Options object
+     */
+    public Options addOptionList(String opt, String longOpt, String argName, String description)
+    {
+        Option option = new Option(opt, longOpt, true, description);
+        option.setArgName(argName);
+        option.setArgs(Option.UNLIMITED_VALUES);
+
+        return addOption(option);
+    }
+
+    /**
+     * Add option without argument
+     *
+     * @param opt         shortcut for option name
+     * @param longOpt     complete option name
+     * @param description description of the option
+     * @return updated Options object
+     */
+    public Options addOption(String opt, String longOpt, String description)
+    {
+        return addOption(new Option(opt, longOpt, false, description));
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java b/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
index 1dd0ba53d6..badea964c5 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
@@ -30,7 +30,6 @@ import java.io.IOException;
 import java.util.function.BiPredicate;
 
 import org.apache.cassandra.io.util.File;
-import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneSSTableUtil
 {
diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
index fe12e6d723..93275ad28c 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
@@ -51,7 +51,6 @@ import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.tcm.ClusterMetadataService;
-import org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Pair;
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
index db95190415..965186ce7e 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
@@ -50,7 +50,7 @@ import org.apache.cassandra.tcm.ClusterMetadataService;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
-import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
+
 import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class StandaloneSplitter
diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
index 52e9f8c295..069fdbe845 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
@@ -46,7 +46,6 @@ import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.OutputHandler;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
-import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneUpgrader
 {
diff --git a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
index 241fe2d432..f00c3168f3 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
@@ -53,7 +53,6 @@ import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Throwables;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_UTIL_ALLOW_TOOL_REINIT_FOR_TEST;
-import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneVerifier
 {
diff --git a/tools/bin/cassandra.in.sh b/tools/bin/cassandra.in.sh
index 056bedc715..79bbfcd34a 100644
--- a/tools/bin/cassandra.in.sh
+++ b/tools/bin/cassandra.in.sh
@@ -39,7 +39,7 @@ if [ -d $CASSANDRA_HOME/build ] ; then
 
     if [ "$jars_cnt" = "1" ]; then
         cassandra_bin="`ls -1 $CASSANDRA_HOME/build/apache-cassandra*.jar | grep -v javadoc | grep -v sources`"
-        cassandra_bin="$cassandra_bin:$CASSANDRA_HOME/build/classes/stress:$CASSANDRA_HOME/build/classes/fqltool"
+        cassandra_bin="$cassandra_bin:$CASSANDRA_HOME/build/classes/stress:$CASSANDRA_HOME/build/classes/fqltool:$CASSANDRA_HOME/build/classes/sstableloader"
         CLASSPATH="$CLASSPATH:$cassandra_bin"
     fi
 fi
diff --git a/bin/sstableloader b/tools/bin/sstableloader
similarity index 100%
copy from bin/sstableloader
copy to tools/bin/sstableloader
diff --git a/tools/sstableloader/build.xml b/tools/sstableloader/build.xml
new file mode 100644
index 0000000000..401ba3aea1
--- /dev/null
+++ b/tools/sstableloader/build.xml
@@ -0,0 +1,125 @@
+<!--
+  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.
+-->
+<project basedir="../../" name="apache-cassandra-sstableloader"
+         xmlns:if="ant:if"
+         xmlns:unless="ant:unless">
+
+    <!-- pull common definitions from parent project -->
+    <import file="../../build.xml"/>
+
+    <property name="sstableloader-javadoc.dir" value="${build.dir}/sstableloader-javadoc"/>
+    <property name="sstableloader.build.src" value="${basedir}/tools/sstableloader/src" />
+    <property name="sstableloader.test.src" value="${basedir}/tools/sstableloader/test/unit" />
+    <property name="sstableloader.build.classes" value="${build.classes}/sstableloader" />
+    <property name="sstableloader.test.classes" value="${build.dir}/test/sstableloader-classes" />
+    <property name="sstableloader.manifest" value="${sstableloader.build.classes}/MANIFEST.MF" />
+
+    <target name="sstableloader-init">
+        <mkdir dir="${sstableloader.test.classes}"/>
+    </target>
+
+    <target name="sstableloader-build" depends="sstableloader-init,build" description="build sstableloader">
+        <antcall target="_sstableloader_build"/>
+    </target>
+
+    <target name="_sstableloader_build">
+        <mkdir dir="${sstableloader.build.classes}" />
+        <javac compiler="modern" debug="true" debuglevel="${debuglevel}"
+               source="${ant.java.version}" target="${ant.java.version}"
+               encoding="utf-8" destdir="${sstableloader.build.classes}" includeantruntime="true">
+            <src path="${sstableloader.build.src}" />
+            <classpath>
+                <path refid="cassandra.classpath" />
+            </classpath>
+        </javac>
+    </target>
+
+    <target name="sstableloader-build-test" depends="sstableloader-build" description="Compile sstableloader tests">
+        <javac debug="true" debuglevel="${debuglevel}" destdir="${sstableloader.test.classes}"
+               source="${ant.java.version}" target="${ant.java.version}"
+               includeantruntime="false" encoding="utf-8">
+            <classpath>
+                <path refid="cassandra.classpath.test"/>
+                <pathelement location="${sstableloader.build.classes}" />
+            </classpath>
+            <src path="${sstableloader.test.src}"/>
+        </javac>
+    </target>
+
+    <target name="sstableloader-test" depends="sstableloader-build-test, maybe-build-test" description="Runs sstableloader tests">
+        <testmacro inputdir="${sstableloader.test.src}"
+                       timeout="${test.timeout}">
+        </testmacro>
+    </target>
+
+    <target name="sstableloader-write-pom">
+        <copy file=".build/sstableloader-deps-maven-pom.xml" tofile="${build.dir}/${final.name}-sstableloader.pom">
+            <filterset refid="pom-template"/>
+        </copy>
+    </target>
+
+    <target name="sstableloader-jar"
+            depends="sstableloader-build,sstableloader-write-pom"
+            description="Assemble Cassandra sstableloader JAR files">
+
+        <!-- sstableloader jar -->
+        <manifest file="${sstableloader.manifest}">
+            <attribute name="Built-By" value="Apache Cassandra Project"/>
+            <attribute name="Main-Class" value="org.apache.cassandra.tools.BulkLoader"/>
+        </manifest>
+        <mkdir dir="${sstableloader.build.classes}/META-INF" />
+        <mkdir dir="${build.dir}/tools/lib/" />
+        <jar destfile="${build.dir}/tools/lib/sstableloader.jar" manifest="${sstableloader.manifest}">
+            <fileset dir="${sstableloader.build.classes}"/>
+        </jar>
+    </target>
+
+    <target name="sstableloader-javadoc" depends="build" description="Create javadoc" unless="no-javadoc">
+      <create-javadoc destdir="${sstableloader-javadoc.dir}">
+        <filesets>
+          <fileset dir="${sstableloader.build.src}" defaultexcludes="yes">
+            <include name="org/apache/**/*.java"/>
+          </fileset>
+        </filesets>
+      </create-javadoc>
+    </target>
+
+    <target name="sstableloader-javadoc-jar" depends="sstableloader-javadoc" unless="no-javadoc" description="Assemble sstableloader JavaDoc JAR file">
+      <jar jarfile="${build.dir}/${final.name}-sstableloader-javadoc.jar" basedir="${sstableloader-javadoc.dir}"/>
+      <delete quiet="true" dir="${sstableloader-javadoc.dir}"/>
+    </target>
+
+    <target name="sstableloader-sources-jar" depends="init" description="Assemble sstableloader Sources JAR file">
+      <jar jarfile="${build.dir}/${final.name}-sstableloader-sources.jar">
+        <fileset dir="${sstableloader.build.src}" defaultexcludes="yes">
+          <include name="org/apache/**/*.java"/>
+        </fileset>
+      </jar>
+    </target>
+
+    <target name="sstableloader-mvn-install" depends="sstableloader-sources-jar,sstableloader-javadoc-jar,mvn-install"
+            description="Installs the sstableloader artifacts in the Maven Local Repository">
+      <install pomFile="${build.dir}/${final.name}-sstableloader.pom"
+               file="${build.dir}/tools/lib/sstableloader.jar"/>
+      <install pomFile="${build.dir}/${final.name}-sstableloader.pom"
+               file="${build.dir}/${final.name}-sstableloader-sources.jar"
+               classifier="sources"/>
+      <install pomFile="${build.dir}/${final.name}-sstableloader.pom"
+               file="${build.dir}/${final.name}-sstableloader-javadoc.jar"
+               classifier="javadoc"/>
+    </target>
+</project>
diff --git a/src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java b/tools/sstableloader/src/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
similarity index 100%
rename from src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
rename to tools/sstableloader/src/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
diff --git a/src/java/org/apache/cassandra/tools/BulkLoadException.java b/tools/sstableloader/src/org/apache/cassandra/tools/BulkLoadException.java
similarity index 100%
rename from src/java/org/apache/cassandra/tools/BulkLoadException.java
rename to tools/sstableloader/src/org/apache/cassandra/tools/BulkLoadException.java
diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/tools/sstableloader/src/org/apache/cassandra/tools/BulkLoader.java
similarity index 87%
rename from src/java/org/apache/cassandra/tools/BulkLoader.java
rename to tools/sstableloader/src/org/apache/cassandra/tools/BulkLoader.java
index 92ccbb96be..a3a4dda350 100644
--- a/src/java/org/apache/cassandra/tools/BulkLoader.java
+++ b/tools/sstableloader/src/org/apache/cassandra/tools/BulkLoader.java
@@ -25,8 +25,6 @@ import javax.net.ssl.SSLEngine;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
-import org.apache.commons.cli.Option;
-import org.apache.commons.cli.Options;
 
 import com.datastax.driver.core.AuthProvider;
 import com.datastax.driver.core.RemoteEndpointAwareJdkSSLOptions;
@@ -313,52 +311,4 @@ public class BulkLoader
             return new BulkLoadConnectionFactory(serverEncOptions, storagePort);
         }
     }
-
-    public static class CmdLineOptions extends Options
-    {
-        /**
-         * Add option with argument and argument name
-         * @param opt shortcut for option name
-         * @param longOpt complete option name
-         * @param argName argument name
-         * @param description description of the option
-         * @return updated Options object
-         */
-        public Options addOption(String opt, String longOpt, String argName, String description)
-        {
... 139 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org