| # 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. |
| |
| # Manual workflow that exercises Spark's Parquet WRITER test suites with |
| # Comet's experimental native Parquet writer enabled (ENABLE_COMET_WRITE=true, |
| # spark.comet.parquet.write.enabled). Self-contained — does not call |
| # spark_sql_test_reusable.yml — so it can run on feature branches without |
| # touching the standard CI matrix. |
| # |
| # Trigger: workflow_dispatch only. Pick a Spark minor version from the |
| # selector and click "Run workflow". |
| # |
| # Suite list focuses on writer-side coverage: Parquet IO, committer, |
| # encoding, compression codec, V1/V2 file format, V1/V2 query, V1/V2 |
| # partition discovery, field IDs, schema; plus the generic writer |
| # infrastructure (FileFormatWriterSuite, PartitionedWriteSuite). Reader-only |
| # Parquet suites (ParquetV{1,2}FilterSuite, *SchemaPruningSuite, etc.) are |
| # intentionally excluded — they're already covered by the sql_core-* lanes. |
| |
| name: Spark SQL Writer Tests (manual) |
| |
| on: |
| workflow_dispatch: |
| inputs: |
| spark-version: |
| description: 'Spark minor version to test against' |
| type: choice |
| required: true |
| default: '3.5' |
| options: |
| - '3.5' |
| - '4.1' |
| |
| env: |
| RUST_VERSION: stable |
| RUST_BACKTRACE: 1 |
| # Force GNU ld on Linux: recent Rust stable defaults to rust-lld on |
| # x86_64-unknown-linux-gnu, and rust-lld cannot resolve -ljvm against the |
| # Zulu JDK layout installed by setup-java. Keep bfd for all cargo invocations. |
| RUSTFLAGS: "-Clink-arg=-fuse-ld=bfd" |
| |
| jobs: |
| writer-test: |
| name: spark-sql-writer/spark-${{ inputs.spark-version }} |
| runs-on: ubuntu-24.04 |
| container: |
| image: amd64/rust |
| steps: |
| - uses: actions/checkout@v7 |
| |
| - name: Resolve Spark full version and JDK |
| id: resolve |
| shell: bash |
| run: | |
| # Map each supported Spark minor version to its full version + JDK. |
| # Mirrors ci.yml's per-version reusable invocations (default-on PR |
| # versions only; 3.4 and 4.0 are label-gated and not offered here). |
| case "${{ inputs.spark-version }}" in |
| 3.5) spark_full=3.5.9; java=17 ;; |
| 4.1) spark_full=4.1.3; java=17 ;; |
| *) echo "Unsupported spark-version: ${{ inputs.spark-version }}" >&2; exit 1 ;; |
| esac |
| echo "spark-full=$spark_full" >> "$GITHUB_OUTPUT" |
| echo "java=$java" >> "$GITHUB_OUTPUT" |
| |
| - name: Setup Rust & Java toolchain |
| uses: ./.github/actions/setup-builder |
| with: |
| rust-version: ${{ env.RUST_VERSION }} |
| jdk-version: ${{ steps.resolve.outputs.java }} |
| |
| - name: Restore Cargo cache |
| uses: actions/cache/restore@v6 |
| with: |
| path: | |
| ~/.cargo/registry |
| ~/.cargo/git |
| native/target |
| key: ${{ runner.os }}-cargo-ci-${{ hashFiles('native/**/Cargo.lock', 'native/**/Cargo.toml') }}-${{ hashFiles('native/**/*.rs') }} |
| restore-keys: | |
| ${{ runner.os }}-cargo-ci-${{ hashFiles('native/**/Cargo.lock', 'native/**/Cargo.toml') }}- |
| |
| - name: Build native library (CI profile) |
| run: | |
| cd native |
| cargo build --profile ci |
| env: |
| RUSTFLAGS: "-Ctarget-cpu=x86-64-v3 -Clink-arg=-fuse-ld=bfd" |
| |
| - name: Stage native library at release path |
| run: | |
| # setup-spark-builder's `mvnw install -DskipTests` (skip-native-build |
| # path) bundles native/target/release/libcomet.so into the Comet JAR. |
| # We built with --profile ci to avoid LTO, so the file lives at |
| # native/target/ci/. Copy it to where the Maven build expects it. |
| mkdir -p native/target/release |
| cp native/target/ci/libcomet.so native/target/release/libcomet.so |
| |
| - name: Setup Spark |
| uses: ./.github/actions/setup-spark-builder |
| with: |
| spark-version: ${{ steps.resolve.outputs.spark-full }} |
| spark-short-version: ${{ inputs.spark-version }} |
| skip-native-build: true |
| |
| - name: Run Parquet writer tests |
| run: | |
| cd apache-spark |
| rm -rf /root/.m2/repository/org/apache/parquet # somehow parquet cache requires cleanups |
| # SERIAL_SBT_TESTS gates SparkParallelTestGrouping in |
| # project/SparkBuild.scala. We always set it to reduce peak memory |
| # on standard 7 GB runners (3.5 and 4.1 are unaffected by the |
| # 4.0+JDK 21 file-stream-leak case the reusable workflow handles). |
| export SERIAL_SBT_TESTS=1 |
| # Same forked-test-JVM caps as sql_core-* in spark_sql_test_reusable.yml. |
| export HEAP_SIZE=3g |
| export METASPACE_SIZE=1g |
| NOLINT_ON_COMPILE=true ENABLE_COMET=true ENABLE_COMET_ONHEAP=true ENABLE_COMET_WRITE=true \ |
| build/sbt -Dsbt.log.noformat=true -mem $SBT_MEM \ |
| 'set Global / concurrentRestrictions := Seq(Tags.limit(Tags.ForkedTestGroup, 1))' \ |
| "sql/testOnly org.apache.spark.sql.execution.datasources.parquet.ParquetIOSuite org.apache.spark.sql.execution.datasources.parquet.ParquetCommitterSuite org.apache.spark.sql.execution.datasources.parquet.ParquetEncodingSuite org.apache.spark.sql.execution.datasources.parquet.ParquetCompressionCodecPrecedenceSuite org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormatV1Suite org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormatV2Suite org.apache.spark.sql.execution.datasources.parquet.ParquetV1QuerySuite org.apache.spark.sql.execution.datasources.parquet.ParquetV2QuerySuite org.apache.spark.sql.execution.datasources.parquet.ParquetV1PartitionDiscoverySuite org.apache.spark.sql.execution.datasources.parquet.ParquetV2PartitionDiscoverySuite org.apache.spark.sql.execution.datasources.parquet.ParquetFieldIdIOSuite org.apache.spark.sql.execution.datasources.parquet.ParquetSchemaSuite org.apache.spark.sql.execution.datasources.FileFormatWriterSuite org.apache.spark.sql.sources.PartitionedWriteSuite" |
| env: |
| LC_ALL: "C.UTF-8" |
| # Cap SBT orchestrator heap so the freed RAM goes to the forked test |
| # JVM and OS/container overhead, fixing cgroup-OOM SIGKILLs under |
| # 7 GB runners. |
| SBT_MEM: "1024" |
| # G1GC + tuning for the SBT orchestrator JVM. -Xss4m replaces the |
| # launcher's -Xss64m default (no compile here, deep recursion not |
| # needed). UseStringDeduplication and MaxMetaspaceSize cap real and |
| # ceiling footprint. ExitOnOutOfMemoryError fails fast. |
| SBT_OPTS: >- |
| -Xss4m |
| -XX:+UseG1GC |
| -XX:+UseStringDeduplication |
| -XX:MaxMetaspaceSize=384m |
| -XX:G1HeapRegionSize=2m |
| -XX:InitiatingHeapOccupancyPercent=35 |
| -XX:+ParallelRefProcEnabled |
| -XX:+ExitOnOutOfMemoryError |