Repository navigation
Conversation
This was referenced Sep 10, 2026
gyang94
force-pushed
the
codex/kafka-ddl-table-mapping
branch
from
September 17, 2026 03:40
6b9626d to
4361fa1
Compare
gyang94
force-pushed
the
codex/kafka-ddl-table-mapping
branch
from
October 10, 2026 13:19
4361fa1 to
c508de6
Compare
gyang94
marked this pull request as ready for review
October 12, 2026 01:39
gyang94
force-pushed
the
codex/kafka-ddl-table-mapping
branch
3 times, most recently
from
October 14, 2026 06:11
d661491 to
e7673be
Compare
Extract topic identity and the raw/string table mapping contract before Metadata. Validate table kinds, field projections and metadata columns independently of request handling and record decoding. Validation: Java 11, mvn -o -pl fluss-kafka clean verify (47 unit tests and 2 integration tests); Checkstyle, Spotless and RAT passed. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 769/769 AI-Contributed/UT: 480/480
Resolve database.table topic names directly to Fluss table paths and return qualified names for metadata. Validate name boundaries and cover same-named tables in different databases through native metadata round trips. Read projected field names directly from DataField to avoid rebuilding the complete field-name list for every projected column. Validated on Java 11: 67 Kafka unit tests and 2 integration tests passed, along with Checkstyle, Spotless, RAT, and git diff --check. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 52/52 AI-Contributed/UT: 167/167
Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 16/16 AI-Contributed/UT: 33/33
Wait for the newly created log table to become ready before acquiring or releasing snapshot leases. This prevents the coordinator's asynchronous table-ID registration from masking the expected NonPrimaryKeyTableException. Validated on Java 11 with the same-worktree reactor: FlussAdminITCase#testKvSnapshotLeaseForLogTable passed, along with Checkstyle, Spotless, RAT, and git diff --check. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 0/0 AI-Contributed/UT: 1/1
Register table.kafka options and validate the declared fixed-column mapping through a shared schema contract. Support binary, string and flat/nested JSON values with optional key, headers and rescue columns. Validate CREATE and ALTER before persistence, and fence schema publication with the table version and coordinator epoch so concurrent schema and property changes cannot bypass the contract. Resolve bare topic aliases through kafka.default.database and stop automatically creating that database. Keep real offset persistence deferred and reject Kafka enablement for tables that declare offset metadata until that capability is available. Validation: 146 targeted tests passed on Java 11; Checkstyle, Spotless, RAT and git diff checks passed. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 1131/1131 AI-Contributed/UT: 1451/1451
Default bare topic names to the native fluss database while preserving explicit database overrides, canonical names and no automatic Kafka database creation. Validate JSON business types recursively before CREATE, ALTER and enablement. Reject non-STRING map keys at every nesting level and schemas deeper than the supported limit. Expose the validation entry point and depth constant for subsequent decoders. Count business fields equally in flat and nested layouts, without charging a level for the physical _kafka_value ROW container. Keep disabled tables outside Kafka validation and preserve user schemas and explicit properties. Cover complex scalar/container types, depth boundaries, failed DDL state preservation and successful enablement with real RPC tests. Validation: Java 11 clean reactor verify passed 161 targeted cases, including snapshot lease and concurrent ALTER regressions. Checkstyle, Spotless, RAT and git diff checks passed. The five prior PR03 commits were rebased onto PR02 97d20b1 and checked with range-diff. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 92/92 AI-Contributed/UT: 292/292
Allow optional _kafka_metadata with timestamp, timestamp_type and partition, without a physical offset field. Cover optional fixed-column combinations, metadata validation and CREATE/ALTER behavior. Ignore unchanged table registrations when schema ALTER advances the ZK version. Preserve atomic concurrency fencing and notifications for real property and bucket changes, with deterministic regression coverage. Validation: Java 11 reactor verify passed 111 targeted test cases; Checkstyle, Spotless and git diff --check passed. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 57/57 AI-Contributed/UT: 265/265
Create the configured Kafka default database when missing and preserve existing metadata. Fence schema and property ALTER with schema-parent version checks without rewriting table registrations, restoring the original table watcher. Remove redundant configuration, Flink conversion and mapping test coverage while retaining DDL validation, optional system columns and concurrent ALTER checks. Validation: targeted clean verify passed 173 tests with Checkstyle and Spotless. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 120/120 AI-Contributed/UT: 683/683
Reuse native initialization for the fluss database and create a custom Kafka default database only when it is missing. Remove PR03-only schema version and Coordinator epoch checks, preserving PR02 metadata writes and existing protections. Drop the corresponding concurrency tests while retaining Kafka DDL mapping validation. Validation: 121 focused tests passed; Maven verify checks passed. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 132/132 AI-Contributed/UT: 224/224
gyang94
force-pushed
the
codex/kafka-ddl-table-mapping
branch
from
October 17, 2026 03:16
7bcda8b to
7badab0
Compare
State that Kafka access requires an existing Fluss table and summarize qualified topic mapping and the default database fallback. Validation: git diff --check. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 13/13 AI-Contributed/UT: 0/0
Describe topic mapping before the requirement to create its Fluss table. Validation: git diff --check. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 2/2 AI-Contributed/UT: 0/0
wuchong
reviewed
Oct 17, 2026
Comment on lines
+160
to
+161
| || new TableConfig(Configuration.fromMap(table.getProperties())).getLogFormat() | ||
| != LogFormat.ARROW) { |
Member
There was a problem hiding this comment.
Why do we have this limitation?
wuchong
reviewed
Oct 17, 2026
wuchong
reviewed
Oct 17, 2026
Use typed conversion options with read-time defaults and keep all four system columns optional. Validate nullable fields recursively while preserving Fluss's non-null MAP key requirement and allow nested business fields to use system names. Ensure the configured Kafka default database exists, consolidate table validation entry points, and document the mapping contract in a dedicated Kafka compatibility guide with regression coverage. Validation: 102 targeted tests passed; after the enum rename, 52 related tests and the affected Maven reactor verification passed. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 648/648 AI-Contributed/UT: 492/492
Use Kafka-prefixed value conversion enums and keep path-aware table descriptor validation under its established method name. Simplify the user guide and show topic-to-table examples in a compact mapping table. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 315/315 AI-Contributed/UT: 22/22
Reorder the conversion enum imports and wrap the long test builder call to match the repository's Spotless format. Co-Authored-By: Codex <noreply@openai.com> AI-Model: gpt-6 AI-Contributed/Feature: 2/2 AI-Contributed/UT: 4/4
Co-Authored-By: Codex <noreply@openai.com> AI-Contributed/Feature: 48/48 AI-Contributed/UT: 0/0
Member
|
I removed some AI slop. Please review AI-generated code carefully yourself before submitting it. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
Closes #4275. Part of #4185.
Define the shared DDL table mapping contract used by Metadata and Produce. A Kafka topic named
database.tableresolves directly to that Fluss table, so tables with the same name in different databases remain distinct. The physical schema andkafka.*custom properties define how record fields map to table columns.This is PR03 in the foundation sequence, based on PR02 (#4260, commit
5742b36627fe156a8cf499f0aa7b4b8c4163e9a7); Metadata follows as PR04 (#4261).Brief change log
curator-testversion in test scope for the cluster fixture.Relative to PR02: 10 files, +1374 / -0 lines (791 production/build and 583 test lines). The change keeps the mapping contract and its validation together. Record decoding, Arrow encoding, Metadata handlers, Produce, JSON, and authentication follow in later PRs.
Tests
Validated on Java 11 with the source tree committed as
4361fa11b227f6d5573757b21499f692a289cc12:KafkaRequestITCaseandKafkaTableMappingITCasepassed: 2 integration tests, including cross-database mapping and native metadata readback.git diff --checkpassed.The full repository test suite and a Flink SQL runtime were not run. The later delivery stage will cover the full DDL → Metadata → Kafka producer → Fluss readback workflow.
API and Format
Uses the existing table schema and custom-property storage.
kafka.value.formatis required; key mapping is optional. Each mapped raw or string component requires exactly one BYTES or STRING column respectively. Configured key fields requirekafka.value.fields-include=EXCEPT_KEY; timestamp and headers use explicitly named physical columns and are excluded from the value projection. Column names are user-defined.Topic names must use
database.table; bare table names do not fall back to a configured database. Reverse mapping returns the same fully qualified name.No Kafka API is newly advertised by this PR. Table creation continues through existing Fluss DDL/Admin or the Flink catalog; the resolver validates the stored mapping when called by subsequent API layers. Kafka CreateTopics/DeleteTopics and automatic creation are out of scope.
Documentation
The contract is described in this PR, source Javadoc, and executable tests. User-facing delivery examples follow with the later Produce capability.
Stack and review
This PR remains a draft while its prerequisites are unmerged. It targets Apache
main, so the Files changed view includes the foundation prerequisites. Review DDL mapping alone using the incremental comparison against PR02.Generative AI disclosure: Codex assisted with implementation, testing, and commit organization. Human review is required before merge.