#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

version: 2
jobs:
  j8_jvm_upgrade_dtests:
    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: Determine distributed 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/distributed/**/*.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/distributed/;;g" | grep "Test\.java$" | grep upgrade > /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)
        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.distributed.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=distributed -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_fqltool_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_cqlshlib_cython_tests:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Run cqlshlib Unit Tests
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          export cython="yes"
          time mv ~/cassandra /tmp
          cd /tmp/cassandra/
          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/pylib
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py311_vnode:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests_vnode_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir  $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_dtests_large_vnode:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_large_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_large_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_large_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_large_with_vnodes_raw /tmp/all_dtest_tests_j8_large_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_large_with_vnodes_raw > /tmp/all_dtest_tests_j8_large_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_large_with_vnodes > /tmp/split_dtest_tests_j8_large_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_large_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_large_with_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_large_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_large_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_system_keyspace_directory:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: 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-system-keyspace-directory)
        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-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_stress_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_cqlsh_dtests_py311:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_jvm_dtests_vnode:
    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: Determine distributed 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/distributed/**/*.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/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /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)
        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.distributed.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.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_utests_compression_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_unit_tests:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: 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)
        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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py3:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py38:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_utests_compression_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_repeated_ant_test:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Run repeated JUnit test
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_ANT_TEST_CLASS}" == "<nil>" ]; then
            echo "Repeated utest class name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_ANT_TEST_COUNT}" == "<nil>" ]; then
            echo "Repeated utest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_ANT_TEST_COUNT}" -le 0 ]; then
            echo "Repeated utest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_ANT_TEST_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_ANT_TEST_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_ANT_TEST_TARGET} ${REPEATED_ANT_TEST_CLASS} ${REPEATED_ANT_TEST_METHODS} ${REPEATED_ANT_TEST_COUNT} times"

              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

              target=${REPEATED_ANT_TEST_TARGET}
              class_path=${REPEATED_ANT_TEST_CLASS}
              class_name="${class_path##*.}"

              # 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 == "fqltool-test" || \
                    $target == "long-test" || \
                    $target == "stress-test" || \
                    $target == "test-simulator-dtest" ]]; then
                name="-Dtest.name=$class_name"
              else
                name="-Dtest.name=$class_path"
              fi

              # Prepare the -Dtest.methods argument, which is optional
              if [ "${REPEATED_ANT_TEST_METHODS}" == "<nil>" ]; then
                methods=""
              else
                methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
              fi

              # Prepare the JVM dtests vnodes argument, which is optional
              vnodes_args=""
              if ${REPEATED_ANT_TEST_VNODES}; then
                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
              fi

              # Run the test target as many times as requested collecting the exit code,
              # stopping the iteration only if stop_on_failure is set.
              exit_code="$?"
              for i in $(seq -w 1 $count); do

                echo "Running test iteration $i of $count"

                # run the test
                status="passes"
                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                  status="fails"
                  exit_code=1
                fi

                # move the stdout output file
                dest=/tmp/results/repeated_utest/stdout/${status}/${i}
                mkdir -p $dest
                mv stdout.txt $dest/${REPEATED_ANT_TEST_TARGET}-${REPEATED_ANT_TEST_CLASS}.txt

                # move the XML output files
                source=build/test/output
                dest=/tmp/results/repeated_utest/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
                dest=/tmp/results/repeated_utest/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

              (exit ${exit_code})
            fi
          fi
    - store_test_results:
        path: /tmp/results/repeated_utest/output
    - store_artifacts:
        path: /tmp/results/repeated_utest/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utest/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utest/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_dtests_large_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_large_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_large_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_large_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_large_with_vnodes_raw /tmp/all_dtest_tests_j11_large_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_large_with_vnodes_raw > /tmp/all_dtest_tests_j11_large_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_large_with_vnodes > /tmp/split_dtest_tests_j11_large_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_large_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_large_with_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_large_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_large_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_dtests_large_vnode_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_LARGE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_LARGE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_LARGE_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_LARGE_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --only-resource-intensive-tests --force-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py311:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py38_offheap:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j11_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_dtests_large:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_large_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_large_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --only-resource-intensive-tests --force-resource-intensive-tests --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_large_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_large_without_vnodes_raw /tmp/all_dtest_tests_j11_large_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_large_without_vnodes_raw > /tmp/all_dtest_tests_j11_large_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_large_without_vnodes > /tmp/split_dtest_tests_j11_large_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_large_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_large_without_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_large_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_large_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_utests_system_keyspace_directory_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py3_vnode:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py3:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlshlib_cython_tests:
    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 cqlshlib Unit Tests
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          export cython="yes"
          time mv ~/cassandra /tmp
          cd /tmp/cassandra/
          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/pylib
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_cdc:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: 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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_utests_fqltool:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Run Unit Tests (fqltool-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 fqltool-test -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_utests_system_keyspace_directory:
    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-system-keyspace-directory)
        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-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_offheap_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --use-off-heap-memtables --skip-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests_offheap_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --use-off-heap-memtables --skip-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_dtests_large_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_LARGE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_LARGE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_LARGE_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_LARGE_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if false; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --only-resource-intensive-tests --force-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_jvm_dtests_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Determine distributed 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/distributed/**/*.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/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /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)
        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.distributed.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.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_simulator_dtests:
    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: 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 Simulator Tests
        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
          ant test-simulator-dtest -Dno-build-test=true
        no_output_timeout: 30m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_utests_compression:
    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-compression)
        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-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_long:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Run Unit Tests (long-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 long-test -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_unit_tests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_large:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_large_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_large_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --only-resource-intensive-tests --force-resource-intensive-tests --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_large_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_large_without_vnodes_raw /tmp/all_dtest_tests_j8_large_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_large_without_vnodes_raw > /tmp/all_dtest_tests_j8_large_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_large_without_vnodes > /tmp/split_dtest_tests_j8_large_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_large_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_large_without_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_large_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_large_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_stress:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Run Unit Tests (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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py38_offheap:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j8_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_upgrade_dtests_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_UPGRADE_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_UPGRADE_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_UPGRADE_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_UPGRADE_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_UPGRADE_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if false; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if true; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir  $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_cdc_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_dtests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if false; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir  $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_utests_fqltool_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_jvm_dtests_vnode_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_compression:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: 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-compression)
        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-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py38:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_without_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py3_offheap:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j11_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_simulator_dtests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_SIMULATOR_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-simulator-dtest\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-simulator-dtest $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py311_offheap:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j11_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_utests_system_keyspace_directory_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests_large_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_LARGE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_LARGE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_LARGE_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_LARGE_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if false; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --only-resource-intensive-tests --force-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_cqlsh_dtests_py3_offheap:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j8_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_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\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_vnode_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir  $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py3_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt

          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.6' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.6
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_upgrade_dtests:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_upgradetests_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_upgradetests_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_upgradetests_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_upgradetests_without_vnodes_raw /tmp/all_dtest_tests_j8_upgradetests_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_upgradetests_without_vnodes_raw > /tmp/all_dtest_tests_j8_upgradetests_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_upgradetests_without_vnodes > /tmp/split_dtest_tests_j8_upgradetests_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_upgradetests_without_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_upgradetests_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_upgradetests_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests_offheap:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j11_dtests_offheap)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_jvm_upgrade_dtests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlsh_dtests_py38_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_jvm_dtests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_cqlsh_dtests_py311_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_utests_long_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_offheap:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j8_dtests_offheap)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_unit_tests:
    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)
        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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_jvm_dtests:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Determine distributed 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/distributed/**/*.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/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /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)
        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.distributed.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=distributed -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_jvm_dtests_vnode_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j11_build:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - 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: Clone Cassandra Repository (via git)
        command: |
          git clone --single-branch --depth 1 --branch $CIRCLE_BRANCH https://github.com/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME.git ~/cassandra
    - run:
        name: Build Cassandra
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          cd ~/cassandra
          # Loop to prevent failure due to maven-ant-tasks not downloading a jar..
          for x in $(seq 1 3); do
              ${ANT_HOME}/bin/ant clean realclean jar
              RETURN="$?"
              if [ "${RETURN}" -eq "0" ]; then
                  break
              fi
          done
          # Exit, if we didn't build successfully
          if [ "${RETURN}" -ne "0" ]; then
              echo "Build failed with exit code: ${RETURN}"
              exit ${RETURN}
          fi
        no_output_timeout: 15m
    - run:
        name: Run eclipse-warnings
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          cd ~/cassandra
          ant eclipse-warnings
    - persist_to_workspace:
        root: /home/cassandra
        paths:
        - cassandra
        - .m2
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_dtests:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_without_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_vnode:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_with_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_cqlshlib_tests:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Run cqlshlib Unit Tests
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          time mv ~/cassandra /tmp
          cd /tmp/cassandra/
          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/pylib
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_jvm_dtests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_without_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_without_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_without_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_without_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_repeated_ant_test:
    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: Run repeated JUnit test
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_ANT_TEST_CLASS}" == "<nil>" ]; then
            echo "Repeated utest class name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_ANT_TEST_COUNT}" == "<nil>" ]; then
            echo "Repeated utest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_ANT_TEST_COUNT}" -le 0 ]; then
            echo "Repeated utest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_ANT_TEST_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_ANT_TEST_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_ANT_TEST_TARGET} ${REPEATED_ANT_TEST_CLASS} ${REPEATED_ANT_TEST_METHODS} ${REPEATED_ANT_TEST_COUNT} times"

              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

              target=${REPEATED_ANT_TEST_TARGET}
              class_path=${REPEATED_ANT_TEST_CLASS}
              class_name="${class_path##*.}"

              # 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 == "fqltool-test" || \
                    $target == "long-test" || \
                    $target == "stress-test" || \
                    $target == "test-simulator-dtest" ]]; then
                name="-Dtest.name=$class_name"
              else
                name="-Dtest.name=$class_path"
              fi

              # Prepare the -Dtest.methods argument, which is optional
              if [ "${REPEATED_ANT_TEST_METHODS}" == "<nil>" ]; then
                methods=""
              else
                methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
              fi

              # Prepare the JVM dtests vnodes argument, which is optional
              vnodes_args=""
              if ${REPEATED_ANT_TEST_VNODES}; then
                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
              fi

              # Run the test target as many times as requested collecting the exit code,
              # stopping the iteration only if stop_on_failure is set.
              exit_code="$?"
              for i in $(seq -w 1 $count); do

                echo "Running test iteration $i of $count"

                # run the test
                status="passes"
                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                  status="fails"
                  exit_code=1
                fi

                # move the stdout output file
                dest=/tmp/results/repeated_utest/stdout/${status}/${i}
                mkdir -p $dest
                mv stdout.txt $dest/${REPEATED_ANT_TEST_TARGET}-${REPEATED_ANT_TEST_CLASS}.txt

                # move the XML output files
                source=build/test/output
                dest=/tmp/results/repeated_utest/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
                dest=/tmp/results/repeated_utest/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

              (exit ${exit_code})
            fi
          fi
    - store_test_results:
        path: /tmp/results/repeated_utest/output
    - store_artifacts:
        path: /tmp/results/repeated_utest/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utest/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utest/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_utests_long:
    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 (long-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 long-test -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_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 -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_cqlsh_dtests_py311_offheap:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_dtests_offheap)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.11/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
    - run:
        name: Run dtests (j8_dtests_offheap)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt

          source ~/env3.11/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.11' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.11
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_dtests_offheap
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_dtests_offheap_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if false; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir  $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-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: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Determine distributed 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/distributed/**/*.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/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /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)
        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.distributed.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=distributed -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_build:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 1
    steps:
    - 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: Clone Cassandra Repository (via git)
        command: |
          git clone --single-branch --depth 1 --branch $CIRCLE_BRANCH https://github.com/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME.git ~/cassandra
    - run:
        name: Build Cassandra
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          cd ~/cassandra
          # Loop to prevent failure due to maven-ant-tasks not downloading a jar..
          for x in $(seq 1 3); do
              ${ANT_HOME}/bin/ant clean realclean jar
              RETURN="$?"
              if [ "${RETURN}" -eq "0" ]; then
                  break
              fi
          done
          # Exit, if we didn't build successfully
          if [ "${RETURN}" -ne "0" ]; then
              echo "Build failed with exit code: ${RETURN}"
              exit ${RETURN}
          fi
        no_output_timeout: 15m
    - run:
        name: Run eclipse-warnings
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          cd ~/cassandra
          ant eclipse-warnings
    - persist_to_workspace:
        root: /home/cassandra
        paths:
        - cassandra
        - .m2
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_cqlsh_dtests_py38_vnode:
    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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j8_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.8/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j8_with_vnodes)
        no_output_timeout: 15m
        command: |
          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt

          source ~/env3.8/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          if [ -n 'CQLSH_PYTHON=/usr/bin/python3.8' ]; then
            export CQLSH_PYTHON=/usr/bin/python3.8
          fi

          java -version
          cd ~/cassandra-dtest
          mkdir -p /tmp/dtest

          echo "env: $(env)"
          echo "** done env"
          mkdir -p /tmp/results/dtests
          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
          if [ ! -z "$SPLIT_TESTS" ]; then
            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
          else
            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
            (exit 1)
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j8_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j8_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_unit_tests_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_utests_fqltool:
    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 (fqltool-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 fqltool-test -Dno-build-test=true
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/build/test/output/
    - store_artifacts:
        path: /tmp/cassandra/build/test/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/cassandra/build/test/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_cqlshlib_tests:
    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 cqlshlib Unit Tests
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          time mv ~/cassandra /tmp
          cd /tmp/cassandra/
          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
        no_output_timeout: 15m
    - store_test_results:
        path: /tmp/cassandra/pylib
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_dtests_vnode:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Determine Tests to Run (j11_with_vnodes)
        no_output_timeout: 5m
        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k not cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
    - run:
        name: Run dtests (j11_with_vnodes)
        no_output_timeout: 15m
        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest_j11_with_vnodes
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_j11_with_vnodes_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_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\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j8_dtests_large_vnode_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: Clone Cassandra dtest Repository (via git)
        command: |
          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
    - run:
        name: Configure virtualenv and python Dependencies
        command: |
          # note, this should be super quick as all dependencies should be pre-installed in the docker image
          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
          source ~/env3.6/bin/activate
          export PATH=$JAVA_HOME/bin:$PATH
          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
          pip3 uninstall -y cqlsh
          pip3 freeze
    - run:
        name: Run repeated Python DTests
        no_output_timeout: 15m
        command: |
          if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
            echo "Repeated dtest name hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" == "<nil>" ]; then
            echo "Repeated dtest count hasn't been defined, exiting without running any test"
          elif [ "${REPEATED_LARGE_DTESTS_COUNT}" -le 0 ]; then
            echo "Repeated dtest count is lesser or equals than zero, exiting without running any test"
          else

            # Calculate the number of test iterations to be run by the current parallel runner.
            # Since we are running the same test multiple times there is no need to use `circleci tests split`.
            count=$((${REPEATED_LARGE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
            if (($CIRCLE_NODE_INDEX < (${REPEATED_LARGE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
              count=$((count+1))
            fi

            if (($count <= 0)); then
              echo "No tests to run in this runner"
            else
              echo "Running ${REPEATED_LARGE_DTESTS} $count times"

              source ~/env3.6/bin/activate
              export PATH=$JAVA_HOME/bin:$PATH

              java -version
              cd ~/cassandra-dtest
              mkdir -p /tmp/dtest

              echo "env: $(env)"
              echo "** done env"
              mkdir -p /tmp/results/dtests

              tests_arg=$(echo ${REPEATED_LARGE_DTESTS} | sed -e "s/,/ /g")

              stop_on_failure_arg=""
              if ${REPEATED_TESTS_STOP_ON_FAILURE}; then
                stop_on_failure_arg="-x"
              fi

              vnodes_args=""
              if true; then
                vnodes_args="--use-vnodes --num-tokens=16"
              fi

              upgrade_arg=""
              if false; then
                upgrade_arg="--execute-upgrade-tests --upgrade-target-version-only --upgrade-version-selection all"
              fi

              # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
              set -o pipefail && cd ~/cassandra-dtest && pytest $vnodes_args --count=$count $stop_on_failure_arg $upgrade_arg --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir --only-resource-intensive-tests --force-resource-intensive-tests $tests_arg | tee /tmp/dtest/stdout.txt
            fi
          fi
    - store_test_results:
        path: /tmp/results
    - store_artifacts:
        path: /tmp/dtest
        destination: dtest
    - store_artifacts:
        path: ~/cassandra-dtest/logs
        destination: dtest_logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
  j11_utests_long_repeat:
    docker:
    - image: apache/cassandra-testing-ubuntu2004-java11:latest
    resource_class: medium
    working_directory: ~/
    shell: /bin/bash -eo pipefail -l
    parallelism: 4
    steps:
    - attach_workspace:
        at: /home/cassandra
    - run:
        name: Log Environment Information
        command: |
          echo '*** id ***'
          id
          echo '*** cat /proc/cpuinfo ***'
          cat /proc/cpuinfo
          echo '*** free -m ***'
          free -m
          echo '*** df -m ***'
          df -m
          echo '*** ifconfig -a ***'
          ifconfig -a
          echo '*** uname -a ***'
          uname -a
          echo '*** mount ***'
          mount
          echo '*** env ***'
          env
          echo '*** java ***'
          which java
          java -version
    - run:
        name: Repeatedly run new or modifed JUnit tests
        no_output_timeout: 15m
        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
    - store_test_results:
        path: /tmp/results/repeated_utests/output
    - store_artifacts:
        path: /tmp/results/repeated_utests/stdout
        destination: stdout
    - store_artifacts:
        path: /tmp/results/repeated_utests/output
        destination: junitxml
    - store_artifacts:
        path: /tmp/results/repeated_utests/logs
        destination: logs
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - CASSANDRA_USE_JDK11: true
  j8_dtest_jars_build:
    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: Build Cassandra DTest jars
        command: |
          export PATH=$JAVA_HOME/bin:$PATH
          cd ~/cassandra
          mkdir ~/dtest_jars
          git remote add apache https://github.com/apache/cassandra.git
          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 cassandra-4.1; do
            # check out the correct cassandra version:
            git remote set-branches --add apache '$branch'
            git fetch --depth 1 apache $branch
            git checkout $branch
            git clean -fd
            # Loop to prevent failure due to maven-ant-tasks not downloading a jar..
            for x in $(seq 1 3); do
                ${ANT_HOME}/bin/ant realclean; ${ANT_HOME}/bin/ant jar dtest-jar
                RETURN="$?"
                if [ "${RETURN}" -eq "0" ]; then
                    cp build/dtest*.jar ~/dtest_jars
                    break
                fi
            done
            # Exit, if we didn't build successfully
            if [ "${RETURN}" -ne "0" ]; then
                echo "Build failed with exit code: ${RETURN}"
                exit ${RETURN}
            fi
          done
          # and build the dtest-jar for the branch under test
          ${ANT_HOME}/bin/ant realclean
          git checkout origin/$CIRCLE_BRANCH
          git clean -fd
          for x in $(seq 1 3); do
              ${ANT_HOME}/bin/ant realclean; ${ANT_HOME}/bin/ant jar dtest-jar
              RETURN="$?"
              if [ "${RETURN}" -eq "0" ]; then
                  cp build/dtest*.jar ~/dtest_jars
                  break
              fi
          done
          # Exit, if we didn't build successfully
          if [ "${RETURN}" -ne "0" ]; then
              echo "Build failed with exit code: ${RETURN}"
              exit ${RETURN}
          fi
          ls -l ~/dtest_jars
        no_output_timeout: 15m
    - persist_to_workspace:
        root: /home/cassandra
        paths:
        - dtest_jars
    environment:
    - ANT_HOME: /usr/share/ant
    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - LANG: en_US.UTF-8
    - KEEP_TEST_DIR: true
    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
    - PYTHONIOENCODING: utf-8
    - PYTHONUNBUFFERED: true
    - CASS_DRIVER_NO_EXTENSIONS: true
    - CASS_DRIVER_NO_CYTHON: true
    - CASSANDRA_SKIP_SYNC: true
    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
    - DTEST_BRANCH: trunk
    - CCM_MAX_HEAP_SIZE: 1024M
    - CCM_HEAP_NEWSIZE: 256M
    - REPEATED_TESTS_STOP_ON_FAILURE: false
    - REPEATED_UTESTS: null
    - REPEATED_UTESTS_COUNT: 500
    - REPEATED_UTESTS_FQLTOOL: null
    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
    - REPEATED_UTESTS_LONG: null
    - REPEATED_UTESTS_LONG_COUNT: 100
    - REPEATED_UTESTS_STRESS: null
    - REPEATED_UTESTS_STRESS_COUNT: 500
    - REPEATED_SIMULATOR_DTESTS: null
    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
    - REPEATED_JVM_DTESTS: null
    - REPEATED_JVM_DTESTS_COUNT: 500
    - REPEATED_JVM_UPGRADE_DTESTS: null
    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
    - REPEATED_DTESTS: null
    - REPEATED_DTESTS_COUNT: 500
    - REPEATED_LARGE_DTESTS: null
    - REPEATED_LARGE_DTESTS_COUNT: 100
    - REPEATED_UPGRADE_DTESTS: null
    - REPEATED_UPGRADE_DTESTS_COUNT: 25
    - REPEATED_ANT_TEST_TARGET: testsome
    - REPEATED_ANT_TEST_CLASS: null
    - REPEATED_ANT_TEST_METHODS: null
    - REPEATED_ANT_TEST_VNODES: false
    - REPEATED_ANT_TEST_COUNT: 500
    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
workflows:
  version: 2
  java8_separate_tests:
    jobs:
    - start_j8_build:
        type: approval
    - j8_build:
        requires:
        - start_j8_build
    - start_j8_unit_tests:
        type: approval
    - j8_unit_tests:
        requires:
        - start_j8_unit_tests
        - j8_build
    - start_j8_jvm_dtests:
        type: approval
    - j8_jvm_dtests:
        requires:
        - start_j8_jvm_dtests
        - j8_build
    - start_j8_jvm_dtests_vnode:
        type: approval
    - j8_jvm_dtests_vnode:
        requires:
        - start_j8_jvm_dtests_vnode
        - j8_build
    - start_j11_jvm_dtests:
        type: approval
    - j11_jvm_dtests:
        requires:
        - start_j11_jvm_dtests
        - j8_build
    - start_j11_jvm_dtests_vnode:
        type: approval
    - j11_jvm_dtests_vnode:
        requires:
        - start_j11_jvm_dtests_vnode
        - j8_build
    - start_j8_simulator_dtests:
        type: approval
    - j8_simulator_dtests:
        requires:
        - start_j8_simulator_dtests
        - j8_build
    - start_j8_cqlshlib_tests:
        type: approval
    - j8_cqlshlib_tests:
        requires:
        - start_j8_cqlshlib_tests
        - j8_build
    - start_j8_cqlshlib_cython_tests:
        type: approval
    - j8_cqlshlib_cython_tests:
        requires:
        - start_j8_cqlshlib_cython_tests
        - j8_build
    - start_j11_cqlshlib_tests:
        type: approval
    - j11_cqlshlib_tests:
        requires:
        - start_j11_cqlshlib_tests
        - j8_build
    - start_j11_cqlshlib_cython_tests:
        type: approval
    - j11_cqlshlib_cython_tests:
        requires:
        - start_j11_cqlshlib_cython_tests
        - j8_build
    - start_j11_unit_tests:
        type: approval
    - j11_unit_tests:
        requires:
        - start_j11_unit_tests
        - j8_build
    - start_j8_utests_long:
        type: approval
    - j8_utests_long:
        requires:
        - start_j8_utests_long
        - j8_build
    - start_j11_utests_long:
        type: approval
    - j11_utests_long:
        requires:
        - start_j11_utests_long
        - j8_build
    - start_j8_utests_cdc:
        type: approval
    - j8_utests_cdc:
        requires:
        - start_j8_utests_cdc
        - j8_build
    - start_j11_utests_cdc:
        type: approval
    - j11_utests_cdc:
        requires:
        - start_j11_utests_cdc
        - j8_build
    - start_j8_utests_compression:
        type: approval
    - j8_utests_compression:
        requires:
        - start_j8_utests_compression
        - j8_build
    - start_j11_utests_compression:
        type: approval
    - j11_utests_compression:
        requires:
        - start_j11_utests_compression
        - j8_build
    - start_j8_utests_stress:
        type: approval
    - j8_utests_stress:
        requires:
        - start_j8_utests_stress
        - j8_build
    - start_j11_utests_stress:
        type: approval
    - j11_utests_stress:
        requires:
        - start_j11_utests_stress
        - j8_build
    - start_j8_utests_fqltool:
        type: approval
    - j8_utests_fqltool:
        requires:
        - start_j8_utests_fqltool
        - j8_build
    - start_j11_utests_fqltool:
        type: approval
    - j11_utests_fqltool:
        requires:
        - start_j11_utests_fqltool
        - j8_build
    - start_j8_utests_system_keyspace_directory:
        type: approval
    - j8_utests_system_keyspace_directory:
        requires:
        - start_j8_utests_system_keyspace_directory
        - j8_build
    - start_j11_utests_system_keyspace_directory:
        type: approval
    - j11_utests_system_keyspace_directory:
        requires:
        - start_j11_utests_system_keyspace_directory
        - j8_build
    - start_j8_dtest_jars_build:
        type: approval
    - j8_dtest_jars_build:
        requires:
        - j8_build
        - start_j8_dtest_jars_build
    - start_jvm_upgrade_dtests:
        type: approval
    - j8_jvm_upgrade_dtests:
        requires:
        - start_jvm_upgrade_dtests
        - j8_dtest_jars_build
    - start_j8_dtests:
        type: approval
    - j8_dtests:
        requires:
        - start_j8_dtests
        - j8_build
    - start_j8_dtests_vnode:
        type: approval
    - j8_dtests_vnode:
        requires:
        - start_j8_dtests_vnode
        - j8_build
    - start_j8_dtests_offheap:
        type: approval
    - j8_dtests_offheap:
        requires:
        - start_j8_dtests_offheap
        - j8_build
    - start_j11_dtests:
        type: approval
    - j11_dtests:
        requires:
        - start_j11_dtests
        - j8_build
    - start_j11_dtests_vnode:
        type: approval
    - j11_dtests_vnode:
        requires:
        - start_j11_dtests_vnode
        - j8_build
    - start_j11_dtests_offheap:
        type: approval
    - j11_dtests_offheap:
        requires:
        - start_j11_dtests_offheap
        - j8_build
    - start_j8_dtests_large:
        type: approval
    - j8_dtests_large:
        requires:
        - start_j8_dtests_large
        - j8_build
    - start_j8_dtests_large_vnode:
        type: approval
    - j8_dtests_large_vnode:
        requires:
        - start_j8_dtests_large_vnode
        - j8_build
    - start_j11_dtests_large:
        type: approval
    - j11_dtests_large:
        requires:
        - start_j11_dtests_large
        - j8_build
    - start_j11_dtests_large_vnode:
        type: approval
    - j11_dtests_large_vnode:
        requires:
        - start_j11_dtests_large_vnode
        - j8_build
    - start_upgrade_dtests:
        type: approval
    - j8_upgrade_dtests:
        requires:
        - start_upgrade_dtests
        - j8_build
    - start_j8_cqlsh_tests:
        type: approval
    - j8_cqlsh_dtests_py3:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - j8_cqlsh_dtests_py3_vnode:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - j8_cqlsh_dtests_py38:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - j8_cqlsh_dtests_py311:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - j8_cqlsh_dtests_py38_vnode:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - j8_cqlsh_dtests_py311_vnode:
        requires:
        - start_j8_cqlsh_tests
        - j8_build
    - start_j8_cqlsh_tests_offheap:
        type: approval
    - j8_cqlsh_dtests_py3_offheap:
        requires:
        - start_j8_cqlsh_tests_offheap
        - j8_build
    - j8_cqlsh_dtests_py38_offheap:
        requires:
        - start_j8_cqlsh_tests_offheap
        - j8_build
    - j8_cqlsh_dtests_py311_offheap:
        requires:
        - start_j8_cqlsh_tests_offheap
        - j8_build
    - start_j11_cqlsh_tests:
        type: approval
    - j11_cqlsh_dtests_py3:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - j11_cqlsh_dtests_py3_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - j11_cqlsh_dtests_py38:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - j11_cqlsh_dtests_py311:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - j11_cqlsh_dtests_py38_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - j11_cqlsh_dtests_py311_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j8_build
    - start_j11_cqlsh_tests_offheap:
        type: approval
    - j11_cqlsh_dtests_py3_offheap:
        requires:
        - start_j11_cqlsh_tests_offheap
        - j8_build
    - j11_cqlsh_dtests_py38_offheap:
        requires:
        - start_j11_cqlsh_tests_offheap
        - j8_build
    - j11_cqlsh_dtests_py311_offheap:
        requires:
        - start_j11_cqlsh_tests_offheap
        - j8_build
  java8_pre-commit_tests:
    jobs:
    - start_pre-commit_tests:
        type: approval
    - j8_build:
        requires:
        - start_pre-commit_tests
    - j8_unit_tests:
        requires:
        - j8_build
    - j8_simulator_dtests:
        requires:
        - j8_build
    - j8_jvm_dtests:
        requires:
        - j8_build
    - j8_jvm_dtests_vnode:
        requires:
        - j8_build
    - j11_jvm_dtests:
        requires:
        - j8_build
    - j11_jvm_dtests_vnode:
        requires:
        - j8_build
    - j8_cqlshlib_tests:
        requires:
        - j8_build
    - j8_cqlshlib_cython_tests:
        requires:
        - j8_build
    - j11_cqlshlib_tests:
        requires:
        - j8_build
    - j11_cqlshlib_cython_tests:
        requires:
        - j8_build
    - j11_unit_tests:
        requires:
        - j8_build
    - start_utests_long:
        type: approval
    - j8_utests_long:
        requires:
        - start_utests_long
        - j8_build
    - j11_utests_long:
        requires:
        - start_utests_long
        - j8_build
    - start_utests_cdc:
        type: approval
    - j8_utests_cdc:
        requires:
        - start_utests_cdc
        - j8_build
    - j11_utests_cdc:
        requires:
        - start_utests_cdc
        - j8_build
    - start_utests_compression:
        type: approval
    - j8_utests_compression:
        requires:
        - start_utests_compression
        - j8_build
    - j11_utests_compression:
        requires:
        - start_utests_compression
        - j8_build
    - start_utests_stress:
        type: approval
    - j8_utests_stress:
        requires:
        - start_utests_stress
        - j8_build
    - j11_utests_stress:
        requires:
        - start_utests_stress
        - j8_build
    - start_utests_fqltool:
        type: approval
    - j8_utests_fqltool:
        requires:
        - start_utests_fqltool
        - j8_build
    - j11_utests_fqltool:
        requires:
        - start_utests_fqltool
        - j8_build
    - start_utests_system_keyspace_directory:
        type: approval
    - j8_utests_system_keyspace_directory:
        requires:
        - j8_build
    - j11_utests_system_keyspace_directory:
        requires:
        - start_utests_system_keyspace_directory
        - j8_build
    - start_jvm_upgrade_dtests:
        type: approval
    - j8_dtest_jars_build:
        requires:
        - j8_build
        - start_jvm_upgrade_dtests
    - j8_jvm_upgrade_dtests:
        requires:
        - j8_dtest_jars_build
    - j8_dtests:
        requires:
        - j8_build
    - j8_dtests_vnode:
        requires:
        - j8_build
    - start_j8_dtests_offheap:
        type: approval
    - j8_dtests_offheap:
        requires:
        - start_j8_dtests_offheap
        - j8_build
    - j11_dtests:
        requires:
        - j8_build
    - j11_dtests_vnode:
        requires:
        - j8_build
    - start_j11_dtests_offheap:
        type: approval
    - j11_dtests_offheap:
        requires:
        - start_j11_dtests_offheap
        - j8_build
    - start_j8_dtests_large:
        type: approval
    - j8_dtests_large:
        requires:
        - start_j8_dtests_large
        - j8_build
    - j8_dtests_large_vnode:
        requires:
        - start_j8_dtests_large
        - j8_build
    - start_j11_dtests_large:
        type: approval
    - j11_dtests_large:
        requires:
        - start_j11_dtests_large
        - j8_build
    - j11_dtests_large_vnode:
        requires:
        - start_j11_dtests_large
        - j8_build
    - start_upgrade_dtests:
        type: approval
    - j8_upgrade_dtests:
        requires:
        - j8_build
        - start_upgrade_dtests
    - j8_cqlsh_dtests_py3:
        requires:
        - j8_build
    - j8_cqlsh_dtests_py3_vnode:
        requires:
        - j8_build
    - j8_cqlsh_dtests_py38:
        requires:
        - j8_build
    - j8_cqlsh_dtests_py311:
        requires:
        - j8_build
    - j8_cqlsh_dtests_py38_vnode:
        requires:
        - j8_build
    - j8_cqlsh_dtests_py311_vnode:
        requires:
        - j8_build
    - start_j8_cqlsh_dtests_offheap:
        type: approval
    - j8_cqlsh_dtests_py3_offheap:
        requires:
        - start_j8_cqlsh_dtests_offheap
        - j8_build
    - j8_cqlsh_dtests_py38_offheap:
        requires:
        - start_j8_cqlsh_dtests_offheap
        - j8_build
    - j8_cqlsh_dtests_py311_offheap:
        requires:
        - start_j8_cqlsh_dtests_offheap
        - j8_build
    - j11_cqlsh_dtests_py3:
        requires:
        - j8_build
    - j11_cqlsh_dtests_py3_vnode:
        requires:
        - j8_build
    - j11_cqlsh_dtests_py38:
        requires:
        - j8_build
    - j11_cqlsh_dtests_py311:
        requires:
        - j8_build
    - j11_cqlsh_dtests_py38_vnode:
        requires:
        - j8_build
    - j11_cqlsh_dtests_py311_vnode:
        requires:
        - j8_build
    - start_j11_cqlsh-dtests-offheap:
        type: approval
    - j11_cqlsh_dtests_py3_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j8_build
    - j11_cqlsh_dtests_py38_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j8_build
    - j11_cqlsh_dtests_py311_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j8_build
  java11_separate_tests:
    jobs:
    - start_j11_build:
        type: approval
    - j11_build:
        requires:
        - start_j11_build
    - start_j11_unit_tests:
        type: approval
    - j11_unit_tests:
        requires:
        - start_j11_unit_tests
        - j11_build
    - start_j11_jvm_dtests:
        type: approval
    - j11_jvm_dtests:
        requires:
        - start_j11_jvm_dtests
        - j11_build
    - start_j11_jvm_dtests_vnode:
        type: approval
    - j11_jvm_dtests_vnode:
        requires:
        - start_j11_jvm_dtests_vnode
        - j11_build
    - start_j11_cqlshlib_tests:
        type: approval
    - j11_cqlshlib_tests:
        requires:
        - start_j11_cqlshlib_tests
        - j11_build
    - start_j11_cqlshlib_cython_tests:
        type: approval
    - j11_cqlshlib_cython_tests:
        requires:
        - start_j11_cqlshlib_cython_tests
        - j11_build
    - start_j11_dtests:
        type: approval
    - j11_dtests:
        requires:
        - start_j11_dtests
        - j11_build
    - start_j11_dtests_vnode:
        type: approval
    - j11_dtests_vnode:
        requires:
        - start_j11_dtests_vnode
        - j11_build
    - start_j11_dtests_offheap:
        type: approval
    - j11_dtests_offheap:
        requires:
        - start_j11_dtests_offheap
        - j11_build
    - start_j11_dtests_large:
        type: approval
    - j11_dtests_large:
        requires:
        - start_j11_dtests_large
        - j11_build
    - start_j11_dtests_large_vnode:
        type: approval
    - j11_dtests_large_vnode:
        requires:
        - start_j11_dtests_large_vnode
        - j11_build
    - start_j11_cqlsh_tests:
        type: approval
    - j11_cqlsh_dtests_py3:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - j11_cqlsh_dtests_py3_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - j11_cqlsh_dtests_py38:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - j11_cqlsh_dtests_py311:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - j11_cqlsh_dtests_py38_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - j11_cqlsh_dtests_py311_vnode:
        requires:
        - start_j11_cqlsh_tests
        - j11_build
    - start_j11_cqlsh-dtests-offheap:
        type: approval
    - j11_cqlsh_dtests_py3_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - j11_cqlsh_dtests_py38_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - j11_cqlsh_dtests_py311_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - start_j11_utests_long:
        type: approval
    - j11_utests_long:
        requires:
        - start_j11_utests_long
        - j11_build
    - start_j11_utests_cdc:
        type: approval
    - j11_utests_cdc:
        requires:
        - start_j11_utests_cdc
        - j11_build
    - start_j11_utests_compression:
        type: approval
    - j11_utests_compression:
        requires:
        - start_j11_utests_compression
        - j11_build
    - start_j11_utests_stress:
        type: approval
    - j11_utests_stress:
        requires:
        - start_j11_utests_stress
        - j11_build
    - start_j11_utests_fqltool:
        type: approval
    - j11_utests_fqltool:
        requires:
        - start_j11_utests_fqltool
        - j11_build
    - start_j11_utests_system_keyspace_directory:
        type: approval
    - j11_utests_system_keyspace_directory:
        requires:
        - start_j11_utests_system_keyspace_directory
        - j11_build
  java11_pre-commit_tests:
    jobs:
    - start_pre-commit_tests:
        type: approval
    - j11_build:
        requires:
        - start_pre-commit_tests
    - j11_unit_tests:
        requires:
        - j11_build
    - j11_jvm_dtests:
        requires:
        - j11_build
    - j11_jvm_dtests_vnode:
        requires:
        - j11_build
    - j11_cqlshlib_tests:
        requires:
        - j11_build
    - j11_cqlshlib_cython_tests:
        requires:
        - j11_build
    - j11_dtests:
        requires:
        - j11_build
    - j11_dtests_vnode:
        requires:
        - j11_build
    - start_j11_dtests_offheap:
        type: approval
    - j11_dtests_offheap:
        requires:
        - start_j11_dtests_offheap
        - j11_build
    - start_j11_dtests_large:
        type: approval
    - j11_dtests_large:
        requires:
        - start_j11_dtests_large
        - j11_build
    - j11_dtests_large_vnode:
        requires:
        - start_j11_dtests_large
        - j11_build
    - j11_cqlsh_dtests_py3:
        requires:
        - j11_build
    - j11_cqlsh_dtests_py3_vnode:
        requires:
        - j11_build
    - j11_cqlsh_dtests_py38:
        requires:
        - j11_build
    - j11_cqlsh_dtests_py311:
        requires:
        - j11_build
    - j11_cqlsh_dtests_py38_vnode:
        requires:
        - j11_build
    - j11_cqlsh_dtests_py311_vnode:
        requires:
        - j11_build
    - start_j11_cqlsh-dtests-offheap:
        type: approval
    - j11_cqlsh_dtests_py3_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - j11_cqlsh_dtests_py38_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - j11_cqlsh_dtests_py311_offheap:
        requires:
        - start_j11_cqlsh-dtests-offheap
        - j11_build
    - start_utests_long:
        type: approval
    - j11_utests_long:
        requires:
        - start_utests_long
        - j11_build
    - start_utests_cdc:
        type: approval
    - j11_utests_cdc:
        requires:
        - start_utests_cdc
        - j11_build
    - start_utests_compression:
        type: approval
    - j11_utests_compression:
        requires:
        - start_utests_compression
        - j11_build
    - start_utests_stress:
        type: approval
    - j11_utests_stress:
        requires:
        - start_utests_stress
        - j11_build
    - start_utests_fqltool:
        type: approval
    - j11_utests_fqltool:
        requires:
        - start_utests_fqltool
        - j11_build
    - start_utests_system_keyspace_directory:
        type: approval
    - j11_utests_system_keyspace_directory:
        requires:
        - start_utests_system_keyspace_directory
        - j11_build
