From f4810f0d836aa26f4723f5af7d5ce40b69d823a4 Mon Sep 17 00:00:00 2001 From: Erik Bogado Date: Mon, 21 Sep 2026 21:35:25 -0300 Subject: [PATCH] ci: drop non-existent suites from the Linux and macOS test matrices dev/ci/check-suites.py only checked one direction: every suite in the source tree must appear in a workflow. It never checked the reverse, so six suite names that no longer exist stayed in the linux-test and macOS matrices. ParquetReadV2Suite was removed in #3671, and none of the six has a class, trait or object declaration in any sourceset. CI stays green only because the suites are passed as -DwildcardSuites, which silently ignores unmatched names; an explicit -Dsuites list fails with ClassNotFoundException. Add the forward check and remove the six dead lines. ParquetReadV1Suite and CometStringDecodeSuite are kept: the former is declared in ParquetReadSuite.scala and the latter in the spark-3.x sourceset used by the 3.4/3.5 profiles. --- .github/workflows/pr_build_linux.yml | 6 ----- .github/workflows/pr_build_macos.yml | 6 ----- dev/ci/check-suites.py | 35 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.github/workflows/pr_build_linux.yml b/.github/workflows/pr_build_linux.yml index a9c184a20b0..666950bf764 100644 --- a/.github/workflows/pr_build_linux.yml +++ b/.github/workflows/pr_build_linux.yml @@ -473,10 +473,7 @@ jobs: org.apache.comet.parquet.CometParquetWriterSuite org.apache.comet.parquet.CometEmptyRelationParquetWriterSuite org.apache.comet.parquet.ParquetReadV1Suite - org.apache.comet.parquet.ParquetReadV2Suite org.apache.comet.parquet.ParquetTimestampLtzAsNtzSuite - org.apache.spark.sql.comet.ParquetDatetimeRebaseV1Suite - org.apache.spark.sql.comet.ParquetDatetimeRebaseV2Suite org.apache.spark.sql.comet.ParquetEncryptionITCase org.apache.comet.exec.CometNativeReaderSuite org.apache.comet.CometIcebergNativeSuite @@ -510,9 +507,7 @@ jobs: org.apache.spark.sql.comet.execution.shuffle.CometDiskBlockWriterSuite org.apache.comet.exec.CometShuffleEncryptionSuite org.apache.comet.exec.CometShuffleManagerSuite - org.apache.comet.exec.CometAsyncShuffleSuite org.apache.comet.exec.DisableAQECometShuffleSuite - org.apache.comet.exec.DisableAQECometAsyncShuffleSuite org.apache.spark.shuffle.comet.CometBoundedShuffleMemoryAllocatorSuite org.apache.spark.shuffle.sort.SpillSorterSuite - name: "exec" @@ -579,7 +574,6 @@ jobs: org.apache.comet.GenerateDocsSuite org.apache.comet.CometSqlFileTestSuite org.apache.comet.SqlFileTestParserSuite - org.apache.comet.CometExpressionCoverageSuite org.apache.comet.CometVariantTypeSuite org.apache.comet.CometHashExpressionSuite org.apache.comet.CometTemporalExpressionSuite diff --git a/.github/workflows/pr_build_macos.yml b/.github/workflows/pr_build_macos.yml index b47ed5a46f6..a6a10346b9d 100644 --- a/.github/workflows/pr_build_macos.yml +++ b/.github/workflows/pr_build_macos.yml @@ -121,10 +121,7 @@ jobs: org.apache.comet.parquet.CometParquetWriterSuite org.apache.comet.parquet.CometEmptyRelationParquetWriterSuite org.apache.comet.parquet.ParquetReadV1Suite - org.apache.comet.parquet.ParquetReadV2Suite org.apache.comet.parquet.ParquetTimestampLtzAsNtzSuite - org.apache.spark.sql.comet.ParquetDatetimeRebaseV1Suite - org.apache.spark.sql.comet.ParquetDatetimeRebaseV2Suite org.apache.spark.sql.comet.ParquetEncryptionITCase org.apache.comet.exec.CometNativeReaderSuite org.apache.comet.CometIcebergNativeSuite @@ -158,9 +155,7 @@ jobs: org.apache.spark.sql.comet.execution.shuffle.CometDiskBlockWriterSuite org.apache.comet.exec.CometShuffleEncryptionSuite org.apache.comet.exec.CometShuffleManagerSuite - org.apache.comet.exec.CometAsyncShuffleSuite org.apache.comet.exec.DisableAQECometShuffleSuite - org.apache.comet.exec.DisableAQECometAsyncShuffleSuite org.apache.spark.shuffle.comet.CometBoundedShuffleMemoryAllocatorSuite org.apache.spark.shuffle.sort.SpillSorterSuite - name: "exec" @@ -227,7 +222,6 @@ jobs: org.apache.comet.GenerateDocsSuite org.apache.comet.CometSqlFileTestSuite org.apache.comet.SqlFileTestParserSuite - org.apache.comet.CometExpressionCoverageSuite org.apache.comet.CometVariantTypeSuite org.apache.comet.CometHashExpressionSuite org.apache.comet.CometTemporalExpressionSuite diff --git a/dev/ci/check-suites.py b/dev/ci/check-suites.py index 7dc624c8523..748b961255c 100644 --- a/dev/ci/check-suites.py +++ b/dev/ci/check-suites.py @@ -15,6 +15,7 @@ # specific language governing permissions and limitations # under the License. +import re import sys from pathlib import Path @@ -58,3 +59,37 @@ def file_to_class_name(path: Path) -> str | None: print(f"Suite not found in workflow {workflow_filename}: {class_name}") sys.exit(-1) print(f"Found {class_name} in {workflow_filename}") + + # Forward check: every suite named in a workflow must be declared in a source file. + # Filename-based discovery is not enough here, because several suites are declared + # inside a file named after a different class (e.g. CometShuffleSuite is declared in + # CometColumnarShuffleSuite.scala), and version-specific suites such as + # CometStringDecodeSuite live only in the spark-3.x sourceset. + declared = set() + suite_declaration = re.compile( + r"^\s*(?:(?:final|sealed|abstract|private|case)\s+)*(?:class|trait|object)\s+(\w*Suite)\b" + ) + for path in Path(".").rglob("*.scala"): + if "target" in path.parts: + continue + class_name = file_to_class_name(path) + if class_name: + declared.add(class_name.rsplit(".", 1)[-1]) + for line in path.read_text(encoding="utf-8", errors="ignore").splitlines(): + match = suite_declaration.match(line) + if match: + declared.add(match.group(1)) + + listed_suite = re.compile(r"\borg\.apache\.[A-Za-z0-9_.]*Suite\b") + undeclared = [] + for workflow_filename in [".github/workflows/pr_build_linux.yml", ".github/workflows/pr_build_macos.yml"]: + workflow = open(workflow_filename, encoding="utf-8").read() + for name in sorted(set(listed_suite.findall(workflow))): + if name.rsplit(".", 1)[-1] not in declared: + undeclared.append((workflow_filename, name)) + + if undeclared: + for workflow_filename, name in undeclared: + print(f"Workflow lists an undeclared suite {name} in {workflow_filename}") + sys.exit(-1) + print("All workflow-listed suites are declared")