You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ad...@apache.org on 2022/11/03 11:47:17 UTC

[cassandra] branch cassandra-3.11 updated (deede44af5 -> 7df905a429)

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

adelapena pushed a change to branch cassandra-3.11
in repository https://gitbox.apache.org/repos/asf/cassandra.git


    from deede44af5 Merge branch 'cassandra-3.0' into cassandra-3.11
     new 116ce3bc05 CircleCI: Add jobs for missing specialized unit tests
     new 7df905a429 Merge branch 'cassandra-3.0' into cassandra-3.11

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .circleci/config-2_1.yml                |  70 ++++--
 .circleci/config-2_1.yml.high_res.patch |   6 +-
 .circleci/config-2_1.yml.mid_res.patch  |  12 +-
 .circleci/config.yml                    | 403 +++++++++++++++++++++++++++++--
 .circleci/config.yml.HIGHRES            | 413 ++++++++++++++++++++++++++++++--
 .circleci/config.yml.LOWRES             | 413 ++++++++++++++++++++++++++++++--
 .circleci/config.yml.MIDRES             | 413 ++++++++++++++++++++++++++++++--
 .circleci/generate.sh                   |   1 +
 8 files changed, 1606 insertions(+), 125 deletions(-)


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


[cassandra] 01/01: Merge branch 'cassandra-3.0' into cassandra-3.11

Posted by ad...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

adelapena pushed a commit to branch cassandra-3.11
in repository https://gitbox.apache.org/repos/asf/cassandra.git

commit 7df905a4293af692b793b9364f2011f1c0a3a0d9
Merge: deede44af5 116ce3bc05
Author: Andrés de la Peña <a....@gmail.com>
AuthorDate: Thu Nov 3 11:36:22 2022 +0000

    Merge branch 'cassandra-3.0' into cassandra-3.11

 .circleci/config-2_1.yml                |  70 ++++--
 .circleci/config-2_1.yml.high_res.patch |   6 +-
 .circleci/config-2_1.yml.mid_res.patch  |  12 +-
 .circleci/config.yml                    | 403 +++++++++++++++++++++++++++++--
 .circleci/config.yml.HIGHRES            | 413 ++++++++++++++++++++++++++++++--
 .circleci/config.yml.LOWRES             | 413 ++++++++++++++++++++++++++++++--
 .circleci/config.yml.MIDRES             | 413 ++++++++++++++++++++++++++++++--
 .circleci/generate.sh                   |   1 +
 8 files changed, 1606 insertions(+), 125 deletions(-)

diff --cc .circleci/config-2_1.yml
index c3703d699d,48bce92a3a..92dd98d332
--- a/.circleci/config-2_1.yml
+++ b/.circleci/config-2_1.yml
@@@ -109,7 -101,7 +109,6 @@@ default_env_vars: &default_env_var
      # REPEATED_ANT_TEST_TARGET: test-jvm-dtest-some
      # REPEATED_ANT_TEST_TARGET: test-cdc
      # REPEATED_ANT_TEST_TARGET: test-compression
--    # REPEATED_ANT_TEST_TARGET: test-system-keyspace-directory
      REPEATED_ANT_TEST_TARGET: testsome
      # The name of JUnit class to be run multiple times, for example:
      # REPEATED_ANT_TEST_CLASS: org.apache.cassandra.cql3.ViewTest
@@@ -199,7 -191,7 +198,7 @@@ separate_jobs: &separate_job
          requires:
            - start_j8_jvm_dtests_repeat
            - build
--    # specialized unit tests (all run using Java 8)
++    # specialized unit tests (all run on request)
      - start_utests_long:
          type: approval
      - utests_long:
@@@ -212,6 -204,6 +211,18 @@@
          requires:
            - start_utests_long_repeat
            - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++          - start_utests_cdc
++          - build
++    - start_utests_cdc_repeat:
++        type: approval
++    - utests_cdc_repeat:
++        requires:
++          - start_utests_cdc_repeat
++          - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -320,7 -301,7 +331,7 @@@ pre-commit_jobs: &pre-commit_job
      - j8_jvm_dtests_repeat:
          requires:
            - build
--    # specialized unit tests (all run on request using Java 8)
++    # specialized unit tests (all run on request)
      - start_utests_long:
          type: approval
      - utests_long:
@@@ -331,6 -312,6 +342,16 @@@
          requires:
            - start_utests_long
            - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++          - start_utests_cdc
++          - build
++    - utests_cdc_repeat:
++        requires:
++          - start_utests_cdc
++          - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -481,6 -448,6 +502,16 @@@ jobs
        - run_junit_tests:
            target: long-test
  
++  utests_cdc:
++    <<: *j8_par_executor
++    steps:
++      - attach_workspace:
++          at: /home/cassandra
++      - create_junit_containers
++      - log_environment
++      - run_parallel_junit_tests:
++          target: testclasslist-cdc
++
    utests_compression:
      <<: *j8_par_executor
      steps:
@@@ -552,21 -511,21 +583,21 @@@
        - log_environment
        - run_unit_tests_repeat
  
--  utests_compression_repeat:
++  utests_cdc_repeat:
      <<: *j8_repeated_utest_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
        - log_environment
--      - run_utests_compression_repeat
++      - run_utests_cdc_repeat
  
--  utests_system_keyspace_directory_repeat:
++  utests_compression_repeat:
      <<: *j8_repeated_utest_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
        - log_environment
--      - run_utests_system_keyspace_directory_repeat
++      - run_utests_compression_repeat
  
    utests_long_repeat:
      <<: *j8_repeated_utest_executor
@@@ -984,18 -932,18 +1015,18 @@@ commands
            count: ${REPEATED_UTESTS_COUNT}
            stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
  
--  run_utests_compression_repeat:
++  run_utests_cdc_repeat:
      steps:
        - run_repeated_utests:
--          target: test-compression
++          target: test-cdc
            tests: ${REPEATED_UTESTS}
            count: ${REPEATED_UTESTS_COUNT}
            stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
  
--  run_utests_system_keyspace_directory_repeat:
++  run_utests_compression_repeat:
      steps:
        - run_repeated_utests:
--          target: test-system-keyspace-directory
++          target: test-compression
            tests: ${REPEATED_UTESTS}
            count: ${REPEATED_UTESTS_COUNT}
            stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
@@@ -1064,7 -1004,14 +1095,16 @@@
              # Put manually specified tests and automatically detected tests together, removing duplicates
              tests=$(echo <<parameters.tests>> | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
              echo "Tests to be repeated: ${tests}"
 -            
 +
+             # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+             target=<<parameters.target>>
+             testtag=""
 -            if [[ $target == "test-compression" ]]; then
++            if [[ $target == "test-cdc" ]]; then
++              testtag="cdc"
++            elif [[ $target == "test-compression" ]]; then
+               testtag="compression"
+             fi
+ 
              # Run each test class as many times as requested.
              exit_code="$?"
              for test in $tests; do
@@@ -1083,9 -1030,8 +1123,8 @@@
                  if [[ $target == "test" || \
                        $target == "test-cdc" || \
                        $target == "test-compression" || \
--                      $target == "test-system-keyspace-directory" || \
 -                      $target == "long-test" ]]; then
 +                      $target == "long-test" || \
 +                      $target == "stress-test" ]]; then
                    name_arg="-Dtest.name=${class##*.}"
                  else
                    name_arg="-Dtest.name=$class"
@@@ -1205,9 -1151,8 +1244,8 @@@
                  if [[ $target == "test" || \
                        $target == "test-cdc" || \
                        $target == "test-compression" || \
--                      $target == "test-system-keyspace-directory" || \
 -                      $target == "long-test" ]]; then
 +                      $target == "long-test" || \
 +                      $target == "stress-test" ]]; then
                    name="-Dtest.name=$class_name"
                  else
                    name="-Dtest.name=$class_path"
diff --cc .circleci/config-2_1.yml.high_res.patch
index d2996086de,bdc37a0307..6c1ca83ea4
--- a/.circleci/config-2_1.yml.high_res.patch
+++ b/.circleci/config-2_1.yml.high_res.patch
@@@ -1,5 -1,5 +1,5 @@@
- --- config-2_1.yml	2022-10-15 14:49:08.115591764 +0100
- +++ config-2_1.yml.HIGHRES	2022-10-15 14:50:05.887981105 +0100
 ---- config-2_1.yml	2022-10-15 16:29:48.670020291 +0100
 -+++ config-2_1.yml.HIGHRES	2022-10-15 16:30:17.885329362 +0100
++--- config-2_1.yml	2022-10-27 10:16:44.059665934 +0100
+++++ config-2_1.yml.HIGHRES	2022-10-27 10:18:01.956045811 +0100
  @@ -40,8 +40,8 @@
       CASSANDRA_SKIP_SYNC: true
       DTEST_REPO: https://github.com/apache/cassandra-dtest.git
@@@ -11,7 -11,7 +11,7 @@@
   
       # Whether the repeated test iterations should stop on the first failure by default.
       REPEATED_TESTS_STOP_ON_FAILURE: false
- @@ -126,46 +126,50 @@
 -@@ -118,46 +118,50 @@
++@@ -125,46 +125,50 @@
   j8_par_executor: &j8_par_executor
     executor:
       name: java8-executor
diff --cc .circleci/config-2_1.yml.mid_res.patch
index 8eb567d5e4,05cf0c275e..8fce189ce8
--- a/.circleci/config-2_1.yml.mid_res.patch
+++ b/.circleci/config-2_1.yml.mid_res.patch
@@@ -1,6 -1,6 +1,6 @@@
- --- config-2_1.yml	2022-10-15 14:49:08.115591764 +0100
- +++ config-2_1.yml.MIDRES	2022-10-15 14:50:05.881594331 +0100
- @@ -127,45 +127,65 @@
 ---- config-2_1.yml	2022-10-15 16:29:48.670020291 +0100
 -+++ config-2_1.yml.MIDRES	2022-10-15 16:30:17.879007207 +0100
 -@@ -119,45 +119,65 @@
++--- config-2_1.yml	2022-10-27 10:16:44.059665934 +0100
+++++ config-2_1.yml.MIDRES	2022-10-27 10:18:01.949746099 +0100
++@@ -126,45 +126,65 @@
     executor:
       name: java8-executor
       #exec_resource_class: xlarge
@@@ -73,8 -73,8 +73,8 @@@
   
   separate_jobs: &separate_jobs
     jobs:
- @@ -500,7 +520,7 @@
 -@@ -459,7 +479,7 @@
 -           target: testclasslist-compression
++@@ -531,7 +551,7 @@
 +           target: stress-test
   
     j8_dtests_vnode:
  -    <<: *j8_par_executor
@@@ -82,7 -82,7 +82,7 @@@
       steps:
         - attach_workspace:
             at: /home/cassandra
- @@ -514,7 +534,7 @@
 -@@ -473,7 +493,7 @@
++@@ -545,7 +565,7 @@
             pytest_extra_args: '--use-vnodes --num-tokens=32 --skip-resource-intensive-tests'
   
     j8_dtests:
@@@ -91,7 -91,7 +91,7 @@@
       steps:
         - attach_workspace:
             at: /home/cassandra
- @@ -528,7 +548,7 @@
 -@@ -487,7 +507,7 @@
++@@ -559,7 +579,7 @@
             pytest_extra_args: '--skip-resource-intensive-tests'
   
     j8_upgrade_dtests:
diff --cc .circleci/config.yml
index ed0689d749,84da5cfb0a..aa877ba101
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@@ -183,6 -181,13 +183,15 @@@ jobs
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-compression
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -201,9 -206,8 +210,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -288,183 -292,6 +296,191 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress_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
 +          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
 +
 +          # Calculate the number of test iterations to be run by the current parallel runner.
 +          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
 +          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
 +            count=$((count+1))
 +          fi
 +
 +          # Put manually specified tests and automatically detected tests together, removing duplicates
 +          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
 +          echo "Tests to be repeated: ${tests}"
 +
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=stress-test-some
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
 +          # Run each test class as many times as requested.
 +          exit_code="$?"
 +          for test in $tests; do
 +
 +              # Split class and method names from the test name
 +              if [[ $test =~ "#" ]]; then
 +                class=${test%"#"*}
 +                method=${test#*"#"}
 +              else
 +                class=$test
 +                method=""
 +              fi
 +
 +              # Prepare the -Dtest.name argument.
 +              # It can be the fully qualified class name or the short class name, depending on the target.
 +              if [[ $target == "test" || \
 +                    $target == "test-cdc" || \
 +                    $target == "test-compression" || \
-                     $target == "test-system-keyspace-directory" || \
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
 +                name_arg="-Dtest.name=${class##*.}"
 +              else
 +                name_arg="-Dtest.name=$class"
 +              fi
 +
 +              # Prepare the -Dtest.methods argument, which is optional
-               if [ $method == "" ]; then
++              if [[ $method == "" ]]; then
 +                methods_arg=""
 +              else
 +                methods_arg="-Dtest.methods=$method"
 +              fi
 +
 +              for i in $(seq -w 1 $count); do
 +                echo "Running test $test, iteration $i of $count"
 +
 +                # run the test
 +                status="passes"
 +                if !( set -o pipefail && \
 +                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
 +                      tee stdout.txt \
 +                    ); then
 +                  status="fails"
 +                  exit_code=1
 +                fi
 +
 +                # move the stdout output file
 +                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
 +                mkdir -p $dest
 +                mv stdout.txt $dest/${test}.txt
 +
 +                # move the XML output files
-                 source=build/test/output
++                source=build/test/output/${testtag}
 +                dest=/tmp/results/repeated_utests/output/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # move the log files
-                 source=build/test/logs
++                source=build/test/logs/${testtag}
 +                dest=/tmp/results/repeated_utests/logs/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # maybe stop iterations on test failure
 +                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
 +                  break
 +                fi
 +              done
 +          done
 +          (exit ${exit_code})
 +    - 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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_COUNT: 500
      - REPEATED_JVM_DTESTS: null
      - REPEATED_JVM_DTESTS_COUNT: 500
      - REPEATED_JVM_UPGRADE_DTESTS: null
@@@ -533,6 -360,13 +549,15 @@@
            tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=long-testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -551,9 -385,8 +576,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -708,6 -539,13 +732,15 @@@
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -726,9 -564,8 +759,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1351,6 -1178,13 +1383,15 @@@
            tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1369,9 -1203,8 +1410,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1428,78 -1261,13 +1468,189 @@@
      - store_test_results:
          path: /tmp/results/repeated_utests/output
      - store_artifacts:
 -        path: /tmp/results/repeated_utests/stdout
 -        destination: stdout
 +        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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++  utests_cdc:
++    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: Determine unit Tests to Run
++        command: |
++          # reminder: this code (along with all the steps) is independently executed on every circle container
++          # so the goal here is to get the circleci script to return the tests *this* container will run
++          # which we do via the `circleci` cli tool.
++
++          rm -fr ~/cassandra-dtest/upgrade_tests
++          echo "***java tests***"
++
++          # get all of our unit test filenames
++          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
++
++          # split up the unit tests into groups based on the number of containers we have
++          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
++          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
++          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
++          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
++        no_output_timeout: 15m
++    - 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: Run Unit Tests (testclasslist-cdc)
++        command: |
++          set -x
++          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
++          test_timeout=$(grep 'name="test.unit.timeout"' build.xml | awk -F'"' '{print $4}' || true)
++          if [ -z "$test_timeout" ]; then
++            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
++          fi
++          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
++        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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
++    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress:
 +    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 (stress-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 stress-test -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
 +        no_output_timeout: 15m
 +    - store_test_results:
 +        path: /tmp/cassandra/build/test/output/
      - store_artifacts:
 -        path: /tmp/results/repeated_utests/output
 +        path: /tmp/cassandra/build/test/output
          destination: junitxml
      - store_artifacts:
 -        path: /tmp/results/repeated_utests/logs
 +        path: /tmp/cassandra/build/test/logs
          destination: logs
      environment:
      - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@@ -1856,6 -1616,13 +2007,15 @@@
            tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1874,9 -1641,8 +2034,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -2050,9 -1814,8 +2209,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name="-Dtest.name=$class_name"
                else
                  name="-Dtest.name=$class_path"
@@@ -2265,22 -2026,20 +2423,205 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++  utests_cdc_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
++          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
++
++          # Calculate the number of test iterations to be run by the current parallel runner.
++          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
++          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
++            count=$((count+1))
++          fi
++
++          # Put manually specified tests and automatically detected tests together, removing duplicates
++          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
++          echo "Tests to be repeated: ${tests}"
++
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=test-cdc
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
++          # Run each test class as many times as requested.
++          exit_code="$?"
++          for test in $tests; do
++
++              # Split class and method names from the test name
++              if [[ $test =~ "#" ]]; then
++                class=${test%"#"*}
++                method=${test#*"#"}
++              else
++                class=$test
++                method=""
++              fi
++
++              # Prepare the -Dtest.name argument.
++              # It can be the fully qualified class name or the short class name, depending on the target.
++              if [[ $target == "test" || \
++                    $target == "test-cdc" || \
++                    $target == "test-compression" || \
++                    $target == "long-test" || \
++                    $target == "stress-test" ]]; then
++                name_arg="-Dtest.name=${class##*.}"
++              else
++                name_arg="-Dtest.name=$class"
++              fi
++
++              # Prepare the -Dtest.methods argument, which is optional
++              if [[ $method == "" ]]; then
++                methods_arg=""
++              else
++                methods_arg="-Dtest.methods=$method"
++              fi
++
++              for i in $(seq -w 1 $count); do
++                echo "Running test $test, iteration $i of $count"
++
++                # run the test
++                status="passes"
++                if !( set -o pipefail && \
++                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
++                      tee stdout.txt \
++                    ); then
++                  status="fails"
++                  exit_code=1
++                fi
++
++                # move the stdout output file
++                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
++                mkdir -p $dest
++                mv stdout.txt $dest/${test}.txt
++
++                # move the XML output files
++                source=build/test/output/${testtag}
++                dest=/tmp/results/repeated_utests/output/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # move the log files
++                source=build/test/logs/${testtag}
++                dest=/tmp/results/repeated_utests/logs/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # maybe stop iterations on test failure
++                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
++                  break
++                fi
++              done
++          done
++          (exit ${exit_code})
++    - 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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
+     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    j8_jvm_dtests:
      docker:
      - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@@ -2692,6 -2443,6 +3033,12 @@@ workflows
          requires:
          - start_utests_long
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -2753,6 -2498,6 +3100,12 @@@
          requires:
          - start_utests_long
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
diff --cc .circleci/config.yml.HIGHRES
index b832815cc3,cf4e5f4fcb..d35a97ece5
--- a/.circleci/config.yml.HIGHRES
+++ b/.circleci/config.yml.HIGHRES
@@@ -183,6 -181,13 +183,15 @@@ jobs
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-compression
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -201,9 -206,8 +210,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -288,183 -292,6 +296,191 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress_repeat:
 +    docker:
 +    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
 +    resource_class: xlarge
 +    working_directory: ~/
 +    shell: /bin/bash -eo pipefail -l
 +    parallelism: 100
 +    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
 +          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
 +
 +          # Calculate the number of test iterations to be run by the current parallel runner.
 +          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
 +          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
 +            count=$((count+1))
 +          fi
 +
 +          # Put manually specified tests and automatically detected tests together, removing duplicates
 +          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
 +          echo "Tests to be repeated: ${tests}"
 +
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=stress-test-some
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
 +          # Run each test class as many times as requested.
 +          exit_code="$?"
 +          for test in $tests; do
 +
 +              # Split class and method names from the test name
 +              if [[ $test =~ "#" ]]; then
 +                class=${test%"#"*}
 +                method=${test#*"#"}
 +              else
 +                class=$test
 +                method=""
 +              fi
 +
 +              # Prepare the -Dtest.name argument.
 +              # It can be the fully qualified class name or the short class name, depending on the target.
 +              if [[ $target == "test" || \
 +                    $target == "test-cdc" || \
 +                    $target == "test-compression" || \
-                     $target == "test-system-keyspace-directory" || \
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
 +                name_arg="-Dtest.name=${class##*.}"
 +              else
 +                name_arg="-Dtest.name=$class"
 +              fi
 +
 +              # Prepare the -Dtest.methods argument, which is optional
-               if [ $method == "" ]; then
++              if [[ $method == "" ]]; then
 +                methods_arg=""
 +              else
 +                methods_arg="-Dtest.methods=$method"
 +              fi
 +
 +              for i in $(seq -w 1 $count); do
 +                echo "Running test $test, iteration $i of $count"
 +
 +                # run the test
 +                status="passes"
 +                if !( set -o pipefail && \
 +                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
 +                      tee stdout.txt \
 +                    ); then
 +                  status="fails"
 +                  exit_code=1
 +                fi
 +
 +                # move the stdout output file
 +                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
 +                mkdir -p $dest
 +                mv stdout.txt $dest/${test}.txt
 +
 +                # move the XML output files
-                 source=build/test/output
++                source=build/test/output/${testtag}
 +                dest=/tmp/results/repeated_utests/output/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # move the log files
-                 source=build/test/logs
++                source=build/test/logs/${testtag}
 +                dest=/tmp/results/repeated_utests/logs/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # maybe stop iterations on test failure
 +                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
 +                  break
 +                fi
 +              done
 +          done
 +          (exit ${exit_code})
 +    - 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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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: 2048M
 +    - CCM_HEAP_NEWSIZE: 512M
 +    - REPEATED_TESTS_STOP_ON_FAILURE: false
 +    - REPEATED_UTESTS: null
 +    - REPEATED_UTESTS_COUNT: 500
 +    - REPEATED_UTESTS_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_COUNT: 500
      - REPEATED_JVM_DTESTS: null
      - REPEATED_JVM_DTESTS_COUNT: 500
      - REPEATED_JVM_UPGRADE_DTESTS: null
@@@ -533,6 -360,13 +549,15 @@@
            tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=long-testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -551,9 -385,8 +576,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -708,6 -539,13 +732,15 @@@
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -726,9 -564,8 +759,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1351,6 -1178,13 +1383,15 @@@
            tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1369,9 -1203,8 +1410,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1472,7 -1303,116 +1512,118 @@@
      - REPEATED_ANT_TEST_COUNT: 500
      - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
      - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 -  j8_unit_tests:
++  utests_cdc:
+     docker:
+     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+     resource_class: xlarge
+     working_directory: ~/
+     shell: /bin/bash -eo pipefail -l
+     parallelism: 100
+     steps:
+     - attach_workspace:
+         at: /home/cassandra
+     - run:
+         name: Determine unit Tests to Run
+         command: |
+           # reminder: this code (along with all the steps) is independently executed on every circle container
+           # so the goal here is to get the circleci script to return the tests *this* container will run
+           # which we do via the `circleci` cli tool.
+ 
+           rm -fr ~/cassandra-dtest/upgrade_tests
+           echo "***java tests***"
+ 
+           # get all of our unit test filenames
+           set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
+ 
+           # split up the unit tests into groups based on the number of containers we have
+           set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+           set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+           echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+           cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+         no_output_timeout: 15m
+     - 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: Run Unit Tests (testclasslist)
++        name: Run Unit Tests (testclasslist-cdc)
+         command: |
+           set -x
+           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
+           test_timeout=$(grep 'name="test.unit.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+           if [ -z "$test_timeout" ]; then
+             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+           fi
 -          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
++          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
+         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:
+     - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - 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: 2048M
+     - CCM_HEAP_NEWSIZE: 512M
+     - REPEATED_TESTS_STOP_ON_FAILURE: false
+     - REPEATED_UTESTS: null
+     - REPEATED_UTESTS_COUNT: 500
+     - REPEATED_UTESTS_LONG: null
+     - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
+     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 -  j8_dtests:
 +  utests_stress:
      docker:
      - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
      resource_class: xlarge
@@@ -1856,6 -1616,13 +2007,15 @@@
            tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1874,9 -1641,8 +2034,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -2050,9 -1814,8 +2209,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name="-Dtest.name=$class_name"
                else
                  name="-Dtest.name=$class_path"
@@@ -2265,22 -2026,20 +2423,205 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++  utests_cdc_repeat:
++    docker:
++    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
++    resource_class: xlarge
++    working_directory: ~/
++    shell: /bin/bash -eo pipefail -l
++    parallelism: 100
++    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
++          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
++
++          # Calculate the number of test iterations to be run by the current parallel runner.
++          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
++          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
++            count=$((count+1))
++          fi
++
++          # Put manually specified tests and automatically detected tests together, removing duplicates
++          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
++          echo "Tests to be repeated: ${tests}"
++
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=test-cdc
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
++          # Run each test class as many times as requested.
++          exit_code="$?"
++          for test in $tests; do
++
++              # Split class and method names from the test name
++              if [[ $test =~ "#" ]]; then
++                class=${test%"#"*}
++                method=${test#*"#"}
++              else
++                class=$test
++                method=""
++              fi
++
++              # Prepare the -Dtest.name argument.
++              # It can be the fully qualified class name or the short class name, depending on the target.
++              if [[ $target == "test" || \
++                    $target == "test-cdc" || \
++                    $target == "test-compression" || \
++                    $target == "long-test" || \
++                    $target == "stress-test" ]]; then
++                name_arg="-Dtest.name=${class##*.}"
++              else
++                name_arg="-Dtest.name=$class"
++              fi
++
++              # Prepare the -Dtest.methods argument, which is optional
++              if [[ $method == "" ]]; then
++                methods_arg=""
++              else
++                methods_arg="-Dtest.methods=$method"
++              fi
++
++              for i in $(seq -w 1 $count); do
++                echo "Running test $test, iteration $i of $count"
++
++                # run the test
++                status="passes"
++                if !( set -o pipefail && \
++                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
++                      tee stdout.txt \
++                    ); then
++                  status="fails"
++                  exit_code=1
++                fi
++
++                # move the stdout output file
++                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
++                mkdir -p $dest
++                mv stdout.txt $dest/${test}.txt
++
++                # move the XML output files
++                source=build/test/output/${testtag}
++                dest=/tmp/results/repeated_utests/output/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # move the log files
++                source=build/test/logs/${testtag}
++                dest=/tmp/results/repeated_utests/logs/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # maybe stop iterations on test failure
++                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
++                  break
++                fi
++              done
++          done
++          (exit ${exit_code})
++    - 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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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: 2048M
++    - CCM_HEAP_NEWSIZE: 512M
++    - REPEATED_TESTS_STOP_ON_FAILURE: false
++    - REPEATED_UTESTS: null
++    - REPEATED_UTESTS_COUNT: 500
++    - REPEATED_UTESTS_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
+     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    j8_jvm_dtests:
      docker:
      - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@@ -2710,6 -2461,6 +3051,18 @@@ workflows
          requires:
          - start_utests_long_repeat
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - start_utests_cdc_repeat:
++        type: approval
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc_repeat
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -2823,6 -2562,6 +3176,16 @@@
          requires:
          - start_utests_long
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
diff --cc .circleci/config.yml.LOWRES
index fcebba8dae,f611444ec2..7358442b26
--- a/.circleci/config.yml.LOWRES
+++ b/.circleci/config.yml.LOWRES
@@@ -183,6 -181,13 +183,15 @@@ jobs
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-compression
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -201,9 -206,8 +210,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -288,183 -292,6 +296,191 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress_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
 +          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
 +
 +          # Calculate the number of test iterations to be run by the current parallel runner.
 +          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
 +          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
 +            count=$((count+1))
 +          fi
 +
 +          # Put manually specified tests and automatically detected tests together, removing duplicates
 +          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
 +          echo "Tests to be repeated: ${tests}"
 +
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=stress-test-some
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
 +          # Run each test class as many times as requested.
 +          exit_code="$?"
 +          for test in $tests; do
 +
 +              # Split class and method names from the test name
 +              if [[ $test =~ "#" ]]; then
 +                class=${test%"#"*}
 +                method=${test#*"#"}
 +              else
 +                class=$test
 +                method=""
 +              fi
 +
 +              # Prepare the -Dtest.name argument.
 +              # It can be the fully qualified class name or the short class name, depending on the target.
 +              if [[ $target == "test" || \
 +                    $target == "test-cdc" || \
 +                    $target == "test-compression" || \
-                     $target == "test-system-keyspace-directory" || \
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
 +                name_arg="-Dtest.name=${class##*.}"
 +              else
 +                name_arg="-Dtest.name=$class"
 +              fi
 +
 +              # Prepare the -Dtest.methods argument, which is optional
-               if [ $method == "" ]; then
++              if [[ $method == "" ]]; then
 +                methods_arg=""
 +              else
 +                methods_arg="-Dtest.methods=$method"
 +              fi
 +
 +              for i in $(seq -w 1 $count); do
 +                echo "Running test $test, iteration $i of $count"
 +
 +                # run the test
 +                status="passes"
 +                if !( set -o pipefail && \
 +                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
 +                      tee stdout.txt \
 +                    ); then
 +                  status="fails"
 +                  exit_code=1
 +                fi
 +
 +                # move the stdout output file
 +                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
 +                mkdir -p $dest
 +                mv stdout.txt $dest/${test}.txt
 +
 +                # move the XML output files
-                 source=build/test/output
++                source=build/test/output/${testtag}
 +                dest=/tmp/results/repeated_utests/output/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # move the log files
-                 source=build/test/logs
++                source=build/test/logs/${testtag}
 +                dest=/tmp/results/repeated_utests/logs/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # maybe stop iterations on test failure
 +                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
 +                  break
 +                fi
 +              done
 +          done
 +          (exit ${exit_code})
 +    - 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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_COUNT: 500
      - REPEATED_JVM_DTESTS: null
      - REPEATED_JVM_DTESTS_COUNT: 500
      - REPEATED_JVM_UPGRADE_DTESTS: null
@@@ -533,6 -360,13 +549,15 @@@
            tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=long-testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -551,9 -385,8 +576,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -708,6 -539,13 +732,15 @@@
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -726,9 -564,8 +759,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1351,6 -1178,13 +1383,15 @@@
            tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1369,9 -1203,8 +1410,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1426,80 -1259,15 +1466,191 @@@
            done
            (exit ${exit_code})
      - store_test_results:
 -        path: /tmp/results/repeated_utests/output
 -    - store_artifacts:
 -        path: /tmp/results/repeated_utests/stdout
 -        destination: stdout
 +        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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++  utests_cdc:
++    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: Determine unit Tests to Run
++        command: |
++          # reminder: this code (along with all the steps) is independently executed on every circle container
++          # so the goal here is to get the circleci script to return the tests *this* container will run
++          # which we do via the `circleci` cli tool.
++
++          rm -fr ~/cassandra-dtest/upgrade_tests
++          echo "***java tests***"
++
++          # get all of our unit test filenames
++          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
++
++          # split up the unit tests into groups based on the number of containers we have
++          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
++          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
++          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
++          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
++        no_output_timeout: 15m
++    - 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: Run Unit Tests (testclasslist-cdc)
++        command: |
++          set -x
++          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
++          test_timeout=$(grep 'name="test.unit.timeout"' build.xml | awk -F'"' '{print $4}' || true)
++          if [ -z "$test_timeout" ]; then
++            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
++          fi
++          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
++        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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
++    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress:
 +    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 (stress-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 stress-test -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
 +        no_output_timeout: 15m
 +    - store_test_results:
 +        path: /tmp/cassandra/build/test/output/
      - store_artifacts:
 -        path: /tmp/results/repeated_utests/output
 +        path: /tmp/cassandra/build/test/output
          destination: junitxml
      - store_artifacts:
 -        path: /tmp/results/repeated_utests/logs
 +        path: /tmp/cassandra/build/test/logs
          destination: logs
      environment:
      - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@@ -1856,6 -1616,13 +2007,15 @@@
            tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1874,9 -1641,8 +2034,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -2050,9 -1814,8 +2209,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name="-Dtest.name=$class_name"
                else
                  name="-Dtest.name=$class_path"
@@@ -2265,22 -2026,20 +2423,205 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++  utests_cdc_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
++          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
++
++          # Calculate the number of test iterations to be run by the current parallel runner.
++          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
++          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
++            count=$((count+1))
++          fi
++
++          # Put manually specified tests and automatically detected tests together, removing duplicates
++          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
++          echo "Tests to be repeated: ${tests}"
++
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=test-cdc
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
++          # Run each test class as many times as requested.
++          exit_code="$?"
++          for test in $tests; do
++
++              # Split class and method names from the test name
++              if [[ $test =~ "#" ]]; then
++                class=${test%"#"*}
++                method=${test#*"#"}
++              else
++                class=$test
++                method=""
++              fi
++
++              # Prepare the -Dtest.name argument.
++              # It can be the fully qualified class name or the short class name, depending on the target.
++              if [[ $target == "test" || \
++                    $target == "test-cdc" || \
++                    $target == "test-compression" || \
++                    $target == "long-test" || \
++                    $target == "stress-test" ]]; then
++                name_arg="-Dtest.name=${class##*.}"
++              else
++                name_arg="-Dtest.name=$class"
++              fi
++
++              # Prepare the -Dtest.methods argument, which is optional
++              if [[ $method == "" ]]; then
++                methods_arg=""
++              else
++                methods_arg="-Dtest.methods=$method"
++              fi
++
++              for i in $(seq -w 1 $count); do
++                echo "Running test $test, iteration $i of $count"
++
++                # run the test
++                status="passes"
++                if !( set -o pipefail && \
++                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
++                      tee stdout.txt \
++                    ); then
++                  status="fails"
++                  exit_code=1
++                fi
++
++                # move the stdout output file
++                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
++                mkdir -p $dest
++                mv stdout.txt $dest/${test}.txt
++
++                # move the XML output files
++                source=build/test/output/${testtag}
++                dest=/tmp/results/repeated_utests/output/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # move the log files
++                source=build/test/logs/${testtag}
++                dest=/tmp/results/repeated_utests/logs/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # maybe stop iterations on test failure
++                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
++                  break
++                fi
++              done
++          done
++          (exit ${exit_code})
++    - 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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
+     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    j8_jvm_dtests:
      docker:
      - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@@ -2710,6 -2461,6 +3051,18 @@@ workflows
          requires:
          - start_utests_long_repeat
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - start_utests_cdc_repeat:
++        type: approval
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc_repeat
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -2823,6 -2562,6 +3176,16 @@@
          requires:
          - start_utests_long
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
diff --cc .circleci/config.yml.MIDRES
index 609d0a1026,85f8d70369..9051b2bfbe
--- a/.circleci/config.yml.MIDRES
+++ b/.circleci/config.yml.MIDRES
@@@ -183,6 -181,13 +183,15 @@@ jobs
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-compression
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -201,9 -206,8 +210,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -288,183 -292,6 +296,191 @@@
      - REPEATED_UTESTS_COUNT: 500
      - REPEATED_UTESTS_LONG: null
      - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
 +    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  utests_stress_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
 +          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
 +
 +          # Calculate the number of test iterations to be run by the current parallel runner.
 +          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
 +          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
 +            count=$((count+1))
 +          fi
 +
 +          # Put manually specified tests and automatically detected tests together, removing duplicates
 +          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
 +          echo "Tests to be repeated: ${tests}"
 +
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=stress-test-some
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
 +          # Run each test class as many times as requested.
 +          exit_code="$?"
 +          for test in $tests; do
 +
 +              # Split class and method names from the test name
 +              if [[ $test =~ "#" ]]; then
 +                class=${test%"#"*}
 +                method=${test#*"#"}
 +              else
 +                class=$test
 +                method=""
 +              fi
 +
 +              # Prepare the -Dtest.name argument.
 +              # It can be the fully qualified class name or the short class name, depending on the target.
 +              if [[ $target == "test" || \
 +                    $target == "test-cdc" || \
 +                    $target == "test-compression" || \
-                     $target == "test-system-keyspace-directory" || \
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
 +                name_arg="-Dtest.name=${class##*.}"
 +              else
 +                name_arg="-Dtest.name=$class"
 +              fi
 +
 +              # Prepare the -Dtest.methods argument, which is optional
-               if [ $method == "" ]; then
++              if [[ $method == "" ]]; then
 +                methods_arg=""
 +              else
 +                methods_arg="-Dtest.methods=$method"
 +              fi
 +
 +              for i in $(seq -w 1 $count); do
 +                echo "Running test $test, iteration $i of $count"
 +
 +                # run the test
 +                status="passes"
 +                if !( set -o pipefail && \
 +                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
 +                      tee stdout.txt \
 +                    ); then
 +                  status="fails"
 +                  exit_code=1
 +                fi
 +
 +                # move the stdout output file
 +                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
 +                mkdir -p $dest
 +                mv stdout.txt $dest/${test}.txt
 +
 +                # move the XML output files
-                 source=build/test/output
++                source=build/test/output/${testtag}
 +                dest=/tmp/results/repeated_utests/output/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # move the log files
-                 source=build/test/logs
++                source=build/test/logs/${testtag}
 +                dest=/tmp/results/repeated_utests/logs/${status}/${i}
 +                mkdir -p $dest
 +                if [[ -d $source && -n "$(ls $source)" ]]; then
 +                  mv $source/* $dest/
 +                fi
 +
 +                # maybe stop iterations on test failure
 +                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
 +                  break
 +                fi
 +              done
 +          done
 +          (exit ${exit_code})
 +    - 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:
 +    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +    - 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_LONG: null
 +    - REPEATED_UTESTS_LONG_COUNT: 100
 +    - REPEATED_UTESTS_STRESS: null
 +    - REPEATED_UTESTS_STRESS_COUNT: 500
      - REPEATED_JVM_DTESTS: null
      - REPEATED_JVM_DTESTS_COUNT: 500
      - REPEATED_JVM_UPGRADE_DTESTS: null
@@@ -533,6 -360,13 +549,15 @@@
            tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=long-testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -551,9 -385,8 +576,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -708,6 -539,13 +732,15 @@@
            tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=testsome
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -726,9 -564,8 +759,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1351,6 -1178,13 +1383,15 @@@
            tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1369,9 -1203,8 +1410,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -1472,13 -1303,122 +1512,124 @@@
      - REPEATED_ANT_TEST_COUNT: 500
      - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
      - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 -  j8_unit_tests:
++  utests_cdc:
+     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: Determine unit Tests to Run
+         command: |
+           # reminder: this code (along with all the steps) is independently executed on every circle container
+           # so the goal here is to get the circleci script to return the tests *this* container will run
+           # which we do via the `circleci` cli tool.
+ 
+           rm -fr ~/cassandra-dtest/upgrade_tests
+           echo "***java tests***"
+ 
+           # get all of our unit test filenames
+           set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
+ 
+           # split up the unit tests into groups based on the number of containers we have
+           set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+           set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+           echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+           cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+         no_output_timeout: 15m
+     - 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: Run Unit Tests (testclasslist)
++        name: Run Unit Tests (testclasslist-cdc)
+         command: |
+           set -x
+           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
+           test_timeout=$(grep 'name="test.unit.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+           if [ -z "$test_timeout" ]; then
+             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+           fi
 -          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
++          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit
+         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:
+     - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - 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_LONG: null
+     - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
+     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 -  j8_dtests:
 +  utests_stress:
      docker:
      - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
 -    resource_class: large
 +    resource_class: medium
      working_directory: ~/
      shell: /bin/bash -eo pipefail -l
 -    parallelism: 50
 +    parallelism: 1
      steps:
      - attach_workspace:
          at: /home/cassandra
@@@ -1856,6 -1616,13 +2007,15 @@@
            tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
            echo "Tests to be repeated: ${tests}"
  
+           # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
+           target=test-jvm-dtest-some
+           testtag=""
 -          if [[ $target == "test-compression" ]]; then
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
+             testtag="compression"
+           fi
+ 
            # Run each test class as many times as requested.
            exit_code="$?"
            for test in $tests; do
@@@ -1874,9 -1641,8 +2034,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name_arg="-Dtest.name=${class##*.}"
                else
                  name_arg="-Dtest.name=$class"
@@@ -2050,9 -1814,8 +2209,8 @@@
                if [[ $target == "test" || \
                      $target == "test-cdc" || \
                      $target == "test-compression" || \
--                    $target == "test-system-keyspace-directory" || \
 -                    $target == "long-test" ]]; then
 +                    $target == "long-test" || \
 +                    $target == "stress-test" ]]; then
                  name="-Dtest.name=$class_name"
                else
                  name="-Dtest.name=$class_path"
@@@ -2281,13 -2040,13 +2439,196 @@@
      - REPEATED_ANT_TEST_COUNT: 500
      - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
      - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 -  j8_jvm_dtests:
++  utests_cdc_repeat:
+     docker:
+     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+     resource_class: medium
+     working_directory: ~/
+     shell: /bin/bash -eo pipefail -l
 -    parallelism: 1
++    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
++          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
++
++          # Calculate the number of test iterations to be run by the current parallel runner.
++          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
++          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
++            count=$((count+1))
++          fi
++
++          # Put manually specified tests and automatically detected tests together, removing duplicates
++          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
++          echo "Tests to be repeated: ${tests}"
++
++          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
++          target=test-cdc
++          testtag=""
++          if [[ $target == "test-cdc" ]]; then
++            testtag="cdc"
++          elif [[ $target == "test-compression" ]]; then
++            testtag="compression"
++          fi
++
++          # Run each test class as many times as requested.
++          exit_code="$?"
++          for test in $tests; do
++
++              # Split class and method names from the test name
++              if [[ $test =~ "#" ]]; then
++                class=${test%"#"*}
++                method=${test#*"#"}
++              else
++                class=$test
++                method=""
++              fi
++
++              # Prepare the -Dtest.name argument.
++              # It can be the fully qualified class name or the short class name, depending on the target.
++              if [[ $target == "test" || \
++                    $target == "test-cdc" || \
++                    $target == "test-compression" || \
++                    $target == "long-test" || \
++                    $target == "stress-test" ]]; then
++                name_arg="-Dtest.name=${class##*.}"
++              else
++                name_arg="-Dtest.name=$class"
++              fi
++
++              # Prepare the -Dtest.methods argument, which is optional
++              if [[ $method == "" ]]; then
++                methods_arg=""
++              else
++                methods_arg="-Dtest.methods=$method"
++              fi
++
++              for i in $(seq -w 1 $count); do
++                echo "Running test $test, iteration $i of $count"
++
++                # run the test
++                status="passes"
++                if !( set -o pipefail && \
++                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
++                      tee stdout.txt \
++                    ); then
++                  status="fails"
++                  exit_code=1
++                fi
++
++                # move the stdout output file
++                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
++                mkdir -p $dest
++                mv stdout.txt $dest/${test}.txt
++
++                # move the XML output files
++                source=build/test/output/${testtag}
++                dest=/tmp/results/repeated_utests/output/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # move the log files
++                source=build/test/logs/${testtag}
++                dest=/tmp/results/repeated_utests/logs/${status}/${i}
++                mkdir -p $dest
++                if [[ -d $source && -n "$(ls $source)" ]]; then
++                  mv $source/* $dest/
++                fi
++
++                # maybe stop iterations on test failure
++                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
++                  break
++                fi
++              done
++          done
++          (exit ${exit_code})
++    - 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:
++    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - 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_LONG: null
++    - REPEATED_UTESTS_LONG_COUNT: 100
++    - REPEATED_UTESTS_STRESS: null
++    - REPEATED_UTESTS_STRESS_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_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_COUNT: 500
++    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
++    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
 +  j8_jvm_dtests:
 +    docker:
 +    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
 +    resource_class: large
 +    working_directory: ~/
 +    shell: /bin/bash -eo pipefail -l
 +    parallelism: 10
      steps:
      - attach_workspace:
          at: /home/cassandra
@@@ -2710,6 -2461,6 +3051,18 @@@ workflows
          requires:
          - start_utests_long_repeat
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - start_utests_cdc_repeat:
++        type: approval
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc_repeat
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
@@@ -2823,6 -2562,6 +3176,16 @@@
          requires:
          - start_utests_long
          - build
++    - start_utests_cdc:
++        type: approval
++    - utests_cdc:
++        requires:
++        - start_utests_cdc
++        - build
++    - utests_cdc_repeat:
++        requires:
++        - start_utests_cdc
++        - build
      - start_utests_compression:
          type: approval
      - utests_compression:
diff --cc .circleci/generate.sh
index c636631f89,76fe9433c6..8c877b8e7b
--- a/.circleci/generate.sh
+++ b/.circleci/generate.sh
@@@ -247,6 -242,6 +247,7 @@@ delete_job(
  if (! (echo "$env_vars" | grep -q "REPEATED_UTESTS=" )); then
    delete_job "j8_unit_tests_repeat"
    delete_job "j11_unit_tests_repeat"
++  delete_job "utests_cdc_repeat"
    delete_job "utests_compression_repeat"
    delete_job "utests_system_keyspace_directory_repeat"
  fi


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