Skip to content

Commit 17e2801

Browse files
authored
chore: unify ci timeouts to 4 tiers (#7460)
Audit all GitHub Actions workflow timeouts against actual run durations and consolidate to 4 consistent tiers: - 10 min: quick utility jobs (labels, lints, deploys, reports) - 30 min: standard CI build/test/lint, docs build - 120 min: heavy compute (benchmarks, packaging, publishing, fuzz-coverage) - 240 min: marathon fuzz runs and corpus minimization Notably, fuzz-coverage was hitting its old 60-min timeout and getting cancelled on most runs — bumping to 120 fixes that. ### Timeout tiers | Tier | Timeout | Purpose | Safety margin | |------|---------|---------|---------------| | ⚡ | **10 min** | Quick utility jobs (labels, lints, deploys, reports) | ~100×+ over typical | | 🔨 | **30 min** | Standard CI build/test/lint, docs, packaging, publishing | ~5× over slowest job in tier | | 🏋️ | **120 min** | Heavy compute (benchmarks, python packaging, fuzz-coverage) | ~2× over slowest job in tier | | 🔬 | **240 min** | Marathon fuzz runs and corpus minimization | Matches libfuzzer/wasmfuzz time configs | ### Per-job breakdown #### ⚡ Tier 1 — 10 min | Workflow | Job | Previous timeout | Max observed duration | |----------|-----|-----------------|----------------------| | `approvals.yml` | `check-approvals` | ❌ none (6h default) | < 1 min | | `bench-dispatch.yml` | `remove-bench-label` | 2 min | < 1 min | | `bench-dispatch.yml` | `remove-sql-label` | 2 min | < 1 min | | `bench.yml` | `commit-metadata` | 10 min | < 1 min | | `ci.yml` | `lint-toml` | 40 min | ~9 sec | | `ci.yml` | `validate-workflow-yaml` | 40 min | ~8 sec | | `ci.yml` | `python-lint` | 40 min | ~39 sec | | `ci.yml` | `cpp-lint` | 10 min | ~8 sec | | `ci.yml` | `ffi-c-test` | 10 min | ~49 sec | | `docs.yml` | `deploy` | 10 min | ~31 sec | | `labels.yml` | `check_changelog_label` | ❌ none | < 1 min | | `package.yml` | `prepare-all` | ❌ none | < 1 min | | `publish-benchmarks-website.yml` | `publish` | ❌ none | < 1 min | | `release-drafter.yml` | `update_release_draft` | ❌ none | < 1 min | | `report-fuzz-crash.yml` | `report` | 10 min | < 1 min | | `reuse.yml` | `reuse-check` | ❌ none | < 1 min | | `stale.yml` | `close-issues` | 10 min | < 1 min | | `typos.yml` | `spelling` | ❌ none | < 1 min | | `web.yml` | `changes` | ❌ none | < 1 min | | `web.yml` | `deploy` | 10 min | < 1 min | #### 🔨 Tier 2 — 30 min | Workflow | Job | Previous timeout | Max observed duration | |----------|-----|-----------------|----------------------| | `ci.yml` | `python-test` | 40 min | ~2 min 10 sec | | `ci.yml` | `python-wheel-build` | 40 min | ~2 min 44 sec | | `ci.yml` | `rust-docs` | 40 min | ~2 min 20 sec | | `ci.yml` | `build-rust` (all matrix entries) | 40 min | ~2 min 18 sec | | `ci.yml` | `check-min-deps` | 40 min | ~1 min 23 sec | | `ci.yml` | `rust-lint` | 40 min | ~2 min 22 sec | | `ci.yml` | `rust-lint-no-default` | 40 min | ~1 min 35 sec | | `ci.yml` | `public-api` | 40 min | ~1 min 17 sec | | `ci.yml` | `rust-coverage` | 40 min | ~4 min 47 sec | | `ci.yml` | `rust-test-sanitizer` | 40 min | ~3 min 19 sec | | `ci.yml` | `rust-ffi-test-sanitizer` | 40 min | ~1 min 16 sec | | `ci.yml` | `cuda-build-lint` | 40 min | ~3 min 9 sec | | `ci.yml` | `cuda-test` | 30 min | ~3 min 32 sec | | `ci.yml` | `cuda-test-sanitizer` | 30 min | ~3 min 14 sec | | `ci.yml` | `cuda-test-cudf` | 30 min | ~2 min | | `ci.yml` | `rust-test-other` (windows/arm64) | 40 min | ~5 min 58 sec | | `ci.yml` | `build-java` | 40 min | ~2 min 24 sec | | `ci.yml` | `bench-codspeed` (all shards) | 40 min | ~2 min 37 sec | | `ci.yml` | `license-check-and-audit-check` | 40 min | ~57 sec | | `ci.yml` | `cxx-test` | 40 min | ~1 min 28 sec | | `ci.yml` | `sqllogic-test` | ❌ none (6h default) | ~1 min 38 sec | | `ci.yml` | `wasm-integration` | 40 min | ~2 min 16 sec | | `ci.yml` | `miri` | 40 min | ~1 min 44 sec | | `ci.yml` | `generated-files` | 40 min | ~45 sec | | `ci.yml` | `check-java-publish-build` | 40 min | ~2 min 47 sec | | `ci.yml` | `rust-publish-dry-run` | 40 min | ~36 sec | | `close-fixed-fuzzer-issues.yml` | `close-fixed` | 60 min | ~2 min | | `compat-gen-upload.yml` | `dry-run` | ❌ none | ~3 min | | `compat-gen-upload.yml` | `upload` | ❌ none | ~1 min 18 sec | | `compat-validation.yml` | `compat-test` | 120 min | ~3 min 20 sec | | `docs.yml` | `build` | 120 min | ~15 min | | `package.yml` | `prepare-java-macos` | ❌ none | ~6 min | | `package.yml` | `prepare-java-linux` | 120 min | ~6 min 22 sec | | `publish.yml` | `publish-rust` | 120 min | ~1 min 37 sec | | `publish.yml` | `publish-python` | 120 min | ~34 sec | | `publish.yml` | `publish-java` | 120 min | ~10 min 12 sec | | `web.yml` | `check` | 30 min | ~3 min | | `web.yml` | `build` | 30 min | ~3 min | #### 🏋️ Tier 3 — 120 min | Workflow | Job | Previous timeout | Max observed duration | |----------|-----|-----------------|----------------------| | `bench-pr.yml` | `bench` | 120 min | ~42 min | | `bench.yml` | `bench` | 120 min | ~42 min | | `claude.yml` | `claude` | ❌ none | variable (AI agent) | | `fuzz-coverage.yml` | `coverage` | 60 min ⚠️ | **~60 min (was hitting timeout!)** | | `fuzzer-fix-automation.yml` | `attempt-fix` | 90 min | ~30 min | | `package.yml` | `prepare-python` | 120 min | ~40 min | | `release-binaries.yml` | `build` | 120 min | ~40 min | | `sql-benchmarks.yml` | `bench` | 120 min | ~60 min (nightly SF=100) | #### 🔬 Tier 4 — 240 min | Workflow | Job | Previous timeout | Max observed duration | |----------|-----|-----------------|----------------------| | `run-fuzzer.yml` | `fuzz` | 230 min | ~50 min (libfuzzer `max_total_time=2700s`) | | `wasm-fuzz.yml` | `wasm-fuzz` | 270 min | up to 3h30m (wasmfuzz `--timeout=3h30m`) | | `minimize_fuzz_corpus_workflow.yml` | `minimize` | ❌ none (6h default) | variable | Also lowered wasmfuzz `--timeout` from `4h` to `3h30m` so the fuzz step itself fits within 240 min with ~30 min headroom for build/setup/teardown. ### Notable fixes - **`fuzz-coverage` was silently broken**: the old 60-min timeout was being hit on 4 out of 5 recent runs (all cancelled at ~61 min). Bumping to 120 min fixes this. - **14 jobs had no timeout at all**, defaulting to the GitHub Actions 6-hour maximum. All now have explicit timeouts. - **`sqllogic-test`** in CI had no timeout — now set to 30 min. Signed-off-by: Alexander Droste <alexander.droste@protonmail.com>
1 parent e8374a4 commit 17e2801

21 files changed

Lines changed: 53 additions & 39 deletions

.github/workflows/approvals.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ on:
77
jobs:
88
check-approvals:
99
runs-on: ubuntu-latest
10+
timeout-minutes: 10
1011
steps:
1112
- name: Check required approvals
1213
uses: actions/github-script@450193c5abd4cdb17ba9f3ffcfe8f635c4bb6c2a

.github/workflows/bench-dispatch.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ permissions:
1818
jobs:
1919
remove-bench-label:
2020
runs-on: ubuntu-latest
21-
timeout-minutes: 2
21+
timeout-minutes: 10
2222
if: github.event.label.name == 'action/benchmark'
2323
steps:
2424
- uses: actions-ecosystem/action-remove-labels@v1
@@ -34,7 +34,7 @@ jobs:
3434

3535
remove-sql-label:
3636
runs-on: ubuntu-latest
37-
timeout-minutes: 2
37+
timeout-minutes: 10
3838
if: github.event.label.name == 'action/benchmark-sql'
3939
steps:
4040
- uses: actions-ecosystem/action-remove-labels@v1

.github/workflows/ci.yml

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ env:
2828
jobs:
2929
lint-toml:
3030
runs-on: ubuntu-latest
31-
timeout-minutes: 40
31+
timeout-minutes: 10
3232
steps:
3333
- uses: actions/checkout@v6
3434
- uses: spiraldb/actions/.github/actions/lint-toml@0.18.5
3535

3636
validate-workflow-yaml:
3737
runs-on: ubuntu-latest
38-
timeout-minutes: 40
38+
timeout-minutes: 10
3939
steps:
4040
- uses: actions/checkout@v6
4141
- name: Validate YAML file
@@ -52,7 +52,7 @@ jobs:
5252
${{ github.repository == 'vortex-data/vortex'
5353
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=python-lint', github.run_id)
5454
|| 'ubuntu-latest' }}
55-
timeout-minutes: 40
55+
timeout-minutes: 10
5656
steps:
5757
- uses: runs-on/action@v2
5858
if: github.repository == 'vortex-data/vortex'
@@ -79,7 +79,7 @@ jobs:
7979
${{ github.repository == 'vortex-data/vortex'
8080
&& format('runs-on={0}/runner=amd64-large/image=ubuntu24-full-x64-pre-v2/tag=python-test', github.run_id)
8181
|| 'ubuntu-latest' }}
82-
timeout-minutes: 40
82+
timeout-minutes: 30
8383
env:
8484
RUST_LOG: "info,maturin=off,uv=debug"
8585
MATURIN_PEP517_ARGS: "--profile ci"
@@ -117,7 +117,7 @@ jobs:
117117
python-wheel-build:
118118
name: "Python (wheel build)"
119119
runs-on: ubuntu-latest
120-
timeout-minutes: 40
120+
timeout-minutes: 30
121121
steps:
122122
- uses: actions/checkout@v6
123123
- name: Rust Dependency Cache
@@ -157,7 +157,7 @@ jobs:
157157

158158
rust-docs:
159159
name: "Rust (docs)"
160-
timeout-minutes: 40
160+
timeout-minutes: 30
161161
runs-on: >-
162162
${{ github.repository == 'vortex-data/vortex'
163163
&& format('runs-on={0}/runner=amd64-small/image=ubuntu24-full-x64-pre-v2/tag=rust-docs', github.run_id)
@@ -177,7 +177,7 @@ jobs:
177177
178178
build-rust:
179179
name: "Rust build (${{matrix.config.name}})"
180-
timeout-minutes: 40
180+
timeout-minutes: 30
181181
runs-on: >-
182182
${{ github.repository == 'vortex-data/vortex'
183183
&& format('runs-on={0}/runner={1}/image=ubuntu24-full-x64-pre-v2/tag={2}', github.run_id, matrix.config.runner, matrix.config.name)
@@ -225,7 +225,7 @@ jobs:
225225
226226
check-min-deps:
227227
name: "Check build with minimal dependencies"
228-
timeout-minutes: 40
228+
timeout-minutes: 30
229229
runs-on: >-
230230
${{ github.repository == 'vortex-data/vortex'
231231
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=rust-min-deps', github.run_id)
@@ -241,7 +241,7 @@ jobs:
241241

242242
rust-lint:
243243
name: "Rust (lint)"
244-
timeout-minutes: 40
244+
timeout-minutes: 30
245245
runs-on: >-
246246
${{ github.repository == 'vortex-data/vortex'
247247
&& format('runs-on={0}/runner=amd64-large/image=ubuntu24-full-x64-pre-v2/tag=rust-lint', github.run_id)
@@ -282,7 +282,7 @@ jobs:
282282
283283
rust-lint-no-default:
284284
name: "Rust (lint, no default)"
285-
timeout-minutes: 40
285+
timeout-minutes: 30
286286
runs-on: >-
287287
${{ github.repository == 'vortex-data/vortex'
288288
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=rust-lint-no-default', github.run_id)
@@ -301,7 +301,7 @@ jobs:
301301
302302
public-api:
303303
name: "Public API lock files"
304-
timeout-minutes: 40
304+
timeout-minutes: 30
305305
runs-on: >-
306306
${{ github.repository == 'vortex-data/vortex'
307307
&& format('runs-on={0}/runner=amd64-xsmall/image=ubuntu24-full-x64-pre-v2/tag=public-api', github.run_id)
@@ -335,7 +335,7 @@ jobs:
335335
336336
rust-coverage:
337337
name: "Rust tests (coverage) (${{ matrix.suite }})"
338-
timeout-minutes: 40
338+
timeout-minutes: 30
339339
permissions:
340340
id-token: write
341341
strategy:
@@ -398,7 +398,7 @@ jobs:
398398
${{ github.repository == 'vortex-data/vortex'
399399
&& format('runs-on={0}/pool=amd64-medium-pre-v2/tag=rust-test-sanitizer', github.run_id)
400400
|| 'ubuntu-latest' }}
401-
timeout-minutes: 40
401+
timeout-minutes: 30
402402
env:
403403
ASAN_OPTIONS: "symbolize=1:check_initialization_order=1:detect_leaks=1:leak_check_at_exit=1"
404404
LSAN_OPTIONS: "report_objects=1"
@@ -459,7 +459,7 @@ jobs:
459459
- sanitizer: tsan
460460
sanitizer_flags: "-Zsanitizer=thread"
461461
name: "Rust/C++ FFI tests (${{ matrix.sanitizer }})"
462-
timeout-minutes: 40
462+
timeout-minutes: 30
463463
env:
464464
ASAN_OPTIONS: "symbolize=1:check_initialization_order=1:detect_leaks=1:leak_check_at_exit=1"
465465
LSAN_OPTIONS: "report_objects=1"
@@ -511,7 +511,7 @@ jobs:
511511
cuda-build-lint:
512512
if: github.repository == 'vortex-data/vortex'
513513
name: "CUDA build & lint"
514-
timeout-minutes: 40
514+
timeout-minutes: 30
515515
runs-on: runs-on=${{ github.run_id }}/runner=gpu/tag=cuda-build
516516
steps:
517517
- uses: runs-on/action@v2
@@ -642,7 +642,7 @@ jobs:
642642
643643
rust-test-other:
644644
name: "Rust tests (${{ matrix.os }})"
645-
timeout-minutes: 40
645+
timeout-minutes: 30
646646
strategy:
647647
fail-fast: false
648648
matrix:
@@ -700,7 +700,7 @@ jobs:
700700
${{ github.repository == 'vortex-data/vortex'
701701
&& format('runs-on={0}/pool=amd64-medium-pre-v2/tag=java', github.run_id)
702702
|| 'ubuntu-latest' }}
703-
timeout-minutes: 40
703+
timeout-minutes: 30
704704
steps:
705705
- uses: runs-on/action@v2
706706
if: github.repository == 'vortex-data/vortex'
@@ -724,7 +724,7 @@ jobs:
724724
- { shard: 7, name: "Encodings 4", packages: "vortex-sparse vortex-zigzag vortex-zstd" }
725725
- { shard: 8, name: "Storage formats", packages: "vortex-flatbuffers vortex-proto vortex-btrblocks" }
726726
name: "Benchmark with Codspeed (Shard #${{ matrix.shard }})"
727-
timeout-minutes: 40
727+
timeout-minutes: 30
728728
runs-on: >-
729729
${{ github.repository == 'vortex-data/vortex'
730730
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=bench-codspeed-{1}', github.run_id, matrix.shard)
@@ -757,7 +757,7 @@ jobs:
757757
license-check-and-audit-check:
758758
name: License Check and Audit Check
759759
runs-on: ubuntu-latest
760-
timeout-minutes: 40
760+
timeout-minutes: 30
761761
strategy:
762762
matrix:
763763
checks:
@@ -773,7 +773,7 @@ jobs:
773773

774774
cxx-test:
775775
name: "C++ build"
776-
timeout-minutes: 40
776+
timeout-minutes: 30
777777
runs-on: >-
778778
${{ github.repository == 'vortex-data/vortex'
779779
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=cxx-build', github.run_id)
@@ -806,6 +806,7 @@ jobs:
806806
${{ github.repository == 'vortex-data/vortex'
807807
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=sql-logic-test', github.run_id)
808808
|| 'ubuntu-latest' }}
809+
timeout-minutes: 30
809810
steps:
810811
- uses: runs-on/action@v2
811812
if: github.repository == 'vortex-data/vortex'
@@ -824,7 +825,7 @@ jobs:
824825
wasm-integration:
825826
name: "WASM integration smoke test"
826827
runs-on: ubuntu-latest
827-
timeout-minutes: 40
828+
timeout-minutes: 30
828829
steps:
829830
- uses: actions/checkout@v6
830831
- uses: ./.github/actions/setup-rust
@@ -847,7 +848,7 @@ jobs:
847848
${{ github.repository == 'vortex-data/vortex'
848849
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=rust-miri', github.run_id)
849850
|| 'ubuntu-latest' }}
850-
timeout-minutes: 40
851+
timeout-minutes: 30
851852
env:
852853
MIRIFLAGS: -Zmiri-strict-provenance -Zmiri-symbolic-alignment-check -Zmiri-disable-isolation -Zmiri-env-forward=RUST_BACKTRACE
853854
RUSTFLAGS: "-A warnings"
@@ -870,7 +871,7 @@ jobs:
870871
${{ github.repository == 'vortex-data/vortex'
871872
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=generated-files', github.run_id)
872873
|| 'ubuntu-latest' }}
873-
timeout-minutes: 40
874+
timeout-minutes: 30
874875
steps:
875876
- uses: runs-on/action@v2
876877
if: github.repository == 'vortex-data/vortex'
@@ -932,7 +933,7 @@ jobs:
932933
runs-on: ${{ matrix.target.runs-on }}
933934
container:
934935
image: "ubuntu:20.04"
935-
timeout-minutes: 40
936+
timeout-minutes: 30
936937
strategy:
937938
fail-fast: false
938939
matrix:
@@ -963,7 +964,7 @@ jobs:
963964

964965
rust-publish-dry-run:
965966
name: "Rust publish dry-run"
966-
timeout-minutes: 40
967+
timeout-minutes: 30
967968
runs-on: >-
968969
${{ github.repository == 'vortex-data/vortex'
969970
&& format('runs-on={0}/runner=amd64-xsmall/image=ubuntu24-full-x64-pre-v2/tag=rust-publish-dry-run', github.run_id)

.github/workflows/claude.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ jobs:
2323
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
2424
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
2525
runs-on: ubuntu-latest
26+
timeout-minutes: 120
2627
permissions:
2728
contents: read
2829
pull-requests: read

.github/workflows/close-fixed-fuzzer-issues.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
${{ github.repository == 'vortex-data/vortex'
3030
&& format('runs-on={0}/runner=arm64-medium/disk=large/tag=fuzzer-cleanup-{1}', github.run_id, matrix.target)
3131
|| 'ubuntu-latest' }}
32-
timeout-minutes: 60
32+
timeout-minutes: 30
3333
steps:
3434
- uses: runs-on/action@v2
3535
if: github.repository == 'vortex-data/vortex'

.github/workflows/compat-gen-upload.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jobs:
2727
${{ github.repository == 'vortex-data/vortex'
2828
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=compat-gen-dry-run', github.run_id)
2929
|| 'ubuntu-latest' }}
30+
timeout-minutes: 30
3031
permissions:
3132
id-token: write
3233
contents: read
@@ -77,6 +78,7 @@ jobs:
7778
${{ github.repository == 'vortex-data/vortex'
7879
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=compat-gen-upload', github.run_id)
7980
|| 'ubuntu-latest' }}
81+
timeout-minutes: 30
8082
environment: compat-upload
8183
permissions:
8284
id-token: write

.github/workflows/compat-validation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
${{ github.repository == 'vortex-data/vortex'
2828
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=compat-validation', github.run_id)
2929
|| 'ubuntu-latest' }}
30-
timeout-minutes: 120
30+
timeout-minutes: 30
3131
steps:
3232
- uses: runs-on/action@v2
3333
if: github.repository == 'vortex-data/vortex'

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ permissions:
1717
jobs:
1818
build:
1919
runs-on: ubuntu-latest
20-
timeout-minutes: 120
20+
timeout-minutes: 30
2121
steps:
2222
- uses: actions/checkout@v6
2323
- uses: ./.github/actions/setup-rust

.github/workflows/fuzz-coverage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
fail-fast: false
2121
matrix:
2222
fuzz_target: [array_ops, file_io, compress_roundtrip]
23-
timeout-minutes: 60
23+
timeout-minutes: 120
2424
runs-on: >-
2525
${{ github.repository == 'vortex-data/vortex'
2626
&& format('runs-on={0}/runner=arm64-medium/disk=large', github.run_id)

.github/workflows/fuzzer-fix-automation.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
github.event_name == 'workflow_dispatch'
3333
3434
runs-on: ubuntu-latest
35-
timeout-minutes: 90
35+
timeout-minutes: 120
3636

3737
permissions:
3838
contents: write

0 commit comments

Comments
 (0)