[lake/hudi] Introduce tag field for tiering splits#3503
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a “tag” concept to tiering splits and exposes it via WriterInitContext#tag() so lake writers can coordinate work across all splits in the same tiering round.
Changes:
- Add
WriterInitContext#tag()(default empty) and pass tiering split tags through Flink tiering writer initialization. - Extend tiering split types/state/serialization to carry an immutable
tagend-to-end. - Generate per-round tags when enumerating splits and add tests for tag serialization/state conversion/assignment.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| fluss-common/src/main/java/org/apache/fluss/lake/writer/WriterInitContext.java | Adds default tag() API for lake writer initialization. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/TieringWriterInitContext.java | Implements WriterInitContext#tag() and stores tag in init context. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/TieringSplitReader.java | Passes split tag into TieringWriterInitContext when creating lake writers. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/state/TieringSplitState.java | Preserves tag when converting split state back to source split. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/split/TieringSplit.java | Introduces tag field and tag-aware copy API on base split. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/split/TieringSnapshotSplit.java | Adds tag-aware constructors/copy/toString for snapshot splits. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/split/TieringLogSplit.java | Adds tag-aware constructors/copy/toString for log splits. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/split/TieringSplitSerializer.java | Bumps serializer version and includes tag in split (de)serialization. |
| fluss-flink/fluss-flink-common/src/main/java/org/apache/fluss/flink/tiering/source/enumerator/TieringSourceEnumerator.java | Assigns per-round tags to generated splits. |
| fluss-flink/fluss-flink-common/src/test/java/org/apache/fluss/flink/tiering/source/state/TieringSplitStateTest.java | Verifies tag is preserved through split state conversion. |
| fluss-flink/fluss-flink-common/src/test/java/org/apache/fluss/flink/tiering/source/split/TieringSplitSerializerTest.java | Adds tag serialization/deserialization test coverage. |
| fluss-flink/fluss-flink-common/src/test/java/org/apache/fluss/flink/tiering/source/enumerator/TieringSourceEnumeratorTest.java | Asserts tiering-round tag assignment behavior in enumerator tests. |
| fluss-test-coverage/src/test/java/org/apache/fluss/lake/writer/WriterInitContextCoverageTest.java | Coverage test to ensure default WriterInitContext#tag() is empty. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@fhan688 Thanks for the PR! I spent quite a while trying to understand the purpose of the The current I'm not very familiar with Hudi, so please correct me if I'm wrong. But based on FIP-24, my understanding of what we actually need is:
If that's the case, instead of encoding this into a string This avoids the string parsing / hard-coding, makes the split immutable (no |
Thanks for the detailed suggestion. I agree that overloading I double-checked the Hudi tiering writer side. Besides identifying the writer that creates the global Hudi instant, the writer also needs a round-level timestamp to avoid consuming a stale pending instant from I’ll update the design to make these two meanings explicit instead of encoding them into a free-form string:
This should keep the first-split property structural while preserving the timestamp requirement needed by the Hudi writer. |
Thanks for digging into the Hudi writer side — that makes sense |
Purpose
Linked issue: #3279
This PR introduces split tags for the tiering source so lake writers can coordinate all splits that belong to the same tiering round. Each generated tiering round has one first-split tag and a shared round tag for the remaining splits.
Brief change log
WriterInitContext#tag()as a default method.TieringSplit,TieringLogSplit, andTieringSnapshotSplit.TieringSplitReadertoTieringWriterInitContext.Tests
git diff --checkmvn -pl fluss-flink/fluss-flink-common -am -DskipITs -Dcheckstyle.skip=true -DfailIfNoTests=false -Dtest=TieringSplitSerializerTest,TieringSplitStateTest testAPI and Format
WriterInitContext#tag().TieringSplitSerializerversion to include split tags.Documentation
No user-facing documentation changes.