Skip to content

Commit de598ad

Browse files
committed
Merge remote-tracking branch 'origin/develop' into claude/admiring-lichterman
2 parents f1c0716 + fa6931a commit de598ad

263 files changed

Lines changed: 17797 additions & 3521 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/scripts/fuzz_report/cli.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,9 @@ def cmd_report(args: argparse.Namespace) -> int:
363363
print(f"Commented on #{existing_issue}", file=sys.stderr)
364364
_write_github_output("issue_number", str(existing_issue))
365365
else:
366-
fuzz_target = variables.get("FUZZ_TARGET", "unknown")
367-
title = f"Fuzzing Crash: {crash_info.error_variant} in {fuzz_target}"
366+
# Use FUZZ_NAME for the title (descriptive name), fall back to FUZZ_TARGET
367+
fuzz_name = variables.get("FUZZ_NAME") or variables.get("FUZZ_TARGET", "unknown")
368+
title = f"Fuzzing Crash: {crash_info.error_variant} in {fuzz_name}"
368369

369370
body = render_template(str(TEMPLATES_DIR / "new_issue.md"), variables, use_env=False)
370371
body_file = Path("issue_body.md")

.github/workflows/ci.yml

Lines changed: 108 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -379,51 +379,132 @@ jobs:
379379
flags: ${{ matrix.suite }}
380380
use_oidc: true
381381

382-
rust-test:
383-
name: "Rust tests (sanitizer)"
384-
timeout-minutes: 40
382+
rust-test-sanitizer:
383+
strategy:
384+
fail-fast: false
385+
matrix:
386+
include:
387+
- sanitizer: asan
388+
sanitizer_flags: "-Zsanitizer=address -Zsanitize=leak"
389+
- sanitizer: msan
390+
sanitizer_flags: "-Zsanitizer=memory"
391+
- sanitizer: tsan
392+
sanitizer_flags: "-Zsanitizer=thread"
393+
name: "Rust tests (${{ matrix.sanitizer }})"
385394
runs-on: >-
386395
${{ github.repository == 'vortex-data/vortex'
387396
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=rust-test-sanitizer', github.run_id)
388397
|| 'ubuntu-latest' }}
398+
timeout-minutes: 40
389399
env:
390-
# Add debug symbols and enable ASAN/LSAN with better output
391-
ASAN_OPTIONS: "symbolize=1:print_stats=1:check_initialization_order=1:detect_leaks=1:halt_on_error=0:verbosity=1:leak_check_at_exit=1"
392-
LSAN_OPTIONS: "verbosity=1:report_objects=1"
400+
ASAN_OPTIONS: "symbolize=1:check_initialization_order=1:detect_leaks=1:leak_check_at_exit=1"
401+
LSAN_OPTIONS: "report_objects=1"
393402
ASAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
394-
# Link against DuckDB debug build
395-
VX_DUCKDB_DEBUG: "1"
396-
# Keep frame pointers for better stack traces
397-
CARGO_PROFILE_DEV_DEBUG: "true"
398-
CARGO_PROFILE_TEST_DEBUG: "true"
399-
# Skip slow tests that are too expensive under sanitizer
403+
MSAN_OPTIONS: "symbolize=1"
404+
MSAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
405+
TSAN_OPTIONS: "symbolize=1"
406+
TSAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
400407
VORTEX_SKIP_SLOW_TESTS: "1"
408+
# -Cunsafe-allow-abi-mismatch=sanitizer: libraries like compiler_builtins
409+
# unset -Zsanitizer flag and we should allow that.
410+
RUSTFLAGS: "-A warnings -Cunsafe-allow-abi-mismatch=sanitizer --cfg disable_loom --cfg vortex_nightly -C debuginfo=2 -C opt-level=0 -C strip=none"
401411
steps:
402412
- uses: runs-on/action@v2
403413
if: github.repository == 'vortex-data/vortex'
404414
with:
405415
sccache: s3
406416
- uses: actions/checkout@v6
407417
- uses: ./.github/actions/setup-prebuild
408-
- name: Install nightly for sanitizer
418+
- name: Install Rust nightly toolchain
409419
run: |
410420
rustup toolchain install $NIGHTLY_TOOLCHAIN
411421
rustup component add --toolchain $NIGHTLY_TOOLCHAIN rust-src rustfmt clippy llvm-tools-preview
412-
- name: Rust Tests
413-
env:
414-
RUSTFLAGS: "-A warnings -Zsanitizer=address -Zsanitizer=leak --cfg disable_loom --cfg vortex_nightly -C debuginfo=2 -C opt-level=0 -C strip=none"
422+
export RUSTFLAGS="${RUSTFLAGS} ${{ matrix.sanitizer_flags }}"
423+
- name: Build tests with sanitizer
415424
run: |
416-
# Build with full debug info first (helps with caching)
417-
cargo +$NIGHTLY_TOOLCHAIN build --locked --all-features \
418-
--target x86_64-unknown-linux-gnu \
419-
-p vortex-buffer -p vortex-ffi -p vortex-fastlanes -p vortex-fsst -p vortex-alp -p vortex-array
420-
# Run tests with sanitizers and debug output
421-
cargo +$NIGHTLY_TOOLCHAIN nextest run \
422-
--locked \
423-
--all-features \
424-
--no-fail-fast \
425-
--target x86_64-unknown-linux-gnu \
426-
-p vortex-buffer -p vortex-ffi -p vortex-fastlanes -p vortex-fsst -p vortex-alp -p vortex-array
425+
cargo +$NIGHTLY_TOOLCHAIN build --locked --all-features \
426+
--target x86_64-unknown-linux-gnu -Zbuild-std \
427+
-p vortex-buffer -p vortex-fastlanes -p vortex-fsst -p vortex-alp -p vortex-array
428+
429+
- name: Run tests with sanitizer
430+
run: |
431+
cargo +$NIGHTLY_TOOLCHAIN nextest run --locked --all-features \
432+
--target x86_64-unknown-linux-gnu --no-fail-fast -Zbuild-std \
433+
-p vortex-buffer -p vortex-fastlanes -p vortex-fsst -p vortex-alp -p vortex-array
434+
435+
# vortex-ffi requires --no-default-features as otherwise we pull in
436+
# Mimalloc which interferes with sanitizers
437+
# cargo nextest reports less sanitizer issues than cargo test
438+
# TODO(myrrc): remove --no-default-features once we make Mimalloc opt-in
439+
- name: Run vortex-ffi tests with sanitizer
440+
run: |
441+
cargo +$NIGHTLY_TOOLCHAIN test --locked --no-default-features \
442+
--target x86_64-unknown-linux-gnu --no-fail-fast -Zbuild-std \
443+
-p vortex-ffi -- --no-capture
444+
445+
rust-ffi-test-sanitizer:
446+
strategy:
447+
fail-fast: false
448+
matrix:
449+
include:
450+
# We don't run memory sanitizer as it's clang-only and provides many
451+
# false positives for Catch2
452+
- sanitizer: asan
453+
sanitizer_flags: "-Zsanitizer=address -Zsanitize=leak"
454+
- sanitizer: tsan
455+
sanitizer_flags: "-Zsanitizer=thread"
456+
name: "Rust/C++ FFI tests (${{ matrix.sanitizer }})"
457+
timeout-minutes: 40
458+
env:
459+
ASAN_OPTIONS: "symbolize=1:check_initialization_order=1:detect_leaks=1:leak_check_at_exit=1"
460+
LSAN_OPTIONS: "report_objects=1"
461+
ASAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
462+
MSAN_OPTIONS: "symbolize=1"
463+
MSAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
464+
TSAN_OPTIONS: "symbolize=1"
465+
TSAN_SYMBOLIZER_PATH: "/usr/bin/llvm-symbolizer"
466+
VORTEX_SKIP_SLOW_TESTS: "1"
467+
# -Cunsafe-allow-abi-mismatch=sanitizer: libraries like compiler_builtins
468+
# unset -Zsanitizer flag and we should allow that.
469+
runs-on: >-
470+
${{ github.repository == 'vortex-data/vortex'
471+
&& format('runs-on={0}/runner=amd64-medium/image=ubuntu24-full-x64-pre-v2/tag=rust-ffi-test-sanitizer', github.run_id)
472+
|| 'ubuntu-latest' }}
473+
steps:
474+
- uses: runs-on/action@v2
475+
if: github.repository == 'vortex-data/vortex'
476+
with:
477+
sccache: s3
478+
- uses: actions/checkout@v6
479+
- uses: ./.github/actions/setup-prebuild
480+
- name: Install rustfilt
481+
run: |
482+
cargo install rustfilt
483+
- name: Install Rust nightly toolchain
484+
run: |
485+
rustup toolchain install $NIGHTLY_TOOLCHAIN
486+
rustup component add --toolchain $NIGHTLY_TOOLCHAIN rust-src rustfmt clippy llvm-tools-preview
487+
488+
# Export flags here so that rustfilt won't be built with sanitizers
489+
export RUSTFLAGS="-A warnings -Cunsafe-allow-abi-mismatch=sanitizer \
490+
--cfg disable_loom --cfg vortex_nightly -C debuginfo=2 \
491+
-C opt-level=0 -C strip=none -Zexternal-clangrt \
492+
${{ matrix.sanitizer_flags }}"
493+
- name: Build FFI library
494+
run: |
495+
# TODO(myrrc): remove --no-default-features
496+
cargo +$NIGHTLY_TOOLCHAIN build --locked --no-default-features \
497+
--target x86_64-unknown-linux-gnu -Zbuild-std \
498+
-p vortex-ffi
499+
- name: Build FFI library tests
500+
run: |
501+
cd vortex-ffi
502+
cmake -Bbuild -DBUILD_TESTS=1 -DSANITIZER=${{ matrix.sanitizer }} -DTARGET_TRIPLE="x86_64-unknown-linux-gnu"
503+
cmake --build build -j
504+
- name: Run tests
505+
run: |
506+
set -o pipefail
507+
./vortex-ffi/build/test/vortex_ffi_test 2>&1 | rustfilt -i-
427508
428509
cuda-build-lint:
429510
if: github.repository == 'vortex-data/vortex'

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949
mkdir -p docs/_static/vortex-jni
5050
mkdir -p docs/_static/vortex-spark
5151
cp -r java/vortex-jni/build/docs/javadoc/* docs/_static/vortex-jni/
52-
cp -r java/vortex-spark/build/docs/javadoc/* docs/_static/vortex-spark/
52+
cp -r java/vortex-spark/build/vortex-spark_2.13/docs/javadoc/* docs/_static/vortex-spark/
5353
- name: build Python and Rust docs
5454
run: |
5555
uv run --all-packages make -C docs html

.github/workflows/fuzz.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ jobs:
106106
name: "Array Operations Fuzz (unstable)"
107107
uses: ./.github/workflows/run-fuzzer.yml
108108
with:
109-
fuzz_target: array_ops_unstable_encodings
109+
fuzz_target: array_ops
110+
fuzz_name: array_ops_unstable_encodings
110111
extra_features: "vortex/unstable_encodings"
111112
jobs: 16
112113
secrets:
@@ -124,7 +125,8 @@ jobs:
124125
pull-requests: read
125126
uses: ./.github/workflows/report-fuzz-crash.yml
126127
with:
127-
fuzz_target: array_ops_unstable_encodings
128+
fuzz_target: array_ops
129+
fuzz_name: array_ops_unstable_encodings
128130
crash_file: ${{ needs.ops_fuzz_unstable.outputs.first_crash_name }}
129131
artifact_url: ${{ needs.ops_fuzz_unstable.outputs.artifact_url }}
130132
artifact_name: array_ops_unstable_encodings-crash-artifacts

.github/workflows/report-fuzz-crash.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
fuzz_target:
77
required: true
88
type: string
9+
fuzz_name:
10+
required: false
11+
type: string
912
crash_file:
1013
required: true
1114
type: string
@@ -148,6 +151,7 @@ jobs:
148151
--dedup-result dedup_result.json \
149152
--claude-analysis claude_analysis.txt \
150153
-v "FUZZ_TARGET=${{ inputs.fuzz_target }}" \
154+
-v "FUZZ_NAME=${{ inputs.fuzz_name || inputs.fuzz_target }}" \
151155
-v "CRASH_FILE=${{ inputs.crash_file }}" \
152156
-v "BRANCH=${{ inputs.branch }}" \
153157
-v "COMMIT=${{ inputs.commit }}" \

.github/workflows/run-fuzzer.yml

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ on:
44
workflow_call:
55
inputs:
66
fuzz_target:
7-
description: "The cargo fuzz target name (e.g., file_io, array_ops, compress_roundtrip)"
7+
description: "The cargo fuzz binary target name (e.g., file_io, array_ops)"
88
required: true
99
type: string
10+
fuzz_name:
11+
description: "Display/storage name for this fuzz run. Defaults to fuzz_target if not set."
12+
required: false
13+
type: string
14+
default: ""
1015
max_time:
1116
description: "Maximum fuzzing time in seconds"
1217
required: false
@@ -48,11 +53,13 @@ env:
4853

4954
jobs:
5055
fuzz:
51-
name: "Run ${{ inputs.fuzz_target }}"
56+
name: "Run ${{ inputs.fuzz_name || inputs.fuzz_target }}"
57+
env:
58+
FUZZ_NAME: ${{ inputs.fuzz_name || inputs.fuzz_target }}
5259
timeout-minutes: 230 # almost 4 hours
5360
runs-on: >-
5461
${{ github.repository == 'vortex-data/vortex'
55-
&& format('runs-on={0}/runner={1}/disk=large/tag={2}-fuzz', github.run_id, inputs.runner, inputs.fuzz_target)
62+
&& format('runs-on={0}/runner={1}/disk=large/tag={2}-fuzz', github.run_id, inputs.runner, inputs.fuzz_name || inputs.fuzz_target)
5663
|| 'ubuntu-latest' }}
5764
outputs:
5865
crashes_found: ${{ steps.check.outputs.crashes_found }}
@@ -89,8 +96,8 @@ jobs:
8996
AWS_REGION: "us-east-1"
9097
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
9198
run: |
92-
CORPUS_KEY="${{ inputs.fuzz_target }}_corpus.tar.zst"
93-
CORPUS_DIR="fuzz/corpus/${{ inputs.fuzz_target }}"
99+
CORPUS_KEY="${FUZZ_NAME}_corpus.tar.zst"
100+
CORPUS_DIR="fuzz/corpus/${FUZZ_NAME}-${{ inputs.extra_features }}"
94101
95102
# Try to download corpus
96103
if python3 scripts/s3-download.py "s3://vortex-fuzz-corpus/$CORPUS_KEY" "$CORPUS_KEY"; then
@@ -163,15 +170,15 @@ jobs:
163170
if: steps.check.outputs.crashes_found == 'true'
164171
uses: actions/upload-artifact@v7
165172
with:
166-
name: ${{ inputs.fuzz_target }}-crash-artifacts
173+
name: ${{ env.FUZZ_NAME }}-crash-artifacts
167174
path: fuzz/artifacts
168175
retention-days: 180
169176

170177
- name: Archive fuzzer output log
171178
if: steps.check.outputs.crashes_found == 'true'
172179
uses: actions/upload-artifact@v7
173180
with:
174-
name: ${{ inputs.fuzz_target }}-logs
181+
name: ${{ env.FUZZ_NAME }}-logs
175182
path: fuzz_output.log
176183
retention-days: 90
177184

@@ -183,8 +190,8 @@ jobs:
183190
AWS_REGION: "us-east-1"
184191
AWS_ENDPOINT_URL: "https://01e9655179bbec953276890b183039bc.r2.cloudflarestorage.com"
185192
run: |
186-
CORPUS_KEY="${{ inputs.fuzz_target }}_corpus.tar.zst"
187-
CORPUS_DIR="fuzz/corpus/${{ inputs.fuzz_target }}"
193+
CORPUS_KEY="${FUZZ_NAME}_corpus.tar.zst"
194+
CORPUS_DIR="fuzz/corpus/${FUZZ_NAME}"
188195
189196
tar -acf "$CORPUS_KEY" "$CORPUS_DIR"
190197

.github/workflows/web.yml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
---
2+
3+
name: Vortex Web
4+
5+
concurrency:
6+
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
7+
cancel-in-progress: true
8+
9+
on:
10+
pull_request:
11+
push:
12+
branches: [develop]
13+
14+
permissions:
15+
contents: read
16+
17+
defaults:
18+
run:
19+
working-directory: vortex-web
20+
21+
jobs:
22+
changes:
23+
name: Detect Changes
24+
runs-on: ubuntu-latest
25+
permissions:
26+
pull-requests: read
27+
outputs:
28+
web: ${{ steps.filter.outputs.web }}
29+
steps:
30+
- uses: actions/checkout@v6
31+
- uses: dorny/paths-filter@v3
32+
id: filter
33+
with:
34+
filters: |
35+
web:
36+
- "vortex-web/**"
37+
- ".github/workflows/web.yml"
38+
39+
build:
40+
name: Build & Check
41+
needs: [changes]
42+
if: needs.changes.outputs.web == 'true'
43+
runs-on: ubuntu-latest
44+
timeout-minutes: 30
45+
steps:
46+
- uses: actions/checkout@v6
47+
- uses: ./.github/actions/setup-rust
48+
with:
49+
repo-token: ${{ secrets.GITHUB_TOKEN }}
50+
enable-sccache: "false"
51+
- name: Install wasm-pack
52+
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
53+
working-directory: .
54+
- uses: actions/setup-node@v4
55+
with:
56+
node-version: "22"
57+
cache: "npm"
58+
cache-dependency-path: vortex-web/package-lock.json
59+
- run: npm ci
60+
- run: npm run wasm
61+
- run: npm run lint
62+
- run: npm run typecheck
63+
- run: npm run build-storybook

.idea/copyright/profiles_settings.xml

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/scopes/web_files.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)