Skip to content

[kafka] Separate value decoding and preserve record metadata - #4675

Closed
gyang94 wants to merge 48 commits into
apache:mainfrom
gyang94:codex/kafka-format-decoders-pr09
Closed

gyang94 wants to merge 48 commits into
apache:mainfrom
gyang94:codex/kafka-format-decoders-pr09

Conversation

@gyang94

@gyang94 gyang94 commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Closes #4674. Part of #4185.

PR09, based on PR08 (#4299) at 6da9e21b637255620e8d4c94c3f5d466439b90bc. Separate Kafka value decoding from Arrow transcoding with binary and strict UTF-8 decoders, while preserving the shared table contract and complete record metadata during row assembly.

Review this stage in the incremental comparison.

Validation

Java 11, 325 tests passed across fluss-common, fluss-server, and fluss-kafka; no failures, errors, or skips:

mvn -o -pl fluss-kafka -am clean verify -Dtest='*Kafka*,ApiVersionsHandlerTest' -Dsurefire.failIfNoSpecifiedTests=false

Draft until PR08 is merged. Apache main is the PR target.

gyang94 and others added 30 commits October 14, 2026 13:45
Route requests through the dispatcher and advertise only implemented APIs.
Return version-aware errors for unsupported APIs and invalid requests.

Validated with mvn -o -pl fluss-kafka verify (23 unit tests and 1 IT).

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 313/313
AI-Contributed/UT: 137/137
Exercise future-version decoding, v0 error serialization, correlation IDs,
unknown tagged fields, buffer release, and renegotiation on one connection.
Verify registry-defined ranges, hidden APIs, ordering, and invalid client
software fields across the supported ApiVersions schemas.

Validated with Java 11 reactor clean verify: 37 unit tests and 2 integration
tests passed, with Checkstyle, Spotless, RAT, and git diff checks.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 238/238
Construct the registry once with all handlers and defer ApiVersions registry
access until request handling. Advertised capabilities and dispatch continue
to share the same immutable registry without a separate capability list.
Update coverage to verify lazy access and handler identity across versions.

Validated with Java 11 reactor clean verify: 44 unit and 2 integration cases
passed in both Maven test executions, including inherited error-mapping and
idle regressions. Kafka main and test sources also compile with --release 8.
Spotless, Checkstyle, RAT, and diff checks passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 28/28
AI-Contributed/UT: 33/33
Use the dispatcher-backed handler constructor in the fallback test added by
PR01. Preserve its unsupported-version, listener, response, and buffer checks.

Validated with Java 11 reactor clean verify: 39 unit and 2 integration cases
passed in both Maven test executions. Kafka main and test sources compile
with --release 8; Spotless, Checkstyle, RAT, and diff checks passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 3/3
Check the deferred registry before reading advertised capabilities so an
initialization-order failure reports an explicit diagnostic message.

Validated with Java 11 reactor tests: 16 ApiVersions and request-handler
cases passed, along with Spotless, Checkstyle, RAT, and diff checks.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 4/4
AI-Contributed/UT: 0/0
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
Integrate the DDL mapping prerequisite and use its resolver for Metadata discovery. Omit unsupported tables from all-topic queries and return per-topic mapping errors for named queries. Preserve metadata for compatible tables in mixed requests.

Validation: Java 11, mvn -o -pl fluss-kafka clean verify (62 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: 742/742
AI-Contributed/UT: 571/571
Route Metadata queries through the database.table mapping from PR03 and
enumerate compatible topics across databases. Preserve brokers and valid
topics when a requested database is absent or disappears during discovery;
propagate other gateway failures.

Cover qualified names, same-named tables across databases, synchronous and
asynchronous lookup failures, and Metadata v0-v11 over a real listener.

Validated on Java 11: 90 unit tests and 4 integration tests passed, along
with Checkstyle, Spotless, RAT, and git diff --check. Five additional
interleaved asynchronous review probes passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 129/129
AI-Contributed/UT: 514/514
Keep the ApiVersions wire fallback assertion limited to its retry range,
while successful negotiation verifies both registered API ranges.

Cover Metadata v0-v11 handling of native gateway visibility filtering in
named queries, all-topic discovery, and missing-database retries. Verify
Metadata v12 is rejected before invoking the gateway.

Retain the existing qualified-topic discovery contract on prerequisite
c508de6. New Core-dependent aliases and
persisted table enablement remain deferred.

Validation: Java 11 reactor verify passed 105 unit tests and 5 integration
tests, with Spotless, Checkstyle, RAT, and git diff --check.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 71/71
Wait for all server gateways to advertise the restarted coordinator before
acquire, release and drop lease checks. Assert that the client still holds
its cached address so each operation exercises metadata refresh and retry.

Rebased PR04 onto PR03 at 86d2735.
Validation: restart case passed in the full Admin suite and focused rerun;
Kafka 110 tests, RPC retry 6 tests, Spotless and Checkstyle passed. The full
Admin suite passed 46/47; the unchanged rolling-upgrade health test first
observed RED instead of GREEN and passed the subsequent focused rerun.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 11/11
Use the actual server default database and the PR03 shared mapper/schema
contract. Resolve aliases by TablePath, preserve requested names, and retain
valid aliases when a missing database triggers metadata discovery retry.

Expose only tables with persisted table.kafka.enabled. Return unknown-topic
for disabled or missing tables and invalid-topic for damaged enabled
contracts in named and all-topic requests. Discovery emits canonical names
without duplicate aliases and retains native authorization and routing.

Verify configuration injection, no fallback lookup or database creation,
enablement/reset changes, invalid historical contracts and v0-v11 behavior
through real Kafka listeners. Preserve the coordinator snapshot lease fix.

Validation: Java 11 clean reactor verify passed 160 distinct cases: 118 Kafka
(including 6 Metadata integration cases), 31 shared schema, 3 atomic DDL,
6 RPC retry and 2 snapshot lease cases. Spotless, Checkstyle and RAT passed.
The four existing PR04 commits were rebased unchanged onto PR03
4a9aa6b and checked with range-diff.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 155/155
AI-Contributed/UT: 571/571
Keep canonical topic IDs unchanged and encode alias wire IDs in a separate
namespace using the same Fluss table ID. Kafka clients can then cache both
names and detect table recreation even when the new leader epoch is lower.

Cover Kafka Metadata v10/v11 full and partial updates, recreation from epoch
5 to 0 without a missing-topic response, and native Metadata responses.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 31/31
AI-Contributed/UT: 135/135
Adapt the decoder regression to the configured request handler. Cover
optional three-field metadata columns and legacy offset rejection across
Metadata v0-v11, including native DDL and both real TabletServer listeners.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 109/109
Pass one RPC service through the request handler and validate its
TabletServerGateway capability inside the Metadata backend.

Consolidate overlapping Metadata tests while retaining protocol-version,
alias identity, client cache, authorization and discovery regressions.
Align the custom default database test with PR03 startup creation and
verify that Metadata does not recreate a deleted default database.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 35/35
AI-Contributed/UT: 546/546
Validate non-idempotent Produce v3-v11 and isolate invalid partitions before invoking a protocol-independent backend. Preserve partition order, acknowledgements and owned record data. Leave production registration to the append integration PR.

Validation: Java 11, mvn -o -pl fluss-kafka spotless:apply clean verify; 69 unit tests and 2 integration tests passed, including Checkstyle, Spotless and RAT.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 621/621
AI-Contributed/UT: 366/366
Read compressed records through a closeable streaming iterator to avoid
preallocating a record list from the declared batch count. Reject incoming
Kafka batches whose offset range disagrees with their record count before
copying records or invoking the backend. Keep Fluss-assigned offsets independent
of this input validation and preserve partition error isolation.

Cover all five codecs, owned record copies, malformed counts and offset ranges,
and backend-assigned offsets. Java 11 validation passed: 117 unit tests and
4 integration tests, plus Checkstyle, Spotless, RAT, and git diff --check.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 42/42
AI-Contributed/UT: 168/168
Carry timestamp provenance through a protocol-independent enum on each copied
record. Read the type from its batch for compressed and uncompressed records;
keep timestamp presence separate. Retain the existing constructor with an
explicit UNKNOWN type instead of guessing provenance from the numeric value.

Cover mixed batch types across partitions, absent timestamps, owned data and
legacy constructors. Keep partition validation and acks=0 behavior, and check
that ApiVersions advertises the registered Produce range. Metadata row storage
and production append registration remain outside this protocol-only change.

Validated with Java 11 and this worktree's clean reactor: 152 unit tests and
5 integration tests passed, including ApiVersions and Metadata regressions.
Spotless, Checkstyle, RAT and git diff --check passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 64/64
AI-Contributed/UT: 326/326
Document that the protocol backend receives original topic names and returns
results keyed by those names, leaving database resolution to the adapter.
Cover bare and qualified names together across Produce v3-v11, reordered
backend results, local validation failures, backend errors and invalid acks.
Keep null and empty record values distinct in the owned protocol command.

Validated on Java 11 with this worktree's clean reactor: 162 Kafka unit tests,
23 integration tests, and 34 Common/Server schema and DDL tests passed.
Spotless, Checkstyle, RAT and git diff --check passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 11/11
AI-Contributed/UT: 150/150
Reuse the DDL contract to assemble key, value, timestamp and ordered headers into physical rows. Decode strings with strict UTF-8 validation and preserve nullable values. Return owned heap log bytes and recycle Arrow writers on success and failure.

Validation: Java 11, mvn -o -pl fluss-kafka spotless:apply clean verify; 75 unit tests and 2 integration tests passed, including Checkstyle, Spotless and RAT.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 314/314
AI-Contributed/UT: 326/326
Decode and append one record at a time instead of retaining an entire row
list. Borrow command-owned key, value and header bytes during synchronous
conversion while preserving defensive-copy accessors.

Cover row and payload reuse, batches beyond initial Arrow capacity, and
resource cleanup after partial conversion failures.

Validation on Java 11: reactor clean verify passed with 130 unit tests and
4 integration tests, plus Checkstyle, Spotless, RAT and git diff --check.
An additional 25 boundary scenarios passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 101/101
AI-Contributed/UT: 224/224
Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 13/13
AI-Contributed/UT: 75/75
Use the shared KafkaTableSchema contract for the fixed value column, raw
optional keys, and last-value-wins header maps. Validate final map and key
nullability, keep optional rescue values null, and remove prototype field
projections and timestamp-column mapping. Reject metadata until native
per-row offsets are available; JSON decoding remains a later stage.

Preserve synchronous streaming, borrowed payloads, owned Arrow output and
failure-path cleanup. Cover all optional system-column combinations, raw
bytes, strict UTF-8, header deduplication, multi-page output and partial
conversion failures without changing null-value filtering.

Validation: Java 11 current-worktree clean reactor, 277 unit tests and 27
integration tests passed, including cumulative Kafka, shared schema, DDL
and Arrow coverage. The final 23 transcoder cases passed again after
strengthening the multi-page test. Spotless, Checkstyle, RAT and diff checks
passed. All SNAPSHOT test dependencies came from this worktree.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 95/95
AI-Contributed/UT: 741/741
gyang94 and others added 18 commits October 15, 2026 16:20
The shared schema now accepts three-field Kafka metadata without offsets.
Reject it explicitly during row assembler construction so binary/string
conversion cannot silently emit null metadata. Keep the existing streaming
and borrowed-payload paths unchanged.

Cover nullable and non-null metadata in both formats, and update the legacy
offset-field regression to the current schema validation message.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 5/5
AI-Contributed/UT: 41/41
Populate TIMESTAMP_LTZ(3), Kafka batch timestamp type and the requested
partition before Arrow encoding. Preserve timestamp provenance independently
of timestamp presence, and enforce nested timestamp NOT NULL constraints.

Keep synchronous streaming and borrowed key/value/header payloads. Cover all
16 optional-column combinations, timestamp boundaries, partition isolation,
Arrow vector growth and failure atomicity for binary and string values.

Validation: Java 11 offline clean verify; 348 tests passed (317 unit and
31 integration), with Spotless, Checkstyle and RAT checks passing.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 74/74
AI-Contributed/UT: 233/233
Register Produce v3-v11 and adapt the local TabletServer gateway using
the shared qualified-topic DDL contract and raw/string transcoder.
Preserve the resolved TablePath across metadata lookup and conversion,
isolate table/partition failures, and map invalid topic names correctly.
Drain deferred actions immediately after the synchronous append invocation
so acks=all does not wait for its own delayed replica fetches.

Base on PR06 04a9093 and independent core PR apache#3412 at 969f985.

Validation: Java 11 reactor verify; 139 Kafka unit tests, 7 Kafka integration
tests, and 10 targeted RPC/server tests passed. Three-replica tests cover
raw/string, gzip, acks=0/1/all, offsets, timestamp/headers, native readback,
and independent writes to same-named tables in different databases.
Checkstyle, Spotless, RAT, and git diff --check passed.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 319/319
AI-Contributed/UT: 606/606
Reuse parsed table metadata and immutable raw/string write plans while
refreshing native metadata and authorization for every topic write.
Offload metadata lookup, conversion and native submission to bounded FIFO
workers, preserving connection order without waiting for acknowledgements.
Close protocol-owned workers after transport and RPC processors stop.

Validation: Java 11 reactor verify passed 160 Kafka unit tests, 8 Kafka
integration tests and 5 NettyServer tests. Checkstyle, Spotless, RAT and
git diff --check passed. Tests cover cache invalidation, authorization
refresh, saturation, shutdown, pending acknowledgements and pipelined
three-replica append order. Source content is unchanged since validation.

ZooKeeper query reduction and byte-based admission remain follow-up work.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 812/812
AI-Contributed/UT: 1047/1047
Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 50/50
AI-Contributed/UT: 99/99
Cover WRITE revocation after metadata reuse, offloaded metadata identity
and schema refresh, and shutdown with an already submitted native append.
Preserve Record timestamp provenance and the existing null-value filtering
behavior, including native offsets and real Kafka producer readback.
The FIP null-value contract and new Core dependencies remain deferred.

Validated on PR06 b6f31fc84baf91c030b296701eb319644578056c with Java 11:
206 Kafka unit tests, 10 Kafka integration tests, 8 RPC regression tests
and 7 delayed-fetch regression tests passed. Checkstyle, Spotless, RAT
and git diff --check passed. This commit changes tests only.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 191/191
Inject the configured topic mapper into Produce, check authoritative table
enablement before plan preparation, and use the shared fixed-column schema.
Reject conversion failures as INVALID_RECORD and missing databases as
UNKNOWN_TOPIC_OR_PARTITION without alias fallback.

Cover shared alias plans and offsets, disable/reset and property/schema
changes, null filtering, raw keys, last-wins headers and null rescue values.
Preserve bounded conversion, authorization and atomic partition conversion.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 34/34
AI-Contributed/UT: 656/656
Wait for table replica metadata and leader readiness before round-trip
writes. Node discovery alone does not ensure a fresh table can accept
acks=0 records, whose failures cannot be observed or retried by the producer.
Include the table path in readback failures to identify format/acks cases.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 7/7
Remove the Kafka drain-hook dependency after separating the core delayed
fetch optimization into apache#3412. Continue to use native append
responses for acknowledgements, including pending acks=all completions.

Retain append, authorization, error mapping, ordering and shutdown coverage;
move the test append signal to native submission instead of the drain hook.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 9/9
AI-Contributed/UT: 33/33
Append null-valued records through the native Produce path, preserving record
order and offsets. Remove the separate authorization shortcut for filtered
records. Cover nullable and NOT NULL values with unit and native readback tests.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 54/54
AI-Contributed/UT: 243/271
Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 364/364
Adapt Produce regressions to database-qualified topic names from PR07.
Exercise a real leader handoff while the old node stays online, verify
NOT_LEADER_OR_FOLLOWER on the existing connection, and confirm the same
producer refreshes its route without disconnecting. Check acks=all offsets
and native readback across the handoff.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 285/285
Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 67/67
Server metadata convergence only confirms node discovery, so a newly
created table can still reject writes before its leader replica is ready.
Wait for the real bucket leader before the all-ack-mode round trip,
including acks=0 which cannot report or retry such a rejected write.
Include the table and format in native readback assertion failures.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 7/7
Exercise persisted table contracts, alias lifecycle, invalid-record atomicity,
and replicated offsets across leader loss and restart using native readback.
Keep null-value filtering and online leader-transfer regressions on the PR07 base.

Add checksum-verified, isolated Java producer tests for all 72 formal releases
from 0.11.0.0 through 4.3.1. Verify all ACK modes and both topic names before
allowing clients to close. Include the provided Jackson 2.10.2 closure required
by Kafka 2.6.0 and matching diagnostic logging bindings in test processes only.

Validation: cumulative reactor regressions and both full matrix phases pass;
396 distinct passing cases, with two pre-existing disabled RPC cases.
Spotless, Checkstyle and RAT pass. SASL and persisted per-row metadata offsets
remain outside this stage.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 1027/1027
Verify that a cached producer using both topic names picks up an added
metadata column. Read back the schema ID and all three metadata fields
through the native client after online leader transfer, leader loss, and
restart. Transfer leadership back to the recovered replica to prove it
retains records written while it was offline.

The source matches the verified PR07-based snapshot byte for byte:
325 distinct tests pass, with two pre-existing disabled RPC cases.
All nine Produce regression cases pass in both execution phases;
Spotless, Checkstyle, and RAT pass. The isolated client check used 3.9.2;
the full 72-version matrix was not rerun for this snapshot.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 325/325
Update the Produce regression to expect null values to be persisted in
binary and string tables. Verify contiguous offsets and native readback
for the null record with a binary key, followed by empty and nonempty
values with null keys.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 0/0
AI-Contributed/UT: 32/32
Use the shared table contract for binary and strict UTF-8 string value
decoders. Preserve the partition-aware transcoder API and pass each full
record to row assembly so optional key, headers and three-field metadata
retain their input semantics. Binary values keep borrowed array storage.

Cover invalid UTF-8 and nullability failures with declared metadata:
failed partitions append no prefix, and reused plans preserve missing
timestamps, batch types and the next request's partition after failure.

Co-Authored-By: Codex <noreply@openai.com>
AI-Model: gpt-6
AI-Contributed/Feature: 274/274
AI-Contributed/UT: 268/268
@gyang94

gyang94 commented Oct 17, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #4678, which is based on the latest PR08 and uses the original codex/kafka-format-decoders branch.

@gyang94 gyang94 closed this Oct 17, 2026
@gyang94
gyang94 deleted the codex/kafka-format-decoders-pr09 branch October 17, 2026 02:29
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.

[kafka] Separate value decoding and preserve record metadata

1 participant