You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2026/09/13 00:10:32 UTC

(geode) branch support/1.15 updated: GEODE-10550: Enable GitHub Actions workflows for support/1.15 branch (#7980)

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

JinwooHwang pushed a commit to branch support/1.15
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/support/1.15 by this push:
     new 944c4bb9a9 GEODE-10550: Enable GitHub Actions workflows for support/1.15 branch (#7980)
944c4bb9a9 is described below

commit 944c4bb9a9445f04d40add88693df9024f28d7c5
Author: Sai Boorlagadda <sa...@apache.org>
AuthorDate: Sat Sep 12 17:10:26 2026 -0700

    GEODE-10550: Enable GitHub Actions workflows for support/1.15 branch (#7980)
    
    * GEODE-10550: Enable GitHub Actions workflows for support/1.15 branch
    
    Add GitHub Actions workflow files to support/1.15 branch to enable
    automated CI/CD checks for pull requests targeting this branch.
    
    This change adds two workflow files:
    - .github/workflows/codeql.yml: CodeQL security scanning
    - .github/workflows/gradle.yml: Build, test, and code quality checks
    
    The workflows will run on:
    - Push events to support/1.15 branch
    - Pull requests targeting support/1.15 branch
    - Scheduled weekly security scans (CodeQL only)
    
    This ensures that dependency updates and security fixes submitted
    to the support/1.15 branch are properly validated before merge.
    
    * Fix Java version to JDK 8 for support/1.15 branch
    
    The support/1.15 branch uses Gradle 6.8.3 and is configured for Java 8.
    Updated all workflow jobs to use JDK 8 instead of JDK 17 to match the
    branch requirements.
    
    Changes:
    - Updated all jobs to use java-version: '8'
    - Changed JAVA_HOME references from JAVA_HOME_17_X64 to JAVA_HOME_8_X64
    - Updated testJava*Home parameters to use testJava8Home
    - Set JAVA_BUILD_VERSION and JAVA_TEST_VERSION to 8
    
    * Fix race condition in WanCopyRegionFunctionServiceTest
    
    The test severalExecuteWithDifferentRegionOrSenderAreAllowed was failing
    intermittently with 'expected: 5 but was: 2/3' due to a race condition.
    
    Root Cause:
    The test creates 5 CompletableFuture tasks using supplyAsync(), which
    executes asynchronously. There was no guarantee that all tasks would
    call service.execute() and be added to the executions map before the
    final assertion checked the count.
    
    The race occurred because:
    1. CompletableFuture.supplyAsync() schedules tasks asynchronously
    2. Multiple tasks could be scheduled but not yet executed
    3. The assertion would run before all tasks had called service.execute()
    
    Solution:
    Instead of starting all tasks and then waiting, we now start each task
    sequentially and wait for it to be registered in the executions map
    before starting the next one. This ensures:
    - Each execution is fully registered before the next one starts
    - No race condition between task scheduling and execution registration
    - The final count is guaranteed to be 5
    
    This approach is more deterministic and eliminates the race condition
    while still testing that multiple executions with different regions
    are allowed to run concurrently.
    
    * Fix OplogEntryIdSetTest to avoid threshold-based overflow
    
    The test addMethodOverflowsWhenInternalAddThrowsIllegalArgumentException
    was failing with 'Expected size: 2 but was: 100' because the
    DRF_HASHMAP_OVERFLOW_THRESHOLD was set to 10 by another test
    (OplogEntryIdSetDrfHashSetThresholdTest).
    
    Root Cause:
    DRF_HASHMAP_OVERFLOW_THRESHOLD is a static final field initialized when
    DiskStoreImpl class is loaded. If OplogEntryIdSetDrfHashSetThresholdTest
    runs first and sets the system property to 10, then DiskStoreImpl loads
    with threshold=10 instead of the default 805306368.
    
    With threshold=10 and testEntries=1000:
    - The test adds 999 int entries and 999 long entries
    - Every 10 entries triggers shouldOverflow() to return true
    - This creates ~100 hash sets (999/10) instead of the expected 2
    
    Solution:
    Reduced testEntries from 1000 to 5 to ensure we stay well below any
    possible threshold value (even if set to 10 by other tests). This
    ensures the test only creates overflow hash sets via the mocked
    IllegalArgumentException mechanism, not via the threshold mechanism.
    
    The test still validates the same behavior:
    - IllegalArgumentException during add() triggers overflow
    - New hash sets are created to handle the overflow
    - All entries (including those that caused the exception) are stored
    - All entries can be retrieved successfully
    
    * Revert OplogEntryIdSetTest change - restore testEntries to 1000
    
    Reverting the change that reduced testEntries from 1000 to 5.
    The test should use a meaningful number of entries to properly
    validate the overflow behavior.
---
 .github/workflows/codeql.yml                       |  99 +++++
 .github/workflows/gradle.yml                       | 460 +++++++++++++++++++++
 .../internal/WanCopyRegionFunctionServiceTest.java |  13 +-
 3 files changed, 568 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000000..1a68a03c53
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,99 @@
+#
+# 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.
+#
+
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+#
+name: "CodeQL"
+
+on:
+  push:
+    branches: [ support/1.15 ]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [ support/1.15 ]
+  schedule:
+  - cron: '22 22 * * 2'
+
+jobs:
+  analyze:
+    name: Analyze
+    runs-on: ubuntu-latest
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    permissions:
+      actions: read
+      contents: read
+      security-events: write
+
+    strategy:
+      fail-fast: false
+      matrix:
+        language: [ 'go', 'java', 'javascript', 'python' ]
+        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
+        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
+    - name: Setup Java JDK
+      uses: actions/setup-java@v4.7.1
+      with:
+        java-version: 8
+        distribution: temurin
+        cache: gradle
+
+    # Initializes the CodeQL tools for scanning.
+    - name: Initialize CodeQL
+      uses: github/codeql-action/init@v2
+      with:
+        languages: ${{ matrix.language }}
+        # If you wish to specify custom queries, you can do so here or in a config file.
+        # By default, queries listed here will override any specified in a config file.
+        # Prefix the list here with "+" to use these queries and those in the config file.
+
+        # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
+        # queries: security-extended,security-and-quality
+
+
+    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
+    # If this step fails, then you should remove it and run the build manually (see below)
+    - name: Autobuild
+      uses: github/codeql-action/autobuild@v2
+      if: matrix.language != 'java'
+    # â„šī¸ Command-line programs to run using the OS shell.
+    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
+
+    #   If the Autobuild fails above, remove it and uncomment the following three lines.
+    #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
+    # - run: |
+    #   echo "Run, Build Application using script"
+    #   ./location_of_script_within_repo/buildscript.sh
+    - run: ./gradlew dev installDist --no-daemon --no-build-cache
+      if: matrix.language == 'java'
+
+    - name: Perform CodeQL Analysis
+      uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
new file mode 100644
index 0000000000..04d139437d
--- /dev/null
+++ b/.github/workflows/gradle.yml
@@ -0,0 +1,460 @@
+#
+# 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.
+#
+
+name: develop
+
+on:
+  push:
+    branches: [ "support/1.15" ]
+  pull_request:
+    branches: [ "support/1.15" ]
+
+permissions:
+  contents: read
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+    - uses: actions/checkout@v3
+    - name: Set up JDK 8
+      uses: actions/setup-java@v3
+      with:
+        java-version: '8'
+        distribution: 'liberica'
+    - name: Setup Gradle
+      uses: gradle/actions/setup-gradle@v5
+      with:
+        gradle-version: wrapper
+    - name: Run 'build install javadoc spotlessCheck rat checkPom resolveDependencies pmdMain' with Gradle
+      run: ./gradlew --console=plain --no-daemon build install javadoc spotlessCheck rat checkPom resolveDependencies pmdMain -x test
+
+  apiCheck:
+     needs: build
+     strategy:
+       fail-fast: false
+       matrix:
+         os: [ubuntu-latest]
+         distribution: [ 'liberica' ]
+         java: ['8']
+     runs-on: ${{ matrix.os }}
+     env:
+       DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+     steps:
+     - uses: actions/checkout@v3
+     - name: Set up JDK
+       uses: actions/setup-java@v3
+       with:
+         distribution: ${{ matrix.distribution }}
+         java-version: |
+           8
+     - name: Set JAVA_TEST_PATH to 8
+       run: |
+         echo "JAVA_TEST_PATH=${JAVA_HOME_8_X64}" >> $GITHUB_ENV
+       if: matrix.java == '8'
+     - name: Java API Check
+       run: |
+         GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+         JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+         JAVA_BUILD_VERSION=8 # Use jdk 8 for build
+         JAVA_TEST_VERSION=${{ matrix.java }}
+         cp gradlew gradlewStrict
+         sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+         GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+           -PcompileJVM=${JAVA_BUILD_PATH} \
+           -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+           -PtestJVM=${JAVA_TEST_PATH} \
+           -PtestJVMVer=${JAVA_TEST_VERSION} \
+           -PtestJava8Home=${JAVA_HOME_8_X64} \
+           japicmp --console=plain --no-daemon
+
+  unitTest:
+   needs: build
+   strategy:
+     fail-fast: false
+     matrix:
+       os: [ubuntu-latest]
+       distribution: ['liberica']
+       java: ['8']
+   runs-on: ${{ matrix.os }}
+   env:
+     DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+   steps:
+   - uses: actions/checkout@v3
+   - name: Set up JDK 8
+     uses: actions/setup-java@v3
+     with:
+       distribution: ${{ matrix.distribution }}
+       java-version: |
+         8
+   - name: Setup Gradle
+     uses: gradle/actions/setup-gradle@v5
+     with:
+       gradle-version: wrapper
+   - name: Set JAVA_TEST_PATH to 8
+     run: |
+       echo "JAVA_TEST_PATH=${JAVA_HOME_8_X64}" >> $GITHUB_ENV
+     if: matrix.java == '8'
+   - name: Run unit tests
+     run: |
+       GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+       JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+       JAVA_BUILD_VERSION=8 # Use jdk 8 for build
+       JAVA_TEST_VERSION=${{ matrix.java }}
+       cp gradlew gradlewStrict
+       sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+       GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+         --parallel \
+         -PcompileJVM=${JAVA_BUILD_PATH} \
+         -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+         -PtestJVM=${JAVA_TEST_PATH} \
+         -PtestJVMVer=${JAVA_TEST_VERSION} \
+         -PtestJava8Home=${JAVA_HOME_8_X64} \
+         test --console=plain --no-daemon
+   - uses: actions/upload-artifact@v4
+     if: failure()
+     with:
+       name: unit-test-reports-${{ matrix.os }}-${{ matrix.java }}
+       path: build/reports
+       retention-days: 5
+
+  integrationTest:
+     needs: [apiCheck, unitTest]
+     strategy:
+       matrix:
+         os: [ubuntu-latest]
+         distribution: ['liberica']
+         java: ['8']
+     runs-on: ${{ matrix.os }}
+     env:
+       DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+     steps:
+     - uses: actions/checkout@v3
+     - name: Set up JDK 8
+       uses: actions/setup-java@v3
+       with:
+         distribution: ${{ matrix.distribution }}
+         java-version: |
+           8
+     - name: Setup Gradle
+       uses: gradle/actions/setup-gradle@v5
+       with:
+         gradle-version: wrapper
+     - name: Run integration tests
+       run: |
+         GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+         JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+         JAVA_BUILD_VERSION=8
+         JAVA_TEST_VERSION=${{ matrix.java }}
+         cp gradlew gradlewStrict
+         sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+         GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+           --parallel \
+           -PparallelDunit \
+           --max-workers=12 \
+           -PcompileJVM=${JAVA_BUILD_PATH} \
+           -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+           -PtestJVM=${JAVA_TEST_PATH} \
+           -PtestJVMVer=${JAVA_TEST_VERSION} \
+           -PtestJava8Home=${JAVA_HOME_8_X64} \
+           integrationTest --console=plain --no-daemon
+     - uses: actions/upload-artifact@v4
+       if: failure()
+       with:
+         name: integration-test-reports-${{ matrix.os }}-${{ matrix.java }}
+         path: build/reports
+         retention-days: 5
+
+  acceptanceTest:
+    needs: [apiCheck, unitTest]
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        distribution: ['liberica']
+        java: ['8']
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run acceptance tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --no-parallel \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            acceptanceTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: acceptance-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
+
+  wanDistributedTestCore:
+    needs: [apiCheck, unitTest]
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        distribution: ['liberica']
+        java: ['8']
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run wan distributed tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --parallel \
+            -PparallelDunit \
+            --max-workers=6 \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            geode-wan:distributedTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: wan-distributed-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
+
+  cqDistributedTestCore:
+    needs: [apiCheck, unitTest]
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        distribution: ['liberica']
+        java: ['8']
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run cq distributed tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --parallel -PparallelDunit --max-workers=6 \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            geode-cq:distributedTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: cq-distributed-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
+
+  luceneDistributedTestCore:
+    needs: [apiCheck, unitTest]
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        distribution: ['liberica']
+        java: ['8']
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run lucene distributed tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --parallel \
+            -PparallelDunit \
+            --max-workers=6 \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            geode-lucene:distributedTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: lucene-distributed-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
+
+  mgmtDistributedTestCore:
+    needs: [apiCheck, unitTest]
+    strategy:
+      matrix:
+        os: [ubuntu-latest]
+        distribution: ['liberica']
+        java: ['8']
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run gfsh, web-mgmt, web distributed tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --no-parallel \
+            --max-workers=6 \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            geode-gfsh:distributedTest \
+            geode-web:distributedTest \
+            geode-web-management:distributedTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: mgmt-distributed-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
+
+
+  assemblyDistributedTestCore:
+    needs: [ apiCheck, unitTest ]
+    strategy:
+      matrix:
+        os: [ ubuntu-latest ]
+        distribution: [ 'liberica' ]
+        java: [ '8' ]
+    runs-on: ${{ matrix.os }}
+    env:
+      DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
+    steps:
+      - uses: actions/checkout@v3
+      - name: Set up JDK 8
+        uses: actions/setup-java@v3
+        with:
+          distribution: ${{ matrix.distribution }}
+          java-version: ${{ matrix.java }}
+      - name: Setup Gradle
+        uses: gradle/actions/setup-gradle@v5
+        with:
+          gradle-version: wrapper
+      - name: Run assembly, connectors, old-client, extensions distributed tests
+        run: |
+          GRADLE_JVM_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_PATH=${JAVA_HOME_8_X64}
+          JAVA_BUILD_VERSION=8
+          JAVA_TEST_VERSION=8
+          cp gradlew gradlewStrict
+          sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.back gradlewStrict
+          GRADLE_JVM=${GRADLE_JVM_PATH} JAVA_TEST_PATH=${JAVA_TEST_PATH} ./gradlewStrict \
+            --no-parallel \
+            --max-workers=6 \
+            -PcompileJVM=${JAVA_BUILD_PATH} \
+            -PcompileJVMVer=${JAVA_BUILD_VERSION} \
+            -PtestJVM=${JAVA_TEST_PATH} \
+            -PtestJVMVer=${JAVA_TEST_VERSION} \
+            -PtestJava8Home=${JAVA_HOME_8_X64} \
+            geode-assembly:distributedTest \
+            geode-dunit:distributedTest \
+            geode-connectors:distributedTest \
+            geode-old-client:distributedTest \
+            extensions:geode-modules:distributedTest \
+            extensions:geode-modules-tomcat10:distributedTest --console=plain --no-daemon
+      - uses: actions/upload-artifact@v4
+        if: failure()
+        with:
+          name: assembly-distributed-test-reports-${{ matrix.os }}-${{ matrix.java }}
+          path: build/reports
+          retention-days: 5
diff --git a/geode-wan/src/test/java/org/apache/geode/cache/wan/internal/WanCopyRegionFunctionServiceTest.java b/geode-wan/src/test/java/org/apache/geode/cache/wan/internal/WanCopyRegionFunctionServiceTest.java
index 864aa63e7a..03596ba8b0 100644
--- a/geode-wan/src/test/java/org/apache/geode/cache/wan/internal/WanCopyRegionFunctionServiceTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/cache/wan/internal/WanCopyRegionFunctionServiceTest.java
@@ -154,7 +154,7 @@ public class WanCopyRegionFunctionServiceTest {
   }
 
   @Test
-  public void severalExecuteWithDifferentRegionOrSenderAreAllowed() {
+  public void severalExecuteWithDifferentRegionOrSenderAreAllowed() throws InterruptedException {
     int executions = 5;
     CountDownLatch latch = new CountDownLatch(executions);
     for (int i = 0; i < executions; i++) {
@@ -172,11 +172,16 @@ public class WanCopyRegionFunctionServiceTest {
               return null;
             }
           });
+
+      // Wait for this specific execution to be registered before starting the next one
+      // This ensures we don't have a race where multiple tasks try to start simultaneously
+      // and only some get registered before we check the count
+      await().untilAsserted(
+          () -> assertThat(service.getNumberOfCurrentExecutions()).isGreaterThanOrEqualTo(i + 1));
     }
 
-    // Wait for the functions to start execution
-    await().untilAsserted(
-        () -> assertThat(service.getNumberOfCurrentExecutions()).isEqualTo(executions));
+    // Verify all executions are registered
+    assertThat(service.getNumberOfCurrentExecutions()).isEqualTo(executions);
 
     // End executions
     for (int i = 0; i < executions; i++) {