Skip to content

[flink][spark] Wire sort compact to produce COMPACT commits - #9790

Open
hbgstc123 wants to merge 24 commits into
apache:masterfrom
hbgstc123:fix_sort_compact_append_engines
Open

[flink][spark] Wire sort compact to produce COMPACT commits#9790
hbgstc123 wants to merge 24 commits into
apache:masterfrom
hbgstc123:fix_sort_compact_append_engines

Conversation

@hbgstc123

Copy link
Copy Markdown

Purpose

Stacked follow-up to #8631. Please review this PR after (or together with) the core rewriter.

Until #8631 merges, GitHub's Files changed view includes the core commits. Engine-only diff:
hbgstc123/paimon@fix_sort_compact_append_only...fix_sort_compact_append_engines

This PR wires Flink and Spark sort compact for append tables to the core rewriter:

  1. Write sorted output in write-only mode.
  2. Rewrite the written append commit messages into CompactIncrement messages.
  3. Commit them through the normal compact commit path.

Additional engine hardening:

  • Flink SortCompactCommitter merge/rewrite/abort and commit recovery.
  • Align Flink commit failure abort with Spark: abort newly written files when commit fails and the COMPACT snapshot is not yet visible.
  • Remove SortCompactActionForDynamicBucketITCase because sort compact is append-table only.

No new overwritePartition(baseSnapshotId) APIs or special overwrite conflict logic are introduced.

Tests

Flink

  • SortCompactCommitterTest
    • merge partial committables before rewrite
    • delete-only compact when all input rows are filtered out
    • commit recovery does not delete planned input or create DV index files
    • commit failure aborts written messages only when COMPACT snapshot is not yet visible
  • SortCompactActionForAppendTableITCase
    • latest snapshot kind is COMPACT
    • concurrent append between read and commit does not lose data
  • CommitterOperatorTest
  • CompactProcedureITCase updated to expect COMPACT

Spark

  • SortCompactSparkCommitTest
    • commit failure aborts written messages only when COMPACT snapshot is not yet visible
  • CompactProcedureTestBase updated to expect COMPACT

hbg and others added 24 commits July 16, 2026 09:58
Merge latest-snapshot deletion-vector metadata at rewrite time so concurrent DV writes are cleaned up, while keeping captured plan metadata for expired snapshots. Align Flink commit failure behavior with Spark by aborting write output when the COMPACT snapshot is not yet visible.

Co-authored-by: Cursor <cursoragent@cursor.com>
…sed by subclasses

Commit 0f5aecf changed commitUser, state, and write from protected to
private, but GlobalFullCompactionSinkWrite and LookupSinkWrite still access
them directly. This causes JDK 8 compilation failures. Restore protected
visibility to fix the build.

Co-authored-by: Cursor <cursoragent@cursor.com>
…pact restricts to append tables

SortCompactAction now explicitly rejects primary-key tables and only
supports bucket-unaware append tables. The dynamic-bucket test case
exercises unsupported behavior and fails on Flink 2.x CI, so remove it.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sort compact now commits as COMPACT instead of OVERWRITE. Concurrent
merge and sort compact on V2 delta row-level DV append tables can leave
duplicate visible rows, so skip that combination and keep coverage on
the V1 write path.

Co-authored-by: Cursor <cursoragent@cursor.com>
Resolve conflicts in FlinkSink and FlinkSinkBuilder by keeping both
sort-compact writeProviderOverride/createAppendTableSink hooks and
master's BLOB descriptor reader factory wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
Drop validateSortCompactInput and the warn/max input file options per review feedback.

Co-authored-by: Cursor <cursoragent@cursor.com>
…ct_append_only

Resolve conflict in BaseAppendDeleteFileMaintainer by keeping upstream javadoc.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
After making DataFileMeta#assignFileSource abstract, BinaryDataFileMeta
from master must provide the method explicitly.
… compact

Matching success by removed input files can skip abort after a failed
delete-only commit when another compact already deleted the same inputs,
leaking the DV index files produced by rewrite.
# Conflicts:
#	paimon-core/src/main/java/org/apache/paimon/io/DataFileMeta.java
#	paimon-core/src/main/java/org/apache/paimon/io/ProjectedDataFileMeta.java
#	paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/action/SortCompactAction.java
#	paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/sink/FlinkSink.java
#	paimon-flink/paimon-flink-common/src/test/java/org/apache/paimon/flink/source/TestChangelogDataReadWrite.java
#	paimon-spark/paimon-spark-common/src/main/java/org/apache/paimon/spark/procedure/CompactProcedure.java
#	paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/PaimonSparkWriter.scala
Move Flink/Spark wiring to a follow-up PR so the COMPACT-commit protocol can be reviewed independently.
Use the core rewriter from the stacked core PR so Flink and Spark sort compact produce COMPACT snapshots instead of OVERWRITE.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant