Release Notes - Kafka - Version 4.3.0

Below is a summary of the JIRA issues addressed in the 4.3.0 release of Kafka. For full documentation of the release, a guide to get started, and information about the project, see the Kafka project site.

Note about upgrades: Please carefully review the upgrade documentation for this release thoroughly before upgrading your cluster. The upgrade notes discuss any critical information about incompatibilities and breaking changes, performance changes, and any other changes that might impact your production deployment of Kafka.

The documentation for the most recent release can be found at https://kafka.apache.org/documentation.html.

New Feature

  • [KAFKA-18608] - Enhancing Apache Kafka OAuth2 Authentication: Adding Support for private_key_jwt Client Assertion
  • [KAFKA-19655] - The normal topic auto-creation paths should use num.partitions and default.replication.factor from the controller properties
  • [KAFKA-19774] - Mechanism to cordon brokers and log directories
  • [KAFKA-20037] - Additional group configurations for share groups
  • [KAFKA-20056] - Allow to Store Record Headers in State Stores
  • [KAFKA-20194] - DSL Opt-in Support for Header-Aware State Stores
  • Improvement

  • [KAFKA-7952] - Consider to switch to in-memory stores in test whenever possible
  • [KAFKA-8416] - Improve Documentation for Enabling Optimizations
  • [KAFKA-9195] - Use Randomized State Directory Names in Streams System Tests
  • [KAFKA-10863] - Conver CONTROL_RECORD_KEY_SCHEMA_VERSION to use auto-generated protocal
  • [KAFKA-15433] - Follower fetch from tiered offset
  • [KAFKA-17019] - Producer TimeoutException should include root cause
  • [KAFKA-17411] - StateStore managed changelog offsets
  • [KAFKA-17895] - Expose KeyValueStore's approximateNumEntries as a metric
  • [KAFKA-18952] - Fix flaky MonitorableSinkIntegrationTest#testMonitorableSinkConnectorAndTask
  • [KAFKA-19149] - Use KIP-877 in MirrorMaker
  • [KAFKA-19249] - Replace Consumer#close(Duration) with Consumer#close(CloseOptions)
  • [KAFKA-19361] - document that `mapKey` does not break the compatibility
  • [KAFKA-19519] - Introduce a new config for group coordinator max record size
  • [KAFKA-19541] - KRaft should handle snapshot fetches under slow networks
  • [KAFKA-19562] - Rewrite AbortedTxn by generated protocol
  • [KAFKA-19590] - Add prefix to TopicBasedRemoteLogMetadataManagerConfig to enable setting admin configs
  • [KAFKA-19634] - Formalize nullable and non-nullable type distinctions in protocol specification
  • [KAFKA-19740] - Depreacte broker-level config group.coordinator.rebalance.protocols
  • [KAFKA-19755] - Move `KRaftClusterTest` from core module to server module
  • [KAFKA-19833] - Reduce code duplication in nullable protocol types
  • [KAFKA-19849] - Move ThrottledChannelExpirationTest to server module
  • [KAFKA-19851] - Delete dynamic config that were removed by Kafka
  • [KAFKA-19863] - Add documentation on how to implement a custom exception handler
  • [KAFKA-19939] - ProductionExceptionHandler not supported on global thread
  • [KAFKA-19941] - Tidy up the output of `kafka-features.sh`
  • [KAFKA-19975] - Reassignment completion blocked by non-ISR replicas
  • [KAFKA-19980] - ConfigCommand#validatePropsKey should accept `$` symbol
  • [KAFKA-19993] - Correct the docs of Consumer#committed about the nonexistent partition
  • [KAFKA-20021] - Document when Admin#createPartitions throws InvalidPartitionsException
  • [KAFKA-20030] - Document considerations and side effects of dynamic partition expansion
  • [KAFKA-20060] - drop core test output dependency in jmh-benchmarks
  • [KAFKA-20065] - Improve tagging of code examples in javadoc
  • [KAFKA-20079] - Improve Connect configurable components discoverability
  • [KAFKA-20130] - Move RecordValidationStats to storage module
  • [KAFKA-20146] - Add CI job to detect dependency conflicts in setup.py
  • [KAFKA-20152] - Remove unused CoordinatorMetrics#registry
  • [KAFKA-20153] - Upgrade ducktape from 0.12 to 0.13
  • [KAFKA-20168] - Upgrade jetty to fix CVE-2025-5115
  • [KAFKA-20192] - Brittle logic in ReconfigurableQuorumIntegrationTest
  • [KAFKA-20229] - Batch offset translation in RemoteClusterUtils
  • [KAFKA-20239] - Document Kafka ACLs required for Connect workers
  • [KAFKA-20281] - Enhance docs and test coverage for `producer-props` and `command-property`
  • [KAFKA-20287] - Verify (and potentially fix) if all CF handles (and other objects) are closed correctly
  • [KAFKA-20341] - Clarify that assignment() and subscription() return a snapshot, not a live view
  • [KAFKA-20344] - upgrade jetty to 12.0.34
  • [KAFKA-20360] - Upgrade ducktape from 0.13 to 0.14 and requests from 2.32.2 to 2.32.4
  • [KAFKA-20369] - Upgrade log4j2 from 2.25.3 to 2.25.4
  • [KAFKA-20373] - CVE-2025-67030 in plexus-utils-3.5.1.jar
  • Bug

  • [KAFKA-15894] - MessageConversionsTimeMs and TemporaryMemoryBytes may not be recorded correctly.
  • [KAFKA-16600] - Periodically receive "Failed to transition to PENDING_SHUTDOWN, current state is PENDING_SHUTDOWN" during streams close
  • [KAFKA-18369] - State updater's *-ratio metrics are incorrect
  • [KAFKA-18615] - StreamThread *-ratio metrics suffer from sampling bias
  • [KAFKA-18679] - KafkaRaftMetrics metrics are exposing doubles instead of integers
  • [KAFKA-19286] - RemoteIndexCacheTest.testConcurrentRemoveReadForCache1 is flaky
  • [KAFKA-19542] - Consumer.close() does not remove all added sensors from Metrics
  • [KAFKA-19571] - Race condition between log segment flush and file deletion causing log dir to go offline
  • [KAFKA-19638] - NPE in `Processor#init()` accessing state store
  • [KAFKA-19697] - NPE Cannot invoke org.apache.kafka.connect.runtime.ConnectMetrics$MetricGroup.close()
  • [KAFKA-19749] - The `version-mapping` of kafka-features.sh should work without requiring the bootstrap
  • [KAFKA-19858] - Add configurable min.insync.replicas (default=2) for __remote_log_metadata topic
  • [KAFKA-19932] - AdminClient throws TimeoutException when underlying cause is OutOfMemoryError
  • [KAFKA-19938] - KafkaClusterTestKit not formatting all log directories on combined noes
  • [KAFKA-19943] - Stale values in State Store after tombstone was compacted
  • [KAFKA-19970] - Add time-based eviction to tiered storage index cache to prevent stale entries from accumulating
  • [KAFKA-19984] - Throttle-related dynamic configurations should not have the `isReadOnly` flag
  • [KAFKA-20007] - AclCommandTest#testAclCliWithMisusingBootstrapControllerToServer crashes Gradle Executor
  • [KAFKA-20017] - incorrect warn log when alterConfig suceeds
  • [KAFKA-20020] - Improve UUID nullability description in API readme
  • [KAFKA-20031] - RPCProducerIdManager#sanityCheckResponse fails to detect overlapping producer id
  • [KAFKA-20050] - Add syntax highlighting for code blocks and commands in getting started
  • [KAFKA-20051] - Npm warnings when building website
  • [KAFKA-20058] - Fix race condition on backoffDeadlineMs on RPCProducerIdManager causing premature retries
  • [KAFKA-20073] - Broken mailto links on website
  • [KAFKA-20110] - Fix generated doc and Javadoc for dynamic configs
  • [KAFKA-20128] - TimestampType missing in public API docs
  • [KAFKA-20129] - Server error caused by appending/subtracting a non-existent config key
  • [KAFKA-20131] - ClassicKafkaConsumer does not clear endOffsetRequested flag on failed LIST_OFFSETS calls
  • [KAFKA-20163] - Missing MM2 default exclude configs
  • [KAFKA-20165] - Consumer poll may fail with unrecoverable KafkaException if topic not in metadata when fetching committed offsets
  • [KAFKA-20183] - Share consumer group fails when group ID contains colon character
  • [KAFKA-20204] - Remove partition-level `ExpiresPerSec`metrics when the broker no longer ownsthe partition
  • [KAFKA-20241] - Jackson core vulnerability GHSA-72hv-8253-57qq
  • [KAFKA-20247] - ControllerRegistrationManager does not retry registration after timing out
  • [KAFKA-20254] - Streams group replay fails after log compaction removes classic group tombstone
  • [KAFKA-20264] - `MERGE_REPARTITION_TOPICS` optimization fails depending on which branch of a merged stream contains the key-changing operation
  • [KAFKA-20288] - Remove orphaned groups from GroupConfigManager
  • [KAFKA-20289] - Broker configs with group config names masquerading as static broker config
  • [KAFKA-20302] - Receive buffers allocated from MemoryPool may not be released if request is invalid
  • [KAFKA-20309] - Too many SharePollEvents created
  • [KAFKA-20321] - Mark partitions lost to avoid potential race with buffered records
  • [KAFKA-20322] - TransactionMarkerChannelManager has discoverBrokerVersions=false causing UnsupportedVersionException during rolling upgrades
  • [KAFKA-20330] - Share partition leader restart without leadership change gives wrong exception
  • [KAFKA-20332] - Ensure app thread not collecting records for partitions being revoked
  • [KAFKA-20355] - Invalid formatting of System Properties in website
  • [KAFKA-20380] - controller.quorum.voters should act as advertised.listeners if the latter is not defined
  • [KAFKA-20382] - Improve interrupts handling when updating assignment for callbacks
  • [KAFKA-20393] - Kafka client send to wong IP caused by stickyNode in TelemetrySender
  • [KAFKA-20396] - After unclean shutdown Kafka Streams fails to start
  • [KAFKA-20398] - Memory leak when stream threads are replaced
  • [KAFKA-20426] - Using both group.id and assign() causes a busy loop in AsyncKafkaConsumer
  • [KAFKA-20428] - Consumer unsubscribe could fail processing previous assignment change events
  • [KAFKA-20431] - ConsumerGroupDescribe API does not return partitions being revoked
  • [KAFKA-20441] - Follow ups for KIP-1066
  • [KAFKA-20456] - Task not found in StateUpdater throwing an exception and causing unnecessary restoration
  • [KAFKA-20505] - Deadlock in KIP-932 share path: `SharePartition.rollbackOrProcessStateUpdates` completes future inside write lock, reenters `DelayedOperation` lock held by request handler
  • [KAFKA-20506] - kafka-configs.sh can't delete the config from a offline broker when using bootstrap controller
  • [KAFKA-20542] - Unable to generate javadoc
  • [KAFKA-20571] - InMemory KeyValue store metric throws exception
  • [KAFKA-20572] - Connect REST server throws NPE on startup when using listener-prefixed SSL configs
  • Task

  • [KAFKA-17939] - Kafka Streams API exposes org.apache.kafka.common.utils.Bytes which is not part of the public API
  • [KAFKA-18913] - Consider removing state-updater feature flag
  • [KAFKA-18928] - Support to dynamically change config for specific controller
  • [KAFKA-19434] - Move logic for state store initiation to StreamThread handover
  • [KAFKA-19492] - ReplicaManager.deleteRecordsOnLocalLog should debug log the exception message when OffsetOutOfRangeException occurs
  • [KAFKA-19761] - Gradle Shadow plugin version upgrade: 8.3.9 -->> 9.3.1
  • [KAFKA-19809] - CheckStyle version upgrade: 10 -->> 12
  • [KAFKA-19976] - Deprecate streams-scala module
  • [KAFKA-19981] - Handle retriable remote storage exception in RemoteLogManager
  • [KAFKA-19995] - Record copy lag metrics during failures
  • [KAFKA-20026] - Reduce the list metadata calls to RLMM during segment cleanup
  • [KAFKA-20066] - Implement KIP-1251: Assignment epochs for consumer groups
  • [KAFKA-20091] - Fix inconsistency in time-based retention checks between remote and local segment deletion logic.
  • [KAFKA-20106] - Improve behaviour of consumer assignment API under async reconciliations
  • [KAFKA-20157] - Partition Size Percentage Metrics for Storage Monitoring
  • [KAFKA-20164] - Add Kraft layer support for snapshots with metadata records via new handleLoadBootstrap
  • [KAFKA-20282] - Classic consumer log recommendation for next gen Consumer rebalance protocol
  • [KAFKA-20299] - Cleanup `use_share_groups` in system tests
  • [KAFKA-20306] - StreamsGroupCommand does not display committed offsets for repartition topics
  • [KAFKA-20340] - SharePartition should keep only one config reference
  • [KAFKA-20446] - Native image contains CVE-2026-28390 in libcrypto3 and libssl3
  • [KAFKA-20447] - Native image contains CVE-2026-22184 in zlib
  • [KAFKA-20536] - Empty "Upgrading Servers to 4.1.0" section in upgrade docs across trunk/4.2/4.3
  • Test

  • [KAFKA-19884] - Add tests to ensure Consumer.close() timeouts work as documented
  • [KAFKA-20080] - Add test case for duplicate ports with different hostnames in KafkaConfigTest
  • [KAFKA-20345] - Flaky CoordinatorBackgroundThreadPoolExecutorTest testMetrics
  • [KAFKA-20376] - Update site docs for rebalance protocol page
  • [KAFKA-20512] - Flaky/Failing org.apache.kafka.streams.integration.OuterJoinListValueStoreRestorationTest
  • Sub-task

  • [KAFKA-12617] - Convert MetadataRequestTest to use ClusterTest
  • [KAFKA-14579] - Move DumpLogSegments to tools
  • [KAFKA-17266] - Add dynamic broker config to enabled tiered offset follower fetch
  • [KAFKA-17302] - ReplicaFetcher changes for fetching from tiered offset
  • [KAFKA-17573] - Move KRaftMetadataCache to metadata module
  • [KAFKA-18883] - Move TransactionLog to transaction-coordinator module
  • [KAFKA-19132] - Move FetchSession and related classes to server module
  • [KAFKA-19144] - Move DelayedProduce to server module
  • [KAFKA-19414] - Remove Public APIs from 4.1, 4.2, 4.3
  • [KAFKA-19649] - Document List Offset changes in upgrade.html
  • [KAFKA-19666] - Clean up integration tests related to state-updater
  • [KAFKA-19683] - Clean up TaskManagerTest
  • [KAFKA-19709] - Add LegacyCheckpointingStateStore
  • [KAFKA-19714] - Auto migrate .checkpoint offsets
  • [KAFKA-19817] - Move DynamicTopicClusterQuotaPublisher to metadata module
  • [KAFKA-19915] - Move HostedPartition, LogAppendResult and LogDeleteRecordsResult to server module
  • [KAFKA-19926] - Apply rebalance delay also for later epochs if the group is empty
  • [KAFKA-19942] - Clean up StreamThread and StoreChangelogReader Test
  • [KAFKA-20012] - Move NodeToControllerChannelManagerImpl to server module
  • [KAFKA-20034] - DeliveryCompleteCount should be 0 when share group offsets are altered.
  • [KAFKA-20052] - Client renew issue when acknowledgements sent for deleted topic partition
  • [KAFKA-20083] - Move BrokerLifecycleManager to server module
  • [KAFKA-20084] - Move LogCleanerManagerTest to storage module
  • [KAFKA-20085] - Let's replace this verbose instruction with a custom Gradle task
  • [KAFKA-20105] - Move FetchSessionTest to server module
  • [KAFKA-20120] - Create HeadersSerializer and HeadersDeserializer
  • [KAFKA-20121] - Create ValueTimestampHeaders and its serializer/deserializer
  • [KAFKA-20122] - Create HeadersBytesStore
  • [KAFKA-20124] - Move LogCleanerLagIntegrationTest to storage module
  • [KAFKA-20127] - Add new methods to StateSerdes
  • [KAFKA-20132] - Implement TimestampedKeyValueStoreWithHeaders
  • [KAFKA-20134] - Implement TimestampedWindowStoreWithHeaders
  • [KAFKA-20136] - Add javadoc to org.apache.kafka.clients.consumer module
  • [KAFKA-20137] - Add javadoc to org.apache.kafka.clients.producer
  • [KAFKA-20158] - Implement SessionStoreWithHeaders
  • [KAFKA-20159] - Group configuration for share.delivery.count.limit
  • [KAFKA-20160] - Group configuration for share.partition.max.record.locks
  • [KAFKA-20161] - Group configuration for share.renew.acknowledge.enable
  • [KAFKA-20162] - Validation and enforcement of group configurations
  • [KAFKA-20173] - Revisit KS serde code to check if headers are passed correctly
  • [KAFKA-20178] - Move LogCleanerIntegrationTest to storage module
  • [KAFKA-20185] - Verify existing IQv2 methods for MeteredTimestampedKeyValueStoreWithHeaders
  • [KAFKA-20202] - Verify existing IQv2 methods for MeteredTimestampedWindowStoreWithHeaders
  • [KAFKA-20203] - setFlushListener should pass record.headers() instead of empty headers
  • [KAFKA-20205] - Refactor serialization and deserialization code for *WithHeaders types
  • [KAFKA-20210] - Add group.coordinator.executor.threads config
  • [KAFKA-20211] - Add new group coordinator executor metrics
  • [KAFKA-20212] - Add offset management support to RocksDBStore
  • [KAFKA-20218] - Add downgrade tests in TimestampedKeyValueStoreWithHeadersTest
  • [KAFKA-20219] - Override `getPosition` correctly for TimestampedKeyValueStoreWithHeaders
  • [KAFKA-20220] - Enable TimestampedKVStoreWithHeaders in DSL
  • [KAFKA-20221] - Enable TimestampedWindowStoreWithHeaders in DSL
  • [KAFKA-20222] - Enable SessionStoreWithHeaders in DSL
  • [KAFKA-20240] - Update upgrade.md to mention new batching and background thread pool configs
  • [KAFKA-20249] - Optimize rawValue methods across all Deserializers
  • [KAFKA-20251] - Add group-level assignment batching and offload configs
  • [KAFKA-20258] - Refactor DSL store config and propagate dslStoreFormat
  • [KAFKA-20260] - Upgrade path from plain KV store to headers store
  • [KAFKA-20261] - Upgrade path for plain window store to headers store
  • [KAFKA-20262] - Changelog tombstone records drop custom headers when using headers-aware state stores
  • [KAFKA-20263] - Change KeyValueWrapper to have versioned and headersStore
  • [KAFKA-20266] - Record assignment timestamps
  • [KAFKA-20268] - Start group epochs at 2
  • [KAFKA-20269] - Refactor GroupMetadataManager assignment updates
  • [KAFKA-20272] - Rebalance classic members only on new assignment
  • [KAFKA-20273] - Trigger rebalance on downgrade to classic group when assignment is stale
  • [KAFKA-20277] - Verify existing IQv2 methods for SessionStoreWithHeaders
  • [KAFKA-20279] - Refactor `AbstractConfigurableStoreFactory#dslStoreFormat()`
  • [KAFKA-20285] - Mpve UncleanLeaderElectionTest to server module
  • [KAFKA-20290] - Add KIP-1240 information to upgrade documentation
  • [KAFKA-20291] - Implement assignment batching
  • [KAFKA-20300] - Add assignment batching and offload broker configs
  • [KAFKA-20301] - Integration tests for upgrade and downgrade SessionStore with headers
  • [KAFKA-20303] - Optimize deserializers and HeadersBytesStore
  • [KAFKA-20304] - Implement all required ReadOnly*Facade classes for headers stores
  • [KAFKA-20307] - Add Interactive Queries (IQv1) support for headers-aware stores
  • [KAFKA-20308] - Update TopologyTestDriver to support for headers-aware stores
  • [KAFKA-20317] - Enable time-ordered header window store in DSL
  • [KAFKA-20318] - Enable time-ordered header session store in DSL
  • [KAFKA-20326] - WindowStoreMaterializerTests needs to get updated
  • [KAFKA-20327] - Add SessionStore overrides to Abstract decorators
  • [KAFKA-20331] - Update upgrade.md to mention new assignment offload configs
  • [KAFKA-20339] - Make offload config private for 4.3