From 7cc95b68809aee3a224f403543d3dd87fe567511 Mon Sep 17 00:00:00 2001 From: Joe Isaacs Date: Tue, 16 Jun 2026 10:42:22 +0100 Subject: [PATCH 1/3] ci: gate cuda san on cuda changes Signed-off-by: Joe Isaacs --- .github/workflows/cuda.yaml | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cuda.yaml b/.github/workflows/cuda.yaml index 37ec5545686..41add10cffa 100644 --- a/.github/workflows/cuda.yaml +++ b/.github/workflows/cuda.yaml @@ -12,6 +12,14 @@ on: branches: [develop] pull_request: { } workflow_dispatch: { } + schedule: + # Nightly full run at 04:00 UTC. Regular CUDA build/test/cudf jobs run on + # every PR; the compute-sanitizer matrix is path-filtered to the CUDA + # crates for speed. This nightly run (and push-to-develop) restores + # sanitizer coverage for changes in dependency crates (vortex-array, + # vortex-buffer, encodings, ...) that can affect GPU kernels without + # touching vortex-cuda/ itself. + - cron: "0 4 * * *" permissions: contents: read @@ -21,6 +29,29 @@ env: RUST_BACKTRACE: 1 jobs: + changes: + name: "Detect CUDA changes" + # Only meaningful on PRs; gates the sanitizer matrix only. Other events + # (schedule/push/dispatch) run the sanitizers unconditionally via the + # always() guard on cuda-test-sanitizer below. + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + pull-requests: read + outputs: + cuda: ${{ steps.filter.outputs.cuda }} + steps: + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 + - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4 + id: filter + with: + filters: | + cuda: + - "vortex-cuda/**" + - "vortex-test/**" + - ".github/workflows/**" + cuda-build-lint: if: github.repository == 'vortex-data/vortex' name: "CUDA build & lint" @@ -92,7 +123,10 @@ jobs: --verbose cuda-test-sanitizer: - if: github.repository == 'vortex-data/vortex' + needs: [changes] + if: >- + always() && github.repository == 'vortex-data/vortex' && + (github.event_name != 'pull_request' || needs.changes.outputs.cuda == 'true') name: "CUDA tests (${{ matrix.sanitizer }})" timeout-minutes: 30 runs-on: runs-on=${{ github.run_id }}/runner=gpu/tag=cuda-test-sanitizer From 6973a714589225315405316d5b26b63aa5b0ac35 Mon Sep 17 00:00:00 2001 From: Joe Isaacs Date: Tue, 16 Jun 2026 11:18:32 +0100 Subject: [PATCH 2/3] u Signed-off-by: Joe Isaacs --- .github/workflows/cuda.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/cuda.yaml b/.github/workflows/cuda.yaml index 41add10cffa..0e727b83af7 100644 --- a/.github/workflows/cuda.yaml +++ b/.github/workflows/cuda.yaml @@ -12,14 +12,6 @@ on: branches: [develop] pull_request: { } workflow_dispatch: { } - schedule: - # Nightly full run at 04:00 UTC. Regular CUDA build/test/cudf jobs run on - # every PR; the compute-sanitizer matrix is path-filtered to the CUDA - # crates for speed. This nightly run (and push-to-develop) restores - # sanitizer coverage for changes in dependency crates (vortex-array, - # vortex-buffer, encodings, ...) that can affect GPU kernels without - # touching vortex-cuda/ itself. - - cron: "0 4 * * *" permissions: contents: read @@ -31,26 +23,34 @@ env: jobs: changes: name: "Detect CUDA changes" - # Only meaningful on PRs; gates the sanitizer matrix only. Other events - # (schedule/push/dispatch) run the sanitizers unconditionally via the - # always() guard on cuda-test-sanitizer below. - if: github.event_name == 'pull_request' runs-on: ubuntu-latest timeout-minutes: 10 permissions: pull-requests: read outputs: - cuda: ${{ steps.filter.outputs.cuda }} + run-cuda-san: ${{ steps.decide.outputs.run-cuda-san }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4 id: filter + if: github.event_name == 'pull_request' with: filters: | cuda: - "vortex-cuda/**" - "vortex-test/**" - ".github/workflows/**" + - name: Decide whether to run CUDA sanitizer + id: decide + env: + EVENT_NAME: ${{ github.event_name }} + CUDA_CHANGED: ${{ steps.filter.outputs.cuda }} + run: | + if [ "$EVENT_NAME" != "pull_request" ] || [ "$CUDA_CHANGED" == "true" ]; then + echo "run-cuda-san=true" >> "$GITHUB_OUTPUT" + else + echo "run-cuda-san=false" >> "$GITHUB_OUTPUT" + fi cuda-build-lint: if: github.repository == 'vortex-data/vortex' @@ -126,7 +126,7 @@ jobs: needs: [changes] if: >- always() && github.repository == 'vortex-data/vortex' && - (github.event_name != 'pull_request' || needs.changes.outputs.cuda == 'true') + needs.changes.outputs.run-cuda-san == 'true' name: "CUDA tests (${{ matrix.sanitizer }})" timeout-minutes: 30 runs-on: runs-on=${{ github.run_id }}/runner=gpu/tag=cuda-test-sanitizer From 2f6672429c73217233561122dc4ae9c1465be279 Mon Sep 17 00:00:00 2001 From: Joe Isaacs Date: Tue, 16 Jun 2026 11:21:14 +0100 Subject: [PATCH 3/3] u Signed-off-by: Joe Isaacs --- .github/workflows/cuda.yaml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/cuda.yaml b/.github/workflows/cuda.yaml index 0e727b83af7..6fc19e9c7b1 100644 --- a/.github/workflows/cuda.yaml +++ b/.github/workflows/cuda.yaml @@ -28,7 +28,7 @@ jobs: permissions: pull-requests: read outputs: - run-cuda-san: ${{ steps.decide.outputs.run-cuda-san }} + run-cuda-san: ${{ github.event_name != 'pull_request' || steps.filter.outputs.cuda == 'true' }} steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4 @@ -40,17 +40,6 @@ jobs: - "vortex-cuda/**" - "vortex-test/**" - ".github/workflows/**" - - name: Decide whether to run CUDA sanitizer - id: decide - env: - EVENT_NAME: ${{ github.event_name }} - CUDA_CHANGED: ${{ steps.filter.outputs.cuda }} - run: | - if [ "$EVENT_NAME" != "pull_request" ] || [ "$CUDA_CHANGED" == "true" ]; then - echo "run-cuda-san=true" >> "$GITHUB_OUTPUT" - else - echo "run-cuda-san=false" >> "$GITHUB_OUTPUT" - fi cuda-build-lint: if: github.repository == 'vortex-data/vortex'