)]}'
{
  "log": [
    {
      "commit": "601492157a7e563b5cd4cdea8c9382302a1ea5f4",
      "tree": "6ab81f776178c5186ae9ce21d1258bb118c6a185",
      "parents": [
        "3655d7c19cd9771ef4b1d213084cfd08f45c7581"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Wed Oct 28 16:10:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 16:10:48 2026 -0700"
      },
      "message": "MINOR: Fix race in StreamsGroupWarmupTaskIntegrationTest (#23944)\n\nThe test sampled the thread metadata for a standby task to detect the\nwarm-up. The metadata shows it only until the promotion, so a test\nthread stalled for about two heartbeat intervals missed it and timed\nout. Record the warm-up\u0027s start and its promotion through a\nStandbyUpdateListener instead.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "3655d7c19cd9771ef4b1d213084cfd08f45c7581",
      "tree": "69eaaeb4db31e175916d87358e7920825faa5edd",
      "parents": [
        "aa62a433553c14866521bd40ff446b6920d4d67e"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Wed Oct 28 21:18:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 21:18:49 2026 +0100"
      },
      "message": "KAFKA-21214: Start the new map of a member at the default capacity (follow-up) (#24001)\n\nA member that owns no partitions gets its new map from\n`Utils.newHashMap(0)` in `AssignmentBuilder.ownedPartitions`. Its table\nstarts with a single slot and resizes at 1, 2, 4 and 7 entries before\nreaching the default capacity of 16. This patch sizes the map for at\nleast 12 entries, which a map of the default capacity holds without\nresizing.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "aa62a433553c14866521bd40ff446b6920d4d67e",
      "tree": "5b5af5a5846e75cb33e5d4f517c43264bb1bcc84",
      "parents": [
        "4b31f50795397c1fc5f6355993661a2105a40e97"
      ],
      "author": {
        "name": "Nikita Shupletsov",
        "email": "nikita@shupletsov.ca",
        "time": "Wed Oct 28 11:35:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 14:35:02 2026 -0400"
      },
      "message": "KAFKA-20866: Remove incremental-only append result state (#23749)\n\nRecordAppendResult is created for every successful append. This change\nremoves the incremental-strategy-only outcome and extensionBytesNeeded\nfields from regular results. Buffer-extension capacity is now held only\nby a private result subtype, while the existing append/new-batch\nbehavior remains unchanged.\n\nThe chunked accumulator consumes the capacity through a package-private\naccessor, and a regression test covers the buffer-extension result\ncontract.\n\nCo-authored-by: YunSeop \u003clh0156@naver.com\u003e Reviewers: Lianet Magrans\n\u003clmagrans@confluent.io\u003e\n\nReviewers: liuliu \u003cliuliugit@gmail.com\u003e, Lianet Magrans\n\u003clmagrans@confluent.io\u003e\n\n---------\n\nCo-authored-by: YunSeop \u003clh0156@naver.com\u003e\nCo-authored-by: Lianet Magrans \u003c98415067+lianetm@users.noreply.github.com\u003e"
    },
    {
      "commit": "4b31f50795397c1fc5f6355993661a2105a40e97",
      "tree": "851664b0396553e717361f8119d931a901f985a4",
      "parents": [
        "9a61f5711c1506ab1b6fb526cf907295ffb9defe"
      ],
      "author": {
        "name": "Mykyta Bozhenko",
        "email": "21245729+cheeeee@users.noreply.github.com",
        "time": "Wed Oct 28 12:54:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 09:54:49 2026 -0700"
      },
      "message": "KAFKA-16304: Report file read errors from SslTransportLayer.transferFrom as such (#23928)\n\nFollow-up to #23445, under the same ticket (resolved, fix version\n4.5.0).\n\nSince #23445, a failed send of fetched records is passed to a handler\nthat re-reads the region on the scheduler, and the log directory is\nofflined only if the re-read fails too. The re-read is needed because\nover PLAINTEXT `sendfile` reads the file and writes the socket in one\ncall, so a disk error and a socket error are the same bare\n`IOException`. `SslTransportLayer.transferFrom` does not have that\nproblem: it reads the file with `FileChannel.read`, then encrypts and\nwrites, so it knows which of the two failed. As discussed on #23445,\nthis passes that on instead of finding it out again:\n\n* `SslTransportLayer.transferFrom` throws a new `FileReadException`, an\n  `IOException` with the position of the read, when `FileChannel.read`\n  or `FileChannel.size` fails. A `ClosedChannelException`, from a\n  deletion or a shutdown, is rethrown as is\n  (`FileReadException.ofReadFailure`).\n* `TransferableChannel.distinguishesFileReadFailures()` says whether a\n  transport does that: true for TLS, false, the default, for\n  PLAINTEXT.\n* `FileRecords.writeTo` passes to the handler a `FileReadException`\n  always, a `ClosedChannelException` never, and any other\n  `IOException` only if the transport cannot tell a failed read of the\n  file from a failed write to the network channel. A failure of its own\n  `channel.size()` call before the transfer becomes a\n  `FileReadException` as well, unless it is a `ClosedChannelException`.\n* `LocalLog` reports a `FileReadException` as a failure of the log\n  directory right away, without re-reading the region. Other failures\n  are re-read on the scheduler as before.\n* `LogDirFailureChannel.maybeAddOfflineLogDir` logs the error only when\n  it takes the log directory offline, so that the failures that follow\n  in a failing directory do not flood the log.\n\nConsequences worth stating:\n\n* On TLS listeners a disconnect no longer re-reads the region that was\n  being sent. In the test notes, consumers killed mid-fetch over TLS\n  for 5 minutes made the scheduler re-read 151 MB without this change\n  and nothing with it.\n* On TLS listeners a read error now offlines the log directory even if\n  the region could be read again by the time of a re-read, e.g. after a\n  transient media error. Before, such an error was attributed to the\n  socket. This is the criterion `LocalLog` applies to any other\n  `IOException`.\n* A failed `FileChannel.size()` call on the segment, over either\n  transport, is now reported as a read failure without a re-read.\n* For every caller of `maybeAddOfflineLogDir`, an error in a log\n  directory that is already offline is no longer logged there.\n* PLAINTEXT listeners still re-read: `sendfile` cannot tell the two\n  apart.\n* KRaft snapshots, sent through `UnalignedFileRecords`, are still not\n  covered.\n\nGenerated-by: Claude (Anthropic)\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e"
    },
    {
      "commit": "9a61f5711c1506ab1b6fb526cf907295ffb9defe",
      "tree": "7632a8737b4a4ca461f5d68c5aef560def36ce39",
      "parents": [
        "a589c272c1666724af8bf137bf1fda1e2b568ef4"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Wed Oct 28 16:04:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 16:04:46 2026 +0100"
      },
      "message": "KAFKA-21214: [8/8] Add the uniform2 consumer group assignor (#23723)\n\nThe uniform assignor balances the total number of partitions per member\nbut not the partitions of each topic: with homogeneous subscriptions, a\nmember can get all the partitions of a topic while the others get none\nof them. The throughput is usually about the same across the partitions\nof a topic but not across topics, so adding members does not spread the\nload.\n\nThis patch adds uniform2, the next version of the uniform assignor, from\nthe steps of the previous patches. It lives next to the uniform assignor\nwhile it is developed and is not registered as a built-in assignor. Its\nassignments have these properties, in priority order:\n- Every partition of every subscribed topic goes to exactly one of its\n  subscribers.\n- Every subscriber of a topic gets the same number of its partitions,\n  the minimum quota, or one more, with an extra partition.\n- No extra partition could move to another subscriber of its topic\n  whose assignment is at least two partitions smaller.\n- Partitions stay with their owners where the above allows. The\n  placement moves the fewest partitions for the quotas, and an\n  assignment that already has these properties is returned unchanged.\n- The result is deterministic.\n\nChanges:\n- `Uniform2Assignor` and `AssignmentBuilder`, which reads the group,\n  runs the `KeepStickyExtraPartitions`, `AssignRemainingExtraPartitions`\n  and `BalanceExtraPartitions` steps on the quotas, places every topic\n  and builds the result. Partitions of topics that a member does not\n  subscribe to or which no longer exist are dropped. The class Javadoc\n  of `Uniform2Assignor` describes the steps with a worked example.\n- The result reuses the maps and sets of the members that do not change.\n  `RangeSet` becomes public to return consecutive partitions.\n- The assignor does not use racks yet. Rack awareness comes in a later\n  patch.\n- `ConsumerAssignorBenchmark` gets `UNIFORM2`.\n- End to end tests with hand traced expectations, written with the group\n  spec and topics fixtures, and a shared checker of the properties.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a589c272c1666724af8bf137bf1fda1e2b568ef4",
      "tree": "3096c937dc8ec7c2620ff12edd115ceb86e04968",
      "parents": [
        "1224f3d4b24e3cff7df7815b472ab12240421266"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "sushant.mahajan88@gmail.com",
        "time": "Wed Oct 28 17:25:05 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 17:25:05 2026 +0530"
      },
      "message": "KAFKA-21356: Relieve the persister thread of share group DLQ processing. (#23964)\n\nCopying records into the DLQ was dominated by work on the persister\nthread, which also completes write responses for every share partition:\n\n- isDlqEnabledOnTopic and dlqTopicMaxMessageBytes built a LogConfig,\nwhich parses every topic config, on each DLQ request. Read the one key\ndirectly. (Affects both copy on and off case)\n- The source record read of ran synchronously on the persister thread.\nRun it (and later rounds) on a single-threaded fetch executor owned and\nshut down by BrokerServer. (Affects copy on case)\n- ShareGroupDLQRecordFetcher.collectRecords visited every batch of a 1\nMiB log read, loading each file-backed batch from disk, although a\nrequest wants a few records. We can simply reject batches where the\nbatch baseOffset \u003e dlq endoffset (V2 only, Affects copy on case).\nCo-Authored-By: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1224f3d4b24e3cff7df7815b472ab12240421266",
      "tree": "287e6b688620f0d49f6ecbd897f4faf87c58d137",
      "parents": [
        "6a683504061f71173adb273618dc1e0c105dfe2c"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Tue Oct 27 18:13:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 18:13:47 2026 -0700"
      },
      "message": "MINOR: Fix the refiner\u0027s restored-something check (#23942)\n\nA member reports a task position of 0 before it restores anything, and\nLong.MAX_VALUE only when the offset sum overflows. hasRestoredSomething\nincorretly read MAX_VALUE as \"restore not started\", so a fresh warm-up\ncounts as started. This patch fixes this bug.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "6a683504061f71173adb273618dc1e0c105dfe2c",
      "tree": "eb9c5a0219ac519334efc9256c8dc4acb8e7e9c1",
      "parents": [
        "f12aa236d98f6bf1dd21af8806facdaafec3a363"
      ],
      "author": {
        "name": "Chia-Ping Tsai",
        "email": "chia7712@gmail.com",
        "time": "Wed Oct 28 09:04:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 09:04:20 2026 +0800"
      },
      "message": "MINOR: Refresh collaborators list (#23982)\n\nRefresh the GitHub collaborators list in .asf.yaml using\ncommitter-tools/refresh_collaborators.py.\n\nThe list is the top 10 non-committer contributors by number of commits\nin the past year.\n\nAdded:\n- chickenchickenlove\n- gabriellefu\n- muralibasani\n\nRemoved:\n- Nikita-Shupletsov\n- sjhajharia\n- smjn\n\nThanks to the removed collaborators for their contributions over the\npast year :smiley:\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "f12aa236d98f6bf1dd21af8806facdaafec3a363",
      "tree": "fec8c7ce11a7f0d31b77a5a3a5c5f031e25d9f4f",
      "parents": [
        "7596c4bc4b252083fa2fec8da798d16dc988f077"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Wed Oct 28 09:54:05 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 08:54:05 2026 +0800"
      },
      "message": "KAFKA-21193: Speed up SuppressionIntegrationTest and JoinStoreIntegrationTest (#23655)\n\nSix of the 14 cases in SuppressionIntegrationTest take 42 to 46 seconds\neach. Each test method uses a fixed application id, so the\nwithHeaders\u003dfalse and withHeaders\u003dtrue runs share one consumer group,\nand the second run waits until the previous member\u0027s session times out.\nshouldUseDefaultSerdes also reused the \"-shouldInheritSerdes\" test id,\nso it shared a group and topics with shouldInheritSerdes. The two\nshouldShutdownWhen... tests were not affected, because their members\nsend a LeaveGroup when the stream thread fails.\n\nThis uses safeUniqueTestName(testInfo) for the test id, as #23594 did\nfor FineGrainedAutoResetIntegrationTest, so every run gets its own\napplication id and topics. The changelog topic names checked in\nshouldAllowOverridingChangelogConfig and shouldCreateChangelogByDefault\nwere hard-coded with the old application id, so they are now built from\nthe application id.\n\nJoinStoreIntegrationTest has the same issue: each of its two\nparameterized tests reuses an application id across invocations, so the\nwithHeaders\u003dtrue invocation waits about 45 seconds for the previous\nmember\u0027s session to time out. Both tests now use\nsafeUniqueTestName(testInfo) to give each invocation its own application\nid. The changelog topic names checked in\nstreamJoinChangelogTopicShouldBeConfiguredWithDeleteOnlyCleanupPolicy\nare now built from that id. Locally, the class went from 94.9s to 6.9s.\n\nLocal runs of SuppressionIntegrationTest on the same machine (1 run\nbefore, 3 runs after):\n\n- Test time: 289s before, 32.4 to 32.5s after\n- Cases over 30s: 6 before, 0 after\n- Result: 14 passed before and after\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "7596c4bc4b252083fa2fec8da798d16dc988f077",
      "tree": "bb8476d7d14b2efe3c82397e7118d4bb81d12593",
      "parents": [
        "b1093f64c085d82c08fd6462b26a190e2eb3cb83"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Wed Oct 28 05:05:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 05:05:05 2026 +0800"
      },
      "message": "KAFKA-19042 Rewrite TransactionsBounceTest from Scala to Java (#23879)\n\nRewrite TransactionsBounceTest from Scala to Java and move it to\nclients-integration-tests. The transaction status header helpers are\nmoved to ClientsTestUtils and shared with ProducerIdExpirationTest, and\nthe Scala helpers in TestUtils that were only used by this test are\nremoved.\n\nReviewers: Murali Basani \u003cmuralidhar.basani@aiven.io\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b1093f64c085d82c08fd6462b26a190e2eb3cb83",
      "tree": "01afe5ca185cac31bc80c603d496e26b62a4eb31",
      "parents": [
        "058f67ef5c05c8397dcd8511be77ce564a21c0fa"
      ],
      "author": {
        "name": "Artem Livshits",
        "email": "84364232+artemlivshits@users.noreply.github.com",
        "time": "Tue Oct 27 13:23:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 13:23:46 2026 -0700"
      },
      "message": "KAFKA-21349: Wait for the high watermark before loading transaction metadata (#23943)\n\nWhen a broker becomes the leader of a `__transaction_state` partition,\n`TransactionStateManager` loads the log up to the log end offset. A\nnewly elected leader can have records above the high watermark that are\nnot committed yet and can still be truncated if leadership moves again,\neven with clean elections. The coordinator then acts on state that is\nlater rolled back. For example, it can send COMMIT markers for a\nPREPARE_COMMIT that the next leader doesn\u0027t have, and that leader later\ntimes out and aborts the transaction, so the transaction is committed on\nsome partitions and aborted on others.\n\nLoading with `FetchIsolation.HIGH_WATERMARK` is not enough, because a\nnew leader\u0027s high watermark can lag behind the true one, so the load\nwould miss committed records.\n\nThe coordinator doesn\u0027t write to the partition while it is loading\n(requests get `COORDINATOR_LOAD_IN_PROGRESS`), so the log end offset at\nthe start of the load doesn\u0027t change. Once the high watermark reaches\nit, every record the load reads is committed. This change:\n\n- In `loadTransactionsForTxnTopicPartition`, if the high watermark is\nbelow the log end offset, registers a `PartitionListener` and schedules\nthe load once the high watermark reaches the log end offset. The high\nwatermark is checked again after the listener is added, since an update\nbetween reading it and adding the listener isn\u0027t delivered to the\nlistener.\n- Abandons the load (removes the `loadingPartitions` entry) if the\npartition is not online, becomes a follower, fails or is deleted before\nthe high watermark catches up. This runs on the scheduler, since\nlisteners are invoked with partition locks held.\n- Skips partitions that are loading in\n`removeExpiredTransactionalIds()`. On a leader epoch bump, the previous\nepoch\u0027s cache entry stays until the new load replaces it, and tombstones\nwritten for it would move the log end offset while the load waits.\n- Logs the time spent waiting for the high watermark as part of the load\ntime.\n\nIn the normal case the wait is about one follower fetch round trip. If\nan ISR follower is unavailable, the load waits until it is removed from\nthe ISR (`replica.lag.time.max.ms`). This does not cover unclean leader\nelection, where committed records can be lost.\n\nTesting: added unit tests to `TransactionStateManagerTest` for waiting\nfor the high watermark, abandoning on each partition transition and when\nthe partition is not online, the high watermark advancing during\nlistener registration, a leader epoch bump while waiting, and expiration\nof a partition that is being reloaded.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: Justine Olshan \u003cjolshan@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "058f67ef5c05c8397dcd8511be77ce564a21c0fa",
      "tree": "44e4b4696e71134c9d686c466d1d5e61cc19f4a0",
      "parents": [
        "234645523f805a75ae7e6e014aa02d6fe31bf9b2"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Tue Oct 27 19:03:18 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 19:03:18 2026 +0000"
      },
      "message": "MINOR: Reject negative maxRecords in ShareFetch request (#23983)\n\nA negative MaxRecords in a ShareFetch request (v1+) was not validated\nand only surfaced as an empty response after the log fetch. Return\nINVALID_REQUEST before the share session context is created. A value of\n0 remains valid as clients send it for acknowledgement-only requests.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "234645523f805a75ae7e6e014aa02d6fe31bf9b2",
      "tree": "62d6cc476ab7d943c21cc9c430696ea5503afde6",
      "parents": [
        "c9e355086b7341c76e0b069595deb45cfa3e195e"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Tue Oct 27 13:40:16 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 17:40:16 2026 +0000"
      },
      "message": "MINOR: Test that request header v3 is unsupported before IBP_4_5_IV0 (#23959)\n\n`ShareCoordinatorMetadataCacheHelperImplTest` covered\n`isRequestHeaderV3Supported()` at `IBP_4_5_IV0` and when the metadata\nversion is unknown, but not at an older metadata version. This adds a\ntest that it returns false at `IBP_4_4_IV2`, the version just before the\nrequest header v3 gate.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "c9e355086b7341c76e0b069595deb45cfa3e195e",
      "tree": "9b8ad6afcb2f86984fa3cb725f4152342536537f",
      "parents": [
        "1da285a9a79830d99791303f3fe4b29fe6bda750"
      ],
      "author": {
        "name": "Sharang Gupta",
        "email": "sharang@sharanggupta.dev",
        "time": "Tue Oct 27 17:37:42 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 17:37:42 2026 +0000"
      },
      "message": "MINOR: Use Locale.ROOT for the SCRAM iteration count and remove the unused credential string format (#23909)\n\n`ScramMessages.ServerFirstMessage.toMessage()` builds the SCRAM\nserver-first-message with `String.format(\"r\u003d%s,s\u003d%s,i\u003d%d\", ...)`.\nWithout an explicit `Locale`, `%d` follows the JVM\u0027s default locale, and\non a broker whose default locale uses native digits (for example\n`ar-EG`, `fa-IR`, `bn-BD`, `ne-NP`; JDK 9+ CLDR data) the iteration\ncount is emitted as `i\u003d٤٠٩٦` instead of `i\u003d4096`.\n\nRFC 5802 requires ASCII digits, and `ServerFirstMessage` itself parses\nthe count with `i\u003d(?\u003citerations\u003e[0-9]+)`, so every SCRAM handshake\nagainst such a broker fails with `SaslException: Invalid SCRAM server\nfirst message format: r\u003d...,i\u003d٤٠٩٦` (non-Java clients reject it the same\nway).\n\nThis passes `Locale.ROOT` to that `String.format` call, as already done\nfor `toLowerCase()` under KAFKA-20638 and for the\n`tools`/`server-common` modules under KAFKA-20646 (which does not cover\n`clients`), and adds a test that switches the default locale to `ar-EG`\n(guarded with `@ResourceLock(Resources.LOCALE)`) and verifies the\nmessage still uses ASCII digits. The other `String.format` calls in\n`ScramMessages` only use `%s` and are not locale-sensitive.\n\nFollowing review, it also removes\n`ScramCredentialUtils.credentialToString()` / `credentialFromString()`:\nthe ZooKeeper-era credential string format had the same `%d` problem but\nno callers left outside its own tests, so the methods, their constants\nand the tests that only exercised them are gone.\n`ScramCredentialUtils.createCache()` and its test are unchanged.\n\nReproduced against the released `kafka-clients` 4.4.0 jar on JDK 25:\n```\njava -Duser.language\u003dar -Duser.country\u003dEG ...\nserver-first-message on the wire \u003d\nr\u003dclientnonceservernonce,s\u003dMDEy...,i\u003d٤٠٩٦\nclient parse                     \u003d FAILED: Invalid SCRAM server first\nmessage format\n```\n\nCo-Authored-By: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Fable 5.1 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "1da285a9a79830d99791303f3fe4b29fe6bda750",
      "tree": "1f4e23eade8fe9347c0eafde0173f1e0e4e5b105",
      "parents": [
        "d3378689fe632d679930244d2a4cebaa56110be7"
      ],
      "author": {
        "name": "Wang Xiaoqing",
        "email": "wx7i@outlook.com",
        "time": "Wed Oct 28 01:21:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 10:21:06 2026 -0700"
      },
      "message": "KAFKA-20734: Return noNode for known partitions without endpoints (#22680)\n\nIn `KRaftMetadataCache`, `getPartitionLeaderEndpoint` returns empty when\nthe previous leader is offline after the refactor.\n\nWith this PR, the method now returns `noNode` when the leader partition\nexists, aligning with the original Scala implementation.\n\nChanges are covered by unit tests. Please feel free to review.\n\nReviewers: Kevin Wu \u003ckwu@confluent.io\u003e, Justine Olshan\n \u003cjolshan@confluent.io\u003e"
    },
    {
      "commit": "d3378689fe632d679930244d2a4cebaa56110be7",
      "tree": "ac528781971a80618de8e02287ac3a128e3f1495",
      "parents": [
        "565a8172bb9c12762a9462118cbd3b1472fb2b73"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Tue Oct 27 13:18:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 01:18:33 2026 +0800"
      },
      "message": "KAFKA-21297 Refactor maybeUpdateLimitOffsetsForStandbyChangelogs (#23966)\n\nReplace the for-loop with anyMatch in\nmaybeUpdateLimitOffsetsForStandbyChangelogs. Both short-circuit on the\nfirst partition with buffered records, so there is no behavior change.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "565a8172bb9c12762a9462118cbd3b1472fb2b73",
      "tree": "ed260bf6e21d2531e325ebd5be90215993696aac",
      "parents": [
        "0acc8008cb81397cb17664a0399f0b7b305258db"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Wed Oct 28 00:58:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 28 00:58:44 2026 +0800"
      },
      "message": "MINOR: Migrate Admin client timeout integration tests to Java (#23931)\n\nMigrate the Admin client timeout and close tests from\nPlaintextAdminIntegrationTest to AdminClientTimeoutIntegrationTest. The\ntimeoutMs(0) tests now use assertTimeout to verify the option timeout is\nhonored, and tests that only need an invalid broker run with `@Test`\ninstead of `@ClusterTest`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "0acc8008cb81397cb17664a0399f0b7b305258db",
      "tree": "c7248a8c5a822fad74e579e6f07fd932e366bd36",
      "parents": [
        "203b877ff2a2142b1619b64a317c210ca9f05601"
      ],
      "author": {
        "name": "Nick Telford",
        "email": "nick.telford@gmail.com",
        "time": "Tue Oct 27 16:15:08 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 12:15:08 2026 -0400"
      },
      "message": "KAFKA-21230: Pause processing on uncommitted bytes (#23728)\n\nDuring a long rebalance, a `StreamThread` can use native memory without\nlimit and fail with an out-of-memory error. When the uncommitted state\nstore bytes exceed `statestore.uncommitted.max.bytes`,\n`StreamThread#maybeCommit` forces a commit. But `TaskManager` skips\ncommits during a rebalance, and `runOnceWithoutProcessingThreads`\ncontinues to process records. Thus the uncommitted bytes continue to\nincrease. RocksDB keeps these bytes in a `WriteBatch` in native memory,\noutside the block cache and the write buffers.\n\nAt the start of each iteration of the processing loop, `StreamThread`\nnow calls `maybePauseProcessingForUncommittedBytes()`, which checks\n`shouldCommitDueToUncommittedBytes()`. Because `maybeCommit` commits at\nthe end of each iteration, the bytes exceed the limit at this point only\nwhen that commit was skipped or failed. So the check needs no extra\nstate. While processing is paused, the thread does not process records\nor run punctuators, because both write to the state stores. It continues\nto poll, so the rebalance can complete, and it continues to call\n`maybeCommit`. Processing resumes when a commit succeeds, or when a\ncommit on partition revocation flushes the buffers. The thread logs the\npause and the resume at INFO level.\n\nThis change decreases throughput during a long rebalance, but it\nprevents the out-of-memory error. `GlobalStreamThread` does not need\nthis change, because one thread writes to its stores, checks the bytes\nand flushes them, and nothing skips that flush. A separate pull request\nwill apply the same pause to processing threads.\n\nTwo new `StreamThreadTest` tests cover the change.\n`shouldNotProcessOrPunctuateWhileUncommittedBytesExceedLimit` shows that\nthe thread polls and tries to commit, but does not process or punctuate,\nwhile the commit is skipped.\n`shouldResumeProcessingOnceUncommittedBytesAreCommitted` shows that\nprocessing stays paused for the iteration in which the rebalance\ncompletes, and resumes only after the commit succeeds.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "203b877ff2a2142b1619b64a317c210ca9f05601",
      "tree": "b8d25defaabb7d6df32aa383b10a85d563bcb64d",
      "parents": [
        "6bc6d9b851d0eda5df07ff9de1db9e5e8881613c"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Tue Oct 27 06:04:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 11:04:20 2026 +0100"
      },
      "message": "MINOR: Strengthen tests for replaying streams group assignment configs    (#23872)\n\nFollow-up to #23165. Test-only change.\n-\n`testStreamsGroupEpochDoesNotIncreaseWhenEveryAssignmentConfigIsAtItsDefault`\nnow starts the group with\nnon-default assignment configs, so it fails if replaying a record\nwithout configs does not reset them to the\ndefaults.\n- Add\n`testStreamsGroupEpochIncreasesWhenAnAssignmentConfigIsNotAtItsDefault`:\nafter the same replay, a group with\n`num.standby.replicas\u003d2` still bumps the group epoch, since the replayed\ndefaults differ from the current configs.\n- Add `AssignmentConfigsImplTest` cases for `fromRecord` with an empty\nlist and with an unknown key.\n- Use `AssignmentConfigsImpl.DEFAULT` instead of `new\nAssignmentConfigsImpl(0, List.of())` in `GroupMetadataManagerTest`.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "6bc6d9b851d0eda5df07ff9de1db9e5e8881613c",
      "tree": "8faa92f91fd8d9fab1f540bd6bfba7dc31becd2c",
      "parents": [
        "831fdfec11364192aa9da90e138fb6f83a06db6f"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Tue Oct 27 02:51:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 09:51:32 2026 +0000"
      },
      "message": "KAFKA-20684 [7/N]: Point clients internals at RebalanceListener (#23109)\n\nWidens the private subscribeInternal helpers to RebalanceListener and\nretargets internal javadoc, including StickyAssignor\u0027s worked examples.\nLog strings now say RebalanceListener.onPartitionsX; no assertions\ndepend on them.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "831fdfec11364192aa9da90e138fb6f83a06db6f",
      "tree": "c08b275585ac1bd897d462ef415669b42cf8ba87",
      "parents": [
        "2bd1d20063ce7e0843bb1482f7252b67c2a40421"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Tue Oct 27 02:44:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 09:44:20 2026 +0000"
      },
      "message": "KAFKA-20684 [6/N]: Migrate core integration tests to RebalanceListener (#23107)\n\nMigrates rather than suppressing: -Xfatal-warnings applies to\ncompileTestScala, and a @nowarn that suppresses nothing is itself fatal.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "2bd1d20063ce7e0843bb1482f7252b67c2a40421",
      "tree": "1071641b478415f2d1a3d77ce363556f4eec2f17",
      "parents": [
        "286b144260187dc51fe128d22ded78f68280a48f"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Mon Oct 26 12:19:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 03:19:06 2026 +0800"
      },
      "message": "KAFKA-20684 [10/N]: Migrate remaining clients tests to RebalanceListener (#23863)\n\nPlaintextConsumerAssignorsTest uses the ConsumerRebalanceListener when\nit moved to Java in #23708. This was missed during #23108 port.\n\nMigrate it, along with the MockConsumerTest, AsyncKafkaConsumerTest and\nConsumerSubscriptionStateTest cases where the old listener was\nincidental.\n\nTests that cover the deprecated overloads or the 1-arg bridge stay on\nthe old API until it is removed. A dedicated test for the deprecated\nsubscribe overloads will be added in KAFKA-21365.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "286b144260187dc51fe128d22ded78f68280a48f",
      "tree": "5a20b8e536622716a1c8b20939a8e60eacc30fc9",
      "parents": [
        "dd7bafb3ee4cd2a5c6052807cdc4c998e03a80df"
      ],
      "author": {
        "name": "Eric Chang",
        "email": "e850506@gmail.com",
        "time": "Tue Oct 27 00:44:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 00:44:46 2026 +0800"
      },
      "message": "MINOR: Close leaked resources in tests (#23929)\n\nFollow-up to #23604. Several tests create a client, metrics, or log\nmanager that the cleanup method never closes, either because a local\nvariable shadows the field closed in `@AfterEach`, or because the field\nset up in `@BeforeEach` is reassigned without closing the old instance.\nThis fixes the same pattern in `KafkaConsumerTest`, `MetricsTest`,\n`LogManagerTest`, and `WorkerTaskTest`.\n\nGenerated-by: Claude Opus 5.5\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "dd7bafb3ee4cd2a5c6052807cdc4c998e03a80df",
      "tree": "27d2569030232efe2727d8a43256c336407b7876",
      "parents": [
        "11da0602756c157d75887b529935c92ff7ee14e5"
      ],
      "author": {
        "name": "Yen-Ting Li",
        "email": "ytli.tw@gmail.com",
        "time": "Tue Oct 27 00:26:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 27 00:26:57 2026 +0800"
      },
      "message": "MINOR: Propagate ClusterInstance#deleteTopic errors and use it in more tests (#23715)\n\nFollow-up to #23699 to apply the same changes to\nClusterInstance#deleteTopic.\n\nClusterInstance#deleteTopic did not wait for the DeleteTopics result, so\na failed deletion (e.g. the topic did not exist) was either ignored or\nhidden by the waitTopicDeletion timeout. It now calls get() and wraps\nthe cause in a RuntimeException, so callers no longer need to handle\nExecutionException and InterruptedException.\n\n- Use ClusterInstance#deleteTopic in tests that delete a topic and then\nimmediately wait for the deletion.\n- Rename ClusterTestExtensionsTest#testVerifyTopicDeletion to\ntestDeleteTopic and verify that deleting a non-existent topic fails with\nUnknownTopicOrPartitionException.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "11da0602756c157d75887b529935c92ff7ee14e5",
      "tree": "c2e54be92862b9ad1fa28c9406e8fcfad9909a90",
      "parents": [
        "8de94149073a19f1c8606636823c0c8833cf8db7"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Mon Oct 26 12:14:44 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 16:14:44 2026 +0000"
      },
      "message": "MINOR: Add tests that tagged fields are written in ascending tag order (#23717)\n\nAdd tests that tagged fields are written in ascending tag order\n\nReviewers: Shay Elkin (github:shayelkin), TengYao Chi\n \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "8de94149073a19f1c8606636823c0c8833cf8db7",
      "tree": "b1b1e0198a9f09bea41e24cd4e201f78bce6b6de",
      "parents": [
        "d193373f24e550e75c685dd1e9bf8e410a988c08"
      ],
      "author": {
        "name": "Andrew Schofield",
        "email": "aschofield@confluent.io",
        "time": "Mon Oct 26 14:09:32 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 14:09:32 2026 +0000"
      },
      "message": "MINOR: Tighten up testSubscriptionAndPollFollowedByTopicDeletion (#23955)\n\nReviewing\nShareConsumerTest.testSubscriptionAndPollFollowedByTopicDeletion, it was\nclear that it could be tidied up and redundant code removed.\n\nReviewers: Sushant Mahajan \u003csushant.mahajan88@gmail.com\u003e"
    },
    {
      "commit": "d193373f24e550e75c685dd1e9bf8e410a988c08",
      "tree": "15b46bb52df8b478e6aeeb4551966e330a254fb0",
      "parents": [
        "e7a246f5a836b70afa1f876ea94faecea1364b3b"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Mon Oct 26 11:38:34 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 11:38:34 2026 +0000"
      },
      "message": "KAFKA-21344: Handle partition rotation for share fetches (#23951)\n\nA share fetch hands its record budget to partitions in the order they\nare read, so the partition read first  takes the largest share. Two\nthings decided that order earlier and together they could starve a\npartition, hence changed the behaviour.\n\nEarlier:\n- `SharePartitionManager` rotated the fetch list by `sessionEpoch %\nsize`. The client bumps the epoch on both\n  ShareFetch and ShareAcknowledge, so in a poll-and-commit loop fetch\nepochs step by two and the rotation is\n  constant. One unpaired request flips the parity, and with two\npartitions the rotation then undoes the\n  session reorder on every fetch, so the same partition is read first\nuntil the other starves.\n- `ShareSessionContext` moved served partitions to the end of the\nsession from inside the response iterator,\n  in the iteration order of the response map. That map had passed\nthrough `HashMap` copies, so when every\n  partition returned records the session ended up in hash order and the\nsame partition led every fetch.\n\nPR:\n\nThis change removes the epoch rotation from the fetch path and makes the\nsession reorder deterministic from  the fetch order. The fetch order is\npreserved through `ShareFetchUtils`, `ShareFetch` and `KafkaApis` with\n`LinkedHashMap`s. `ShareSessionContext` reorders the session in one pass\nbefore pruning the response:  partitions without records keep their\nposition at the front, and partitions with records are appended in fetch\norder rotated by one, so the partition read first is read last next\ntime. `PartitionRotateStrategy`  is reduced to that rotation and the\nunused `sessionEpoch` parameter of `fetchMessages` is dropped.\n\n`ShareConsumerFairnessTest` adds cases for the epoch parity change, for\nthe first position rotating when all partitions return records with\nexplicit and implicit acknowledgement, and for an idle partition being\nread first once it has records.\n\n`SharePartitionManagerTest` verifies the session order across subsequent\nfetches.\n\nReviewers: Abhinav Dixit \u003cadixit@confluent.io\u003e, Andrew Schofield\n \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "e7a246f5a836b70afa1f876ea94faecea1364b3b",
      "tree": "56f0981bbdab5986cdc56a2f1b84e5585821b11e",
      "parents": [
        "18f27dc7329ad8bd4a960204e7e869bf0c8a4238"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Mon Oct 26 19:24:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 11:24:08 2026 +0000"
      },
      "message": "KAFKA-21292: Update docs of MockConsumer to use RebalanceListener (#23930)\n\nUpdate MockConsumer Javadocs to reference `RebalanceListener`\n\nThe Javadocs for `MockConsumer#losePartitions` referenced\n`ConsumerRebalanceListener`, while the callbacks are handled by\n`RebalanceListener`. Update the links to point to the correct listener\ntype.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "18f27dc7329ad8bd4a960204e7e869bf0c8a4238",
      "tree": "41d1a3e2c5a1f43932467aaef8e655af4fb9518a",
      "parents": [
        "c4480afdcad1e1393d11261373d44bc58402acab"
      ],
      "author": {
        "name": "Alieh Saeedi",
        "email": "107070585+aliehsaeedii@users.noreply.github.com",
        "time": "Mon Oct 26 11:51:26 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 10:51:26 2026 +0000"
      },
      "message": "KAFKA-21251: Label global stores with their real sub-topology id in --describe --topology (#23762)\n\nGlobal stores share Streams\u0027 subtopology id counter, so the formatter\nlabels them with the lowest id not used by a subtopology instead of\nstarting at `subtopologies().size()`, which could collide.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e, TengYao Chi\n \u003cfrankvicky@apache.org\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c4480afdcad1e1393d11261373d44bc58402acab",
      "tree": "cf91ca3f111591de5ade0ed9b2d33f172b9b9276",
      "parents": [
        "b235414c8f895c7bbbb11d48aa57e36f44de12f2"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Mon Oct 26 07:31:45 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 26 07:31:45 2026 +0000"
      },
      "message": "MINOR: Deduplicate share fetch test helpers (#23953)\n\nSmall cleanup of the test helpers used to build log read results in the\nshare fetch tests.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "b235414c8f895c7bbbb11d48aa57e36f44de12f2",
      "tree": "9f7f246df92db8cf937aa7cad569cd13a0f61d27",
      "parents": [
        "5f783b0a2e6b33b17c744674969f1f333f5a788d"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Sun Oct 25 13:19:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 17:19:58 2026 +0000"
      },
      "message": "KAFKA-20925: Use request header v3 for the share group state RPCs (#23821)\n\nJira: https://issues.apache.org/jira/browse/KAFKA-20925\n\nKIP-1313:\n\nhttps://cwiki.apache.org/confluence/spaces/KAFKA/pages/406624038/KIP-1313+Client+instance+ID+in+all+request+headers\n\nThis PR adds metadata version 4.5-IV0 and new versions of the share\ngroup state RPCs that use the v3 request header: ReadShareGroupState v1,\nWriteShareGroupState v2, InitializeShareGroupState v1,\nDeleteShareGroupState v1 and ReadShareGroupStateSummary v2. The share\ngroup state persister sends the new versions only when the metadata\nversion is 4.5-IV0 or later, so brokers keep using the v2 request header\nuntil every broker in the cluster supports v3. Like the other v3 request\nheader versions, the new versions are marked unstable.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "5f783b0a2e6b33b17c744674969f1f333f5a788d",
      "tree": "f1de7a52d1f14335d32263b73af862c7230fd6e4",
      "parents": [
        "193acb15db94950ed9f56cdb6066e849e01bf578"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Mon Oct 26 02:15:24 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 17:15:24 2026 +0000"
      },
      "message": "MINOR: Test topic removal in the share group assignor (#23874)\n\nThis adds explicit tests for assignments containing a topic that a\nmember   no longer subscribes to, covering both homogeneous and\nheterogeneous   subscriptions.\n\n- testAssignWithUnsubscribedTopicHomogeneous: two members each hold one\n   partition of topic 1 and one partition of topic 2, after the group\u0027s\n   subscription changes to topic 1 only. It verifies that topic 2 is\n   revoked by\nSimpleHomogeneousAssignmentBuilder#revokeUnassignablePartitions.\n\n- testAssignWithUnsubscribedTopicHeterogeneous: member A drops topic 2\n   while member B still subscribes to it. It verifies that A\u0027s partition\n   of topic 2 is revoked and that B ends up with both partitions of\ntopic 2.\n\nTopic 1 has four partitions, with only two initially assigned. Both\ntests  verify that each member retains its existing partition of topic 1\nand  receives one of the remaining partitions.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "193acb15db94950ed9f56cdb6066e849e01bf578",
      "tree": "2bdc942d98bfca21dd5412d63754bdb109773847",
      "parents": [
        "887ce0199fda43f3cbe8fe76d0c3f96db88583d5"
      ],
      "author": {
        "name": "ryanwaha",
        "email": "118613721+ryanwaha@users.noreply.github.com",
        "time": "Sun Oct 25 21:09:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 21:09:54 2026 +0800"
      },
      "message": "KAFKA-18574 Sort test tables in JUnit summary by class and test name (#23945)\n\nThe test tables in the JUnit job summary (Failed, Flaky, Skipped,\nQuarantined and New) are printed in the order the reports are parsed,\nwhich follows the filesystem order of `glob()` and is not stable across\nenvironments. This sorts each table by class name and test name before\nrendering.\n\nThis is a continuation of #21786, which was closed as stale.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e\n\n---------\n\nCo-authored-by: Zhekai Chen \u003cwrmxs227@gmail.com\u003e"
    },
    {
      "commit": "887ce0199fda43f3cbe8fe76d0c3f96db88583d5",
      "tree": "f58c16b160510a8bb4df6e15da1d2d822b290028",
      "parents": [
        "c9da36e27076da3acb51bf75beed30d46b9f0583"
      ],
      "author": {
        "name": "Parker Chang",
        "email": "parkerhiphop027@gmail.com",
        "time": "Sun Oct 25 14:00:40 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 13:00:40 2026 +0800"
      },
      "message": "MINOR: suppress unchecked warning in WorkerTest (#23893)\n\nMocking `Transformation.class` with Mockito returns a raw type, causing\nan unchecked conversion to `Transformation\u003cSourceRecord\u003e`.\n\n```\n\u003e Task :connect:runtime:compileTestJava\nNote:\n/Users/parker/opensource/kafka/connect/runtime/src/test/java/org/apache/kafka/connect/runtime/WorkerTest.java\nuses unchecked or unsafe operations.\nNote: Recompile with -Xlint:unchecked for details.\n```\n\nAdd a local `@SuppressWarnings(\"unchecked\")`, following the existing\napproach in `TransformationStageTest.applyAndAssert`.\n\nValidation:\n- `./gradlew :connect:runtime:compileTestJava --rerun-tasks`\n- The unchecked message for WorkerTest.java no longer appeared.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "c9da36e27076da3acb51bf75beed30d46b9f0583",
      "tree": "bbe70957e9b3a5de3d8f1c06e3359634d63acaa4",
      "parents": [
        "de0a06f847e1a8fdc0b1c8d49680cd7e9a9f01e8"
      ],
      "author": {
        "name": "Yen-Ting Li",
        "email": "ytli.tw@gmail.com",
        "time": "Sun Oct 25 12:49:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 12:49:57 2026 +0800"
      },
      "message": "MINOR: Propagate ClusterInstance#createTopic errors and clean up callers (#23699)\n\nClusterInstance#createTopic and #createTopicWithAssignment did not wait\nfor the CreateTopics result, so a failed creation was hidden behind the\n60s waitTopicCreation timeout, or ignored if the topic already existed.\nThey now call get() and wrap the cause in a RuntimeException.\nInterruptedException is rethrown as InterruptException, so callers no\nlonger need to declare checked exceptions.\n\nAlso removes the now redundant throws clauses, assertDoesNotThrow\nwrappers and pass-through helpers, and a duplicate createTopic call in\nPlaintextConsumerTest#testSeek.\n\nFollow-up to #23513.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "de0a06f847e1a8fdc0b1c8d49680cd7e9a9f01e8",
      "tree": "6f78edcaa9ed2b903f6a8ee6fd95413dd395cc2f",
      "parents": [
        "647466c056c0107853cc21b51d7bd2d869ea64d9"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Sun Oct 25 00:39:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 25 12:39:38 2026 +0800"
      },
      "message": "KAFKA-21353 The incorrect parameter in internal-api-checker.md breaks the site build (#23948)\n\nThe Hugo site build fails because docs/apis/internal-api-checker.md uses\n`{{\u003c param fullDotVersion \u003e}}`, and `fullDotVersion` is not a defined\nsite param.\n\nThis PR replaces it with the hardcoded version `4.4.0`, matching how\nother docs\npages (e.g. apis/_index.md, quickstart.md, docker.md) refer to the\nrelease version.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "647466c056c0107853cc21b51d7bd2d869ea64d9",
      "tree": "60c4718215a76bddeb92396361600d9de4caa9b9",
      "parents": [
        "ab1e8164115dba0a6c5ee39945698cbc4efb6f12"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Sat Oct 24 12:40:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 12:40:01 2026 +0100"
      },
      "message": "KAFKA-21318, KAFKA-20292: Report negative partitions as unassigned in GroupSpecImpl (#23936)\n\nGroupSpec is part of the public assignor API, so custom assignors may\ncall isPartitionAssigned with a negative partition, or may have produced\na target assignment containing one. isPartitionAssigned threw an\nIndexOutOfBoundsException in both cases. Report negative partitions as\nunassigned, like other partitions which do not exist, and update the\ntests.\n\nAlso update the javadoc of GroupSpecImpl\u0027s metadata image, and assign it\nfirst in the constructor.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "ab1e8164115dba0a6c5ee39945698cbc4efb6f12",
      "tree": "c155102c70daab584f7467efd8ec70352cf4797a",
      "parents": [
        "71312a111e9fe07214a8d2849049a5baad1ca8b3"
      ],
      "author": {
        "name": "Junpei Zhang",
        "email": "1259636180@qq.com",
        "time": "Sat Oct 24 15:09:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 24 08:09:51 2026 +0100"
      },
      "message": "MINOR: docs: fix commandline typo (#23937)\n\nWhat: fixed \u0027commandline\u0027 -\u003e \u0027command-line\u0027 in basic Kafka operations\ndoc. Why: standard spelling. How verified: read the line; git diff\nreviewed. No linked issue.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\nCo-authored-by: pei711 \u003cpei711@users.noreply.github.com\u003e"
    },
    {
      "commit": "71312a111e9fe07214a8d2849049a5baad1ca8b3",
      "tree": "5b6fff6c431a32beb7976581036f455220d7cc9c",
      "parents": [
        "7ac40f4dede35c79b9c1bd27dd5a17c70e33fa6f"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Fri Oct 23 17:11:13 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 17:11:13 2026 +0100"
      },
      "message": "MINOR: Skip further reads from log for share fetches if max records reached (#23892)\n\nOn the slow path, `DelayedShareFetch.combineLogReadResponse` reuses the\ndata read in `tryComplete` and issues a second `readFromLog` for\npartitions that became acquirable only at completion. The second read\nwas issued even when the already fetched data covered `maxFetchRecords`,\nin which case `SharePartition.acquire` receives a zero budget and\nreturns empty, so the read was wasted.\n\nThe remaining record budget is now computed from the already fetched\ndata and the second read is skipped when nothing remains. Skipped\npartitions are absent from the response, as share sessions already do\nfor partitions without data, and their locks are released on the same\npath as before.\n\nReviewers: Abhinav Dixit \u003cadixit@confluent.io\u003e, Andrew Schofield\n \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "7ac40f4dede35c79b9c1bd27dd5a17c70e33fa6f",
      "tree": "8eeb6e18d21a7632564967f78c4f3a2b7b164fd6",
      "parents": [
        "1ff6c97ae4314f58ff8eff50ca3666f8f20286a2"
      ],
      "author": {
        "name": "Kevin Wu",
        "email": "kwu@confluent.io",
        "time": "Fri Oct 23 10:34:32 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 11:34:32 2026 -0400"
      },
      "message": "KAFKA-21234: FileRecords#readInto should honor slice boundaries (#23737)\n\nWhen the metadata layer (e.g. MetadataLoader) tries to read a slice of\nrecords from KRaft which is greater than\nKafkaRaftClient#MAX_BATCH_SIZE_BYTES, the RecordsIterator can return\nrecords which are past the slice (HWM). As it iterates through this\nslice of\nrecords, FileRecords#readInto reads from disk the minimum of the bytes\nuntil end of the file and the remaining space in the associated buffer.\nIn the case of the former, this can lead to a metadata error where the\nnode tries to snapshot with records past the HWM.\n\nFor the metadata error to occur, the following three pre-conditions must\nbe met:\n\n1. One committed read handed to a listener is larger than 8 MiB.\n2. The segment file has bytes after the HWM, meaning records this node\nalready appended but that aren\u0027t committed yet.\n3. For the error to actually show up, the snapshot generator emits a\nsnapshot from the resulting image before the HWM catches up.\n\nThe underlying cause is the same as KAFKA-20841. Thanks to @asdf2014\nfor working on this issue as part of\nhttps://github.com/apache/kafka/pull/22963.\n\nChange `FileRecords#readInto` which reads from the underlying file to\nthe minimum of:\n\n1. The remaining space in the associated buffer, which in the case of\nRecordsIterator is the minimum of the FileRecords\u0027 record size and\nthe batch size defined by KRaft.\n2. The end byte position of the FileRecords object, rather than the end\nof the underlying file. This ensures when a caller constructs a\nFileRecords slice of [start position, HWM), no bytes past the HWM are\nread into memory.\n\nCo-authored-by: Benedict Jin \u003casdf2014@apache.org\u003e\nReviewers: José Armando García Sancio \u003cjsancio@apache.org\u003e, Jun Rao\n\u003cjunrao@gmail.com\u003e, Zhiyan Tang \u003cztang@confluent.io\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "1ff6c97ae4314f58ff8eff50ca3666f8f20286a2",
      "tree": "d86c7f543949378c3862a05a697419e271bd3af8",
      "parents": [
        "ea6afaa4617b8168f060803c55e90f84230531e4"
      ],
      "author": {
        "name": "Evan Zhou",
        "email": "84255167+ezhou413@users.noreply.github.com",
        "time": "Fri Oct 23 08:39:40 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 09:39:40 2026 -0400"
      },
      "message": "MINOR: remove test for KIP-557 (#23925)\n\nRemoving a test for KIP-557, which is a KIP that was completely disabled\ndue to data loss, with no plans to reenable\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "ea6afaa4617b8168f060803c55e90f84230531e4",
      "tree": "7af12257ae806e637414b5bd8d8243fc0df56e15",
      "parents": [
        "b860fd33a700d18f4203d1553f878bd66059e539"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Fri Oct 23 13:58:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 13:58:42 2026 +0100"
      },
      "message": "MINOR: Track share fetch offset metadata per DelayedShareFetch instead of SharePartition (#23911)\n\nDelayedShareFetch estimates the available bytes for minBytes by\ncomparing the end offset with the cached LogOffsetMetadata of the fetch\noffset. The cache was kept on SharePartition, so it outlived the request\nwhich populated it. A partition that is read but trimmed from the\nresponse, or whose request fails, kept a valid cache entry although its\nfetch offset did not advance, which requires resets and made the read\npath depend on state left behind by earlier requests.\n\nKeep the metadata inside DelayedShareFetch for the lifetime of the\nrequest, as DelayedFetch does with FetchPartitionStatus. The retries of\ntryComplete in purgatory still avoid reading from the log, and the cache\ncan no longer go stale across requests, so the remote fetch reset is not\nneeded.\n\nAdd ShareConsumerFairnessTest to verify that two partitions with a deep\nbacklog are both served under record_limit acquire mode.\n\nThere are also cases where if a record is released where it was earlier\nfetch then request has to go through timeout to fetch data. Those\nscenarios are also handled by this fix.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e, Abhinav Dixit\n \u003cadixit@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b860fd33a700d18f4203d1553f878bd66059e539",
      "tree": "1b04979c20d6186ae6a7278a4a9b082bb2425667",
      "parents": [
        "da2224096692906b5e4398b2531fc4e810550c01"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Fri Oct 23 09:44:17 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 09:44:17 2026 +0100"
      },
      "message": "KAFKA-21318, KAFKA-20292: Compute GroupSpecImpl\u0027s assigned partitions lazily (#23883)\n\nReplace GroupSpecImpl\u0027s inverted target assignment with a BitSet of the\nassigned partitions of each topic, computed from the members\u0027 current\nassignments on the first call to isPartitionAssigned. Only the uniform\nhomogeneous assignor calls isPartitionAssigned, so other assignors no\nlonger compute it.\n\nThis makes build in TargetAssignmentBuilderBenchmark ~40% faster for\nhomogeneous groups, because isPartitionAssigned no longer looks up\npartitions in the inverted target assignment\u0027s TimelineHashMaps, which\nare slower than regular maps.\n\nIt also fixes a bug where the assignor saw the partitions of members\nremoved in the same request as still assigned. The bug is not reachable\ntoday, since we do not compute a new target assignment when a member\nleaves, only on the next heartbeat, and static member replacement keeps\nthe replaced member\u0027s partitions assigned.\n\nRemove ModernGroup\u0027s inverted target assignment, since it is no longer\nread. For share groups, it was never correct, because a partition can be\nassigned to several members of a share group, while the inverted target\nassignment holds a single member per partition.\n\nRename buildAssignment in TargetAssignmentBuilderBenchmark to\nbuildGroupSpecAndAssignment, which builds a new group spec on every\ninvocation, so that the cost of computing the assigned partitions is\nincluded, and replace buildGroupSpecWithoutOffload and\nbuildGroupSpecWithOffload with an assignorOffload parameter.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "da2224096692906b5e4398b2531fc4e810550c01",
      "tree": "f298ab9b63c85f419e756f186e72905c1639cb9b",
      "parents": [
        "d18f93f9852d4ea06f47d256df642070e986a67a"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Fri Oct 23 04:39:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 11:39:11 2026 +0900"
      },
      "message": "KAFKA-21225: Add mirror exceptions (#23828)\n\nThis patch adds new exceptions and protocol errors required by the\nCluster Mirroring feature. No exception is marked as public for now. We\ncan change that later if needed.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Luke Chen \u003cshowuon@gmail.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "d18f93f9852d4ea06f47d256df642070e986a67a",
      "tree": "cf9bebd057888c0d2bd4f29aa185acb2acc5470c",
      "parents": [
        "2d351886500fa6a9bcb297ef1acfe7a36240fa05"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 22 21:18:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 21:18:29 2026 +0200"
      },
      "message": "KAFKA-21214: [7/N] Add the partition placement of the uniform2 assignor (#23736)\n\nThe quotas of the uniform2 assignor tell how many partitions of every\ntopic each member gets. Once the steps have decided them, the assignor\nplaces the partitions.\n\nThis patch adds `PartitionPlacement`, which places the partitions of a\ntopic on its subscribers, moving as few partitions as possible. Every\nowner keeps its partitions with the lowest ids, up to its quota. The\nother partitions, those without an owner and those beyond the quota of\ntheir owner, go to the subscribers below their quota, each taking the\nlowest ids left. A partition thus moves only when its owner owns more\npartitions than its quota. `place` returns `false` when every partition\nstays with its owner, so that the members keep their current sets of\npartitions of the topic.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "2d351886500fa6a9bcb297ef1acfe7a36240fa05",
      "tree": "ddb86f94fb866270664aa3386ca47b4fde8209df",
      "parents": [
        "0290810b879fc7c965991a02288d444b0347fcba"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "sushant.mahajan88@gmail.com",
        "time": "Fri Oct 23 00:31:36 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:31:36 2026 +0530"
      },
      "message": "KAFKA-21197: Preserve original record headers in share group DLQ records. (#23659)\n\n- When record copy is enabled for a share group\u0027s DLQ,\nShareGroupDLQRecordHelper.headers() now preserves the original source\nrecord\u0027s headers on the DLQ record instead of discarding them.\n- If an original header\u0027s key collides with a DLQ context header that is\nactually added for that record — unconditionally for\ntopic/partition/offset/group/delivery-count/cause. The original header\nis dropped so the DLQ-computed value\nis the only one present.\n- Headers are now built RecordHeaders instead of hand-rolled array/size\nbookkeeping, removing a class of size/counter-mismatch risk on future\nedits.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e Reviewers:\nAndrew Schofield \u003caschofield@confluent.io\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0290810b879fc7c965991a02288d444b0347fcba",
      "tree": "4ed732fd16692e453fe3ba3f3df52a40234a36e5",
      "parents": [
        "7f231b8f37fb10af48ef6acddc6deb68ec3910f4"
      ],
      "author": {
        "name": "Doyeon Kim",
        "email": "132787602+dybyte@users.noreply.github.com",
        "time": "Fri Oct 23 01:32:22 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:32:22 2026 +0800"
      },
      "message": "KAFKA-21294 Add missing OAuth login configs to production SASL examples (#23840)\n\nThe production OAUTHBEARER examples don\u0027t work as written. Add the\nmissing login callback handler to the broker and client examples, and\nthe org.apache.kafka.sasl.oauthbearer.allowed.urls system property,\nwhich has defaulted to empty since 4.0.\n\nAlso add an integration test that runs the documented broker config with\na replicated topic.\n\nGenerated-by: Claude Opus 5.5\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "7f231b8f37fb10af48ef6acddc6deb68ec3910f4",
      "tree": "366c8861a50ec27bd5bc5b638fc599004466d727",
      "parents": [
        "a817e6f9924deea5e0dce340b9d692dabac4b2a0"
      ],
      "author": {
        "name": "Dejan Stojadinović",
        "email": "dejan2609@users.noreply.github.com",
        "time": "Thu Oct 22 17:05:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 17:05:44 2026 +0200"
      },
      "message": "KAFKA-21299: Upgrade Gradle to 9.8.2 and fetch the wrapper jar from a pinned commit (#23770)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a817e6f9924deea5e0dce340b9d692dabac4b2a0",
      "tree": "e42ef82bd25e00b1a3f91c6231f1de35f427c68e",
      "parents": [
        "349a647c47d3e1e6bb1632f629fdedf10f6efd00"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Thu Oct 22 23:10:09 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 16:10:09 2026 +0200"
      },
      "message": "MINOR: Replace try/fail/catch with assertThrows in Connect tests (#23860)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "349a647c47d3e1e6bb1632f629fdedf10f6efd00",
      "tree": "4078478ed955940d6971f955d9f29bc4b4be0754",
      "parents": [
        "a3444d8b32beee97bd0afaa267a9c4180815de60"
      ],
      "author": {
        "name": "ChickenchickenLove",
        "email": "ojt90902@naver.com",
        "time": "Thu Oct 22 18:23:07 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:23:07 2026 +0200"
      },
      "message": "KAFKA-21303: Use classic member session timeouts when reloading consumer groups (#23856)\n\nWhen a consumer group is reloaded, members using the classic protocol\nare assigned the consumer protocol session timeout. This can cause\nmembers to expire prematurely or remain in the group longer than their\nconfigured timeout allows.\n\nUpdate `GroupMetadataManager.onLoaded()` to check each member\u0027s protocol\nand use the persisted `classicProtocolSessionTimeout` for classic\nmembers. Members using the consumer protocol continue to use the\nconsumer protocol session timeout.\n\nReviewers: liuliu \u003cliuliugit@gmail.com\u003e, David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "a3444d8b32beee97bd0afaa267a9c4180815de60",
      "tree": "71d319769be56148915c1cbfb534050616fca1ae",
      "parents": [
        "dbe15eb1b7c987f02993624067f428275238305e"
      ],
      "author": {
        "name": "Omnia Ibrahim",
        "email": "o.g.h.ibrahim@gmail.com",
        "time": "Thu Oct 22 00:30:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 07:30:29 2026 +0800"
      },
      "message": "MINOR: Stop staging LICENSE/NOTICE into kafka-site content dir (#23906)\n\nFollow-up to KAFKA-21289 (#23833), which fixed `release.py stage-docs`\nfor the Hugo-based kafka-site layout.\n\nThe site-docs tar carries the repo\u0027s top-level `LICENSE` and `NOTICE` at\nits root. `stage-docs` extracts the tar with `tar xf ...\n--strip-components 1` straight into `content/en/\u003cversion\u003e/`, so those\ntwo files get dumped into the  kafka-site content tree alongside the\nactual docs. They are not docs content and do not belong there — the\nprevious release slot (`content/en/43`) has neither, and the javadoc\ntree already carries its own `legal/` license files under\n`static/\u003cversion\u003e/javadoc/`.\n\nThis was flagged on the 4.4 kafka-site PR, where `content/en/44/LICENSE`\nand `content/en/44/NOTICE` showed up as spurious additions and had to be\nremoved by hand. Without this change they return on every `stage-docs`\nrun.\n\nThis patch drops `LICENSE` and `NOTICE` from the content directory after\nextraction, mirroring the existing post-extraction cleanup that moves\n`images/` out to `static/\u003cversion\u003e/`.\n\nNo behavior change for any other staged file.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "dbe15eb1b7c987f02993624067f428275238305e",
      "tree": "affa65900875d5fc1cbf111407fc1e48c9af9c4e",
      "parents": [
        "8b5fc1bb0280f42edef6f1e39d71dca55089faa0"
      ],
      "author": {
        "name": "Christo Lolov",
        "email": "lolovc@amazon.com",
        "time": "Thu Oct 22 00:03:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 07:03:47 2026 +0800"
      },
      "message": "KAFKA-15853: [4/N] Move DynamicLogConfig and log config accessors to Java  (#23662)\n\nThis PR moves DynamicLogConfig from Scala to Java, along with its\nvalidation of local retention, remote copy lag and cordoned log dirs.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "8b5fc1bb0280f42edef6f1e39d71dca55089faa0",
      "tree": "e8a8347db47a1e92ee5af2a84e12b6f23c7998dd",
      "parents": [
        "df536bd51eaf3ab8fe03449e468c56ce331d1a5a"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Wed Oct 21 17:59:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 17:59:11 2026 +0100"
      },
      "message": "MINOR: Make share group state partition metadata unmodifiable (#23888)\n\nWrap InitMapValue\u0027s partitions and\nShareGroupStatePartitionMetadataInfo\u0027s collections in unmodifiable\nviews, so that the share group state partition metadata cannot be\nmodified through them. Add withAddedPartitions and withRemovedPartitions\nto InitMapValue to derive new values.\n\nUse them in GroupMetadataManager and remove the copies that are no\nlonger needed. combineInitMaps reuses a value when only one of the maps\nhas the topic, and initializeShareGroupState no longer deep copies the\ninitializing topics to remove partitions in place.\ninitializedShareGroupPartitions and\nsharePartitionsEligibleForOffsetDeletion no longer copy the partitions.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "df536bd51eaf3ab8fe03449e468c56ce331d1a5a",
      "tree": "fa5b209f59b3a359c74cd56f8b02f54a366e3cad",
      "parents": [
        "787c2b4d9f032890226590f9956d501812f10cbd"
      ],
      "author": {
        "name": "Lyphixia Wang",
        "email": "mieah.hhlj@gmail.com",
        "time": "Wed Oct 21 21:49:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:49:34 2026 +0200"
      },
      "message": "KAFKA-20404: Replace bulk DefaultStateUpdater atomicity excludes with field-level suppressions (#22333)\n\n## Background\n[KAFKA-20404](https://issues.apache.org/jira/browse/KAFKA-20404) tracks\nreplacing the bulk SpotBugs atomicity excludes (introduced when SpotBugs\nwas upgraded from 4.8.6 to 4.9.4) with per-field investigations. This PR\nhandles `DefaultStateUpdater$StateUpdaterThread`, the second class in\nthe series after `StreamThread` (#22320).\n\n## Investigation\nAfter removing `DefaultStateUpdater$StateUpdaterThread` from the two\nbulk excludes it appeared in\n(`AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE` at line 505 and\n`AT_NONATOMIC_64BIT_PRIMITIVE` at line 544 on trunk), SpotBugs reports\nexactly one field with warnings:\n\n- `totalCheckpointLatency` at `DefaultStateUpdater.java:100`, flagged at\nline 732 (`measureCheckpointLatency`) and line 750 (`recordMetrics`).\n\nWalking the call sites:\n- `measureCheckpointLatency` is `private` and only called from within\n`StateUpdaterThread`: `restoreTasks`, `pauseTasks`, `resumeTasks`,\n`removeUpdatingTask`, `maybeCheckpointTasks`.\n- `recordMetrics` is `private` and only called from\n`StateUpdaterThread.runOnce` (line 213).\n- All callers run on the `StateUpdaterThread` itself (the inner class\nextends `Thread`).\n\nSo `totalCheckpointLatency` is thread-confined and the SpotBugs warnings\nare false positives.\n\n## Changes\n- Remove `DefaultStateUpdater$StateUpdaterThread` from the two bulk\n`\u003cOr\u003e` blocks.\n- Add two targeted `\u003cMatch\u003e` blocks scoped to the class plus the\n`totalCheckpointLatency` field, each with a rationale comment explaining\nthe thread-confinement, one per bug pattern.\n\n## Verification\n- `:streams:spotbugsMain --rerun-tasks` clean.\n- `:streams:checkstyleMain` / `:streams:checkstyleTest` /\n`:streams:spotbugsTest` clean.\n- `:streams:test --tests \"*DefaultStateUpdater*\"` all green."
    },
    {
      "commit": "787c2b4d9f032890226590f9956d501812f10cbd",
      "tree": "e57fdc4cf6ce8c3416c178b7f761d76bae6a9e0e",
      "parents": [
        "95621a0929866db58002af50da0ec04ad0955053"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Wed Oct 21 05:55:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:55:52 2026 +0100"
      },
      "message": "MINOR: Reject reserved client instance ID in GetTelemetrySubscriptions v0 (#23825)\n\n`GetTelemetrySubscriptions` v0 only treated `ZERO_UUID` or `null` as \"no\nclient instance ID\", so a request carrying `ONE_UUID` was accepted and\ncached as a real client instance ID. Is is then rejected in\n`PushTelemetry` by `isValidClientInstanceId` since it is a reserved\nUUID.\nSo v0 now rejects reserved IDs with `INVALID_REQUEST`, matching\n`PushTelemetry` and v1 `GetTelemetrySubscriptions`.\n\nReviewers: Apoorv Mittal \u003capoorvmittal10@gmail.com\u003e"
    },
    {
      "commit": "95621a0929866db58002af50da0ec04ad0955053",
      "tree": "2e29597fc00bb1100daa7d227bc47253070f21e0",
      "parents": [
        "c1b92ad6af7697c2cf93fc92b7cfc55c3e630b45"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Wed Oct 21 10:55:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:55:21 2026 +0100"
      },
      "message": "MINOR: Break down TargetAssignmentBuilderBenchmark by builder (#23868)\n\nSplit the benchmark into separate benchmarks for building the group\nspec, the target assignment and the target assignment records. The group\nspec is benchmarked both with and without assignor offload, because\noffloading copies the group\u0027s members and target assignment so that the\nassignor can run off the coordinator thread.\n\nPopulate a ConsumerGroup and read the members, target assignment and\ninverted target assignment from it, instead of plain HashMaps. This\nmakes the benchmarks iterate over and copy the same TimelineHashMaps as\nGroupMetadataManager, which matters most for the offload group spec\nbenchmark.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "c1b92ad6af7697c2cf93fc92b7cfc55c3e630b45",
      "tree": "22440725d189dd384f668d52cbb8511f455a9f01",
      "parents": [
        "9fbcd3f76cecd04015e5d893976d9849f407af30"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Wed Oct 21 04:26:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:26:39 2026 +0200"
      },
      "message": "MINOR: Fix RackAwareStandbyPicker javadoc on how tag keys are picked     (#23889)\n\npick() keeps the tag keys in rack.aware.assignment.tags order, each only\nif a process with room still meets it together with those kept so far.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "9fbcd3f76cecd04015e5d893976d9849f407af30",
      "tree": "cba72ee99ea0c08e5c7472a12daf1b7b3edd5b0c",
      "parents": [
        "132ce7095342997d48a87026d27962a5600ba92b"
      ],
      "author": {
        "name": "I-Chau (David) Wang",
        "email": "yichaowang639@gmail.com",
        "time": "Wed Oct 21 08:53:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:53:54 2026 +0800"
      },
      "message": "MINOR: Fixed typos in comments across multiple Java classes (#23875)\n\nSupersedes #21393.\nFixed typos in comments and updated ConfigDef exception message as\nsuggested in review.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e\n\n---------\n\nCo-authored-by: Rbaddam \u003cRBaddam@walmartlabs.com\u003e"
    },
    {
      "commit": "132ce7095342997d48a87026d27962a5600ba92b",
      "tree": "aec4160d60afc840ae22fd8da49d7180c42f9fb7",
      "parents": [
        "a81c9e662bccf2305ade32863fb977bf542d76a4"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Oct 21 02:45:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:45:12 2026 +0800"
      },
      "message": "KAFKA-21305 Bump Jackson version to 2.22.4 (#23862)\n\nThere is a new jackson patch release\n\nhttps://github.com/FasterXML/jackson/wiki/Jackson-Release-2.22.4\n\nIt fixes a bunch of CVEs but I think for Kafka only CVE-2026-110879 can\nbe impactful.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a81c9e662bccf2305ade32863fb977bf542d76a4",
      "tree": "451dcdfe630d9416f532c0b691bcded1ccdd4704",
      "parents": [
        "db4700fa9ebb7f1aac2938a9e8879bb8dc8dd919"
      ],
      "author": {
        "name": "Jian",
        "email": "fujian1115@gmail.com",
        "time": "Wed Oct 21 08:25:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:25:41 2026 +0800"
      },
      "message": "MINOR: Update document for KIP-1241 (#23520)\n\nAdd a “Delay Upload” section to the tiered storage docs for the\nremote.copy.lag.ms and remote.copy.lag.bytes configs introduced by\nKIP-1241.\n\nThe section explains why segments are stored redundantly in both tiers\nduring the local retention window, how the two lag checks decide when a\nsegment becomes eligible for upload (either check satisfied, 0 means\nupload immediately, -1 follows local retention), and gives two examples:\na time-based delay and a size-based delay. It also mentions the\nbroker-level counterparts log.remote.copy.lag.ms and\nlog.remote.copy.lag.bytes.\n\nFollow-up of\nhttps://github.com/apache/kafka/pull/22394#issuecomment-5029666292.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "db4700fa9ebb7f1aac2938a9e8879bb8dc8dd919",
      "tree": "c5871914ee040ae8603bae86f9e518b4e5671c3a",
      "parents": [
        "702446e4ec28af501d348043ab9326afe9e0b8f3"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Wed Oct 21 08:04:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:04:37 2026 +0800"
      },
      "message": "KAFKA-21058 Simplify jsonNodeToInt and jsonNodeToLong (#23436)\n\nThis PR simplifies MessageUtil.jsonNodeToInt and jsonNodeToLong. The old\ncode converted non-int/long integral nodes to text and parsed them back.\nThe new code checks isIntegralNumber() and\ncanConvertToInt()/canConvertToLong() directly. The hex branch is removed\nsince it was unreachable. Behavior is unchanged except for clearer error\nmessages.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "702446e4ec28af501d348043ab9326afe9e0b8f3",
      "tree": "16dc63b65f266b3e51f5786654f3b8056abfed9e",
      "parents": [
        "6adbf155a6aeda2bbc3dcf0893dd6ffe4a333ed5"
      ],
      "author": {
        "name": "hysu",
        "email": "dame3902@gmail.com",
        "time": "Tue Oct 20 16:57:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:57:42 2026 +0800"
      },
      "message": "KAFKA-12188 Assert specific connection failure in SaslAuthenticatorTest (#23485)\n\nPreviously, `SaslAuthenticatorTest` blindly caught\n`AssertionFailedError`. This allows unrelated assertion failures in\n`checkClientConnection` to pass the test.\n\nAdded an exact message check for \"No disconnects should have occurred\"\nto ensure the tests pass only when the server explicitly drops the\nconnection, which is the expected behavior.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "6adbf155a6aeda2bbc3dcf0893dd6ffe4a333ed5",
      "tree": "a282464e0b846e1bb1f1fc577cf62f381f3b71fc",
      "parents": [
        "f45fc4bbd31c885bf6aaa19571aadc102849c0c5"
      ],
      "author": {
        "name": "S.Y. Wang",
        "email": "johnny123tw@gmail.com",
        "time": "Wed Oct 21 08:43:03 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:43:03 2026 +0800"
      },
      "message": "MINOR: Validate operation types in incremental config updates (#23822)\n\nThere are already similar checks. It will be better to add the same\ncheck accordingly.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Luke Chen\n \u003cshowuon@gmail.com\u003e"
    },
    {
      "commit": "f45fc4bbd31c885bf6aaa19571aadc102849c0c5",
      "tree": "35926f06d5908cdb761841f9b6b082484a936b98",
      "parents": [
        "46dc4b51f74c1af6791c631635265c90aa6ee27a"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Wed Oct 21 01:25:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:25:37 2026 +0800"
      },
      "message": "KAFKA-21258 Move the Docker image usage guide from docker/examples/README.md to the website docs (#23819)\n\nMove the Docker image usage guide (default configs, file input,\nenvironment variables, SASL and SSL modes) from\ndocker/examples/README.md to docs/getting-started/docker.md so it shows\non the website.\n\nThe README keeps the docker compose examples and links to the docs page.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "46dc4b51f74c1af6791c631635265c90aa6ee27a",
      "tree": "6b9790334448822ee2b6d3c33dda331da6edcd64",
      "parents": [
        "0d82450b0abc4dcefa68c0c17b4b33fc815838a6"
      ],
      "author": {
        "name": "Mykyta Bozhenko",
        "email": "21245729+cheeeee@users.noreply.github.com",
        "time": "Tue Oct 20 14:10:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 11:10:31 2026 -0700"
      },
      "message": "KAFKA-21280: Do not send stale bytes after a failed file read in SslTransportLayer.transferFrom (#23832)\n\n`SslTransportLayer.transferFrom` clears `fileChannelBuffer` before\nreading the next chunk of the file. When the read threw, or returned no\nbytes, the buffer was left cleared rather than flipped, so it still\nlooked full of the previous chunk. If bytes had already been written in\nthe same call the `IOException` was swallowed, and the next call sent\nthe stale buffer as the contents of the position that could not be read:\na read error on the segment never surfaced, and the client received a\ncorrupt batch.\n\nThis flips the buffer whether or not the read succeeds, so that it holds\nexactly what was read: nothing after a failed read or at the end of the\nfile. It also rethrows the `IOException` when bytes were already written\nin the same call: the connection is closed on it anyway, and returning\nthe bytes written only delayed the error to the next call.\n\nGenerated-by: Claude (Anthropic)\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e"
    },
    {
      "commit": "0d82450b0abc4dcefa68c0c17b4b33fc815838a6",
      "tree": "e3224fdd739539d4d0a345508b74643e0c7cc2b6",
      "parents": [
        "814cfa34ebd4b13e09b5eef7782f99bd82f1e9ea"
      ],
      "author": {
        "name": "Mykyta Bozhenko",
        "email": "21245729+cheeeee@users.noreply.github.com",
        "time": "Tue Oct 20 13:50:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 10:50:52 2026 -0700"
      },
      "message": "KAFKA-16304: Offline the log directory on a disk error in the zero-copy Fetch path (#23445)\n\nThe Fetch response is sent zero copy: the records are read from the\nsegment by `FileRecords.writeTo`, on the network thread, while the\nresponse is written to the socket. A failed read of the medium and a\nclient that went away both arrive there as a bare `IOException`, and\n`Selector` treats every one of them as a disconnect. A disk error on\nthis path therefore never offlines the log directory, unlike an I/O\nerror in the `LocalLog` operations.\n\nThis change offlines it, with the same split as elsewhere in the log:\nthe layer that sees the `IOException` reports it, and storage decides.\n\n* `LocalLog.read` gives the `FileRecords` slices it returns a transfer\n  failure handler.\n* When the transfer fails, `FileRecords.writeTo` passes the region it\n  was writing to the handler and rethrows the original exception\n  unchanged. A `ClosedChannelException` is not passed on: the file was\n  not read.\n* The handler re-reads the region on the log\u0027s scheduler, at most once\n  at a time per log directory, and calls\n  `LogDirFailureChannel.maybeAddOfflineLogDir` only if the read fails,\n  with the failed transfer attached. As the log cleaner does, the\n  directory is offlined and the error is not rethrown.\n\nThe network thread does no extra I/O on a failed send. The send itself\nis logged as a disconnect, at DEBUG; the ERROR comes from\n`LogDirFailureChannel`.\n\nThe classification is as accurate as what the JVM reports, and no more.\nNothing below the JVM is second-guessed: a transient media error that\nhas cleared by the time of the re-read is attributed to the socket, and\na read that fails for a reason other than the medium is treated as a\nstorage failure, the criterion `LocalLog` already applies. At the JVM\nlevel, the re-read of the region:\n\n* reads completely: the socket was at fault;\n* reaches the end of the file: the log was truncated concurrently (e.g.\n  the replica became a follower);\n* makes no progress: nothing can be concluded;\n* fails with `ClosedChannelException` or a subclass: the segment was\n  closed or deleted concurrently, which says nothing about the medium\n  (the reasoning of KAFKA-19571);\n* fails with any other `IOException`: the log directory is offlined.\n\nThe whole region is re-read rather than its first byte because,\ndepending on the platform, the transfer can fail anywhere within it\nwithout reporting progress: on macOS both `sendfile(2)` and `read(2)`\ndrop the partial progress of a chunk whose read fails, and on Windows\nthe JDK does not use `TransmitFile` for a non-blocking socket and falls\nback to a mapped buffer or `ReadFile`. On Linux the transfer fails at\nthe first unreadable page. The re-read reads at most what the failed\ncall was about to send. The message text of the exception is not\ninspected: it is platform specific.\n\nOnce the directory is offline its segments are closed, and the next\nFetch gets `KAFKA_STORAGE_ERROR`.\n\nConsequences worth stating:\n\n* A broker whose only log directory, or whose metadata log directory,\n  fails on this path now shuts down, as it does today for any other I/O\n  error in that directory.\n* The KRaft metadata log is read through `LocalLog` too. A read failure\n  while the leader sends it marks the raft log\u0027s directory offline, the\n  next append on the leader fails, and the raft I/O thread\u0027s fatal fault\n  handler stops the node, as it does today for an I/O error in\n  `LocalLog.read` on the metadata log.\n* The checks run on the broker\u0027s shared background scheduler (the raft\n  manager\u0027s own scheduler for the metadata log).\n* KRaft snapshots are sent through `UnalignedFileRecords`, which this\n  change does not cover; I will follow up separately.\n* On TLS listeners a read error does not reach `FileRecords` today:\n  `SslTransportLayer.transferFrom` swallows it and sends a stale buffer\n  instead (KAFKA-21280, #23832). This change takes effect on TLS\n  listeners once that is fixed.\n\nGenerated-by: Claude (Anthropic)\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e"
    },
    {
      "commit": "814cfa34ebd4b13e09b5eef7782f99bd82f1e9ea",
      "tree": "5ddc860648a22e04a0a25d55872c1759180bf20d",
      "parents": [
        "bfb092bbc0834048effce0a4aae1f1b4c8592d7d"
      ],
      "author": {
        "name": "Ritika Reddy",
        "email": "98577846+rreddy-22@users.noreply.github.com",
        "time": "Tue Oct 20 12:42:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 09:42:00 2026 -0700"
      },
      "message": "KAFKA-21181: Allow committing an empty transaction in TV2 (#23831)\n\nFollow-up to #23630, addressing\nhttps://github.com/apache/kafka/pull/23630#discussion_r4151983373.\n#23630\nreturns NOT_COORDINATOR once the broker has applied the leadership\nchange;\nthis covers a coordinator whose metadata is still behind.\n\nWith transaction V2, an EndTxn(COMMIT) at the current epoch on a\ntransaction\nin Empty, CompleteCommit or CompleteAbort state returned\nINVALID_TXN_STATE,\nwhich is fatal to the client. A coordinator that has lost leadership but\nnot\nyet applied the metadata change sees the transaction in exactly this\nstate,\nsince its partitions were added on the new coordinator, and answered\nfrom its\nstale cache.\n\nCommit an empty transaction instead, the same way an empty abort is\nhandled:\nbump the epoch, write PrepareCommit with no partitions and complete it\nwithout\nmarkers.\n\n- A stale coordinator cannot get that write replicated. The transaction\nlog\nis written with acks\u003d-1, and the new leader is in the old leader\u0027s ISR\nbut\nstopped fetching from it before the partitions were added. The client\ngets\na retriable error (NOT_COORDINATOR or COORDINATOR_NOT_AVAILABLE), looks\nup\n  the coordinator again and commits on the new one.\n- A coordinator that is up to date only sees an empty transaction when\nthe\nclient wrote nothing, since a TV2 produce always adds its partition to\nthe\n  transaction before it succeeds. Committing it is a no-op epoch bump.\n\nRetries are unchanged: CompleteCommit + Commit + Retry still returns\nNONE and\nCompleteAbort + Commit + Retry still returns PRODUCER_FENCED.\nTransaction V1\nis unchanged. A PrepareCommit with no partitions is loaded and completed\nthe\nsame way as the empty PrepareAbort that TV2 already writes.\n\nTests cover the updated state table, completing without markers, the\nretriable error when the write fails, producer ID rotation on an\nexhausted\nepoch, and loading an empty PrepareCommit from the log.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: Justine Olshan \u003cjolshan@confluent.io\u003e, Artem Livshits\n\u003calivshits@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bfb092bbc0834048effce0a4aae1f1b4c8592d7d",
      "tree": "8ad451108585520442897e9efced38889f947789",
      "parents": [
        "e149305a6589e2c22e9f24cdcc157a9daffd53e9"
      ],
      "author": {
        "name": "Andrew Schofield",
        "email": "aschofield@confluent.io",
        "time": "Tue Oct 20 14:50:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 14:50:23 2026 +0100"
      },
      "message": "KAFKA-20858: Refactor subscription state (#22996)\n\nThe SubscriptionState class in the client is a core class in the\nconsumer and share consumer. It keeps track of all manner of consumer\nstate such as subscribed topics, assigned partitions and fetch\npositions.\n\nAlthough there are some concepts which are common to consumer group and\nshare group subscription state management, there are also many\ndifferences.\n\nThis task refactors the subscription state to remove this false coupling\nbetween group types, and give share groups better control over the\ntopics included in the metadata. It\u0027s a largely mechanical change.\n\nReviewers: Lianet Magrans \u003clmagrans@confluent.io\u003e"
    },
    {
      "commit": "e149305a6589e2c22e9f24cdcc157a9daffd53e9",
      "tree": "3559ea570bd51a3299be1e2612d6f6c72de92172",
      "parents": [
        "8e46092edac3e837972ee13b40dcc149e7113ae7"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Tue Oct 20 12:02:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 11:02:45 2026 +0100"
      },
      "message": "KAFKA-21288: Add MirrorPartitionState (#23830)\n\nThis patch add the `MirrorPartitionState` enum that is used by the\nvarious internal components to drive the mirror partition state. Note\nthat this is not exposed to clients.\n\nReviewers: Luke Chen \u003cshowuon@gmail.com\u003e, Christo Lolov\n \u003clolovc@amazon.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "8e46092edac3e837972ee13b40dcc149e7113ae7",
      "tree": "005687e1e2e72aaa80e510db6646731886f55876",
      "parents": [
        "f2f91b11706804181cbee2e0fd9807b18e92dad6"
      ],
      "author": {
        "name": "Dejan Stojadinović",
        "email": "dejan2609@users.noreply.github.com",
        "time": "Tue Oct 20 10:42:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 10:42:24 2026 +0200"
      },
      "message": "KAFKA-12744: Upgrade argparse4j from 0.7.0 to 0.9.0 (#23796)\n\n- Replace ArgumentParsers.newArgumentParser(...) with the builder API\nArgumentParsers.newFor(...)...build() in core, tools, shell, generator,\ntrogdor and connect-mirror. In StorageTool and KafkaDockerWrapper the\nold 4-arg call is reduced to newFor(..).fromFilePrefix(\"@\").build(),\nsince addHelp(true) and prefixChars(\"-\") are the builder defaults.\n- HelpScreenException moved from argparse4j.internal to\nargparse4j.helper; update imports accordingly.\n- Update the argparse4j version in LICENSE-binary.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "f2f91b11706804181cbee2e0fd9807b18e92dad6",
      "tree": "a1433808c9aec2939abc7e19085e8a0244e6d788",
      "parents": [
        "a0d918c5b582588f9da7124d0f78409063b07517"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Tue Oct 20 02:11:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 02:11:49 2026 +0800"
      },
      "message": "MINOR: Update documentation version references to 4.4 (#23869)\n\nUpdate outdated documentation version references to 4.4. Adjust the\ntiered storage example to use the test fixtures JAR, as\n`LocalTieredStorage` has moved to `src/testFixtures`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a0d918c5b582588f9da7124d0f78409063b07517",
      "tree": "4381fd4e426932dae1968da70c548ad5a6c3e714",
      "parents": [
        "cf93eefad7aae3eb6e5e2d4afd7688f84874bc2e"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Mon Oct 19 22:02:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 22:02:41 2026 +0530"
      },
      "message": "KAFKA-21307: Add share group DLQ setup to ShareConsumeBenchSpec (#23867)\n\nAdd two optional fields to ShareConsumeBenchSpec:\n\n- shareGroupDLQConfig: the DLQ topic name, its PartitionsSpec and\ncopyRecordEnable. Before the consumers start, ShareConsumeBenchWorker\ncreates the DLQ topic, enables it for use as a DLQ, and sets the DLQ\ntopic name and copy record configs on the share group.\n- recordAcknowledger: a RecordAcknowledger, following the\nRecordProcessor pattern, that returns the AcknowledgeType for each\nconsumed record. RandomRecordAcknowledger is the first implementation.\nIts counts are reported in the worker status.\n\nrecordAcknowledger makes the consumers use explicit acknowledgement mode\nand cannot be combined with acknowledgeType.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cf93eefad7aae3eb6e5e2d4afd7688f84874bc2e",
      "tree": "3eeae374f7eb01a710d78d476b88b367f2ff8e6b",
      "parents": [
        "efe988d1084b61bbe1c35d4a1775b38434d43573"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Mon Oct 19 23:39:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 23:39:43 2026 +0800"
      },
      "message": "KAFKA-21293 SubscriptionState#unsubscribe should not reset the rebalance listener (#23852)\n\n`SubscriptionState#unsubscribe()` resets the listener context to\n`NULL_LISTENER`, so calling `unsubscribe()` silently drops the user\u0027s\nrebalance listener.\n\nKIP-1306 only states that passing null removes the current listener. The\nprevious implementation also did not reset the listener on\nunsubscribe().\n\nReviewers: ChickenchickenLove \u003cojt90902@naver.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "efe988d1084b61bbe1c35d4a1775b38434d43573",
      "tree": "ae5566ed9a2ea918d383ad7d64cb1bc7bc39fb44",
      "parents": [
        "f568b7b2c8802e6635b4d8df93ede88e55a2b84d"
      ],
      "author": {
        "name": "gomudayya",
        "email": "gomudayya@gmail.com",
        "time": "Tue Oct 20 00:23:18 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 17:23:18 2026 +0200"
      },
      "message": "KAFKA-20391: Improve types returned by the Connect REST API (#22001)\n\n- Replace generic `Response` return types with specific types in\n`LoggingResource` and `ConnectorsResource` to improve OpenAPI spec\ngeneration\n- Update corresponding unit tests\n- Endpoints returning non-200 status codes (201, 202, 204) or using\nconditional status codes were left unchanged as they require `Response`\nfor status code control.\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, Murali Basani \u003cmuralidhar.basani@aiven.io\u003e"
    },
    {
      "commit": "f568b7b2c8802e6635b4d8df93ede88e55a2b84d",
      "tree": "25de853604341da3bb5071842a533e271ec2990a",
      "parents": [
        "2b5dfe22cdb7be8ef5d32296f77687ee32e9182e"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Mon Oct 19 13:15:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 13:15:29 2026 +0200"
      },
      "message": "MINOR: Share one empty array between empty IntLists (#23861)\n\nA uniform2 `IntList` created with a capacity of 0 allocates an empty\narray, and the balance step creates up to three such lists per member,\nmost of which stay empty. This patch makes these lists share one empty\narray, which they replace with their own at their first add.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2b5dfe22cdb7be8ef5d32296f77687ee32e9182e",
      "tree": "77face9a91165566882a3c17de536a80bceca04e",
      "parents": [
        "f90822763913e10a02478c235b34a5ea9f36856e"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Mon Oct 19 03:41:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:41:17 2026 +0200"
      },
      "message": "KAFKA-20999: [1/N] Add RackAwareStandbyPicker for rack-aware standby placement (#23790)\n\nFirst part of rack-aware standby placement for streams groups. It adds\nRackAwareStandbyPicker, which the sticky assignor and balanced assignor\nwill use to place standbys by rack.aware.assignment.tags. Nothing calls\nit yet; the next PR wires it into StickyTaskAssignor.\n\nA process meets a tag key when it has a value for it that no holder of\nthe task has yet. For the next standby of a task, pick() chooses the\nconditions: every tag key with an unused value if a process with room\nmeets them all; otherwise, the tag keys in configured order, each kept\nonly if a process with room still meets it together with those kept so\nfar. It returns the conditions together with the least-loaded process\nwith room that meets them, or null once no process with room can make\nthe task more diverse.\n\nThe processes sit in a tree with one level per tag key, so a pick does\nnot scan every combination of tag values. Each node keeps the\nleast-loaded process with room below it, and its children are ordered by\nit. The caller reports load and room changes with updated() and\nupdatedAll(), which repair only the affected paths.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "f90822763913e10a02478c235b34a5ea9f36856e",
      "tree": "11019959907781d596b0409c901a87f19d87574e",
      "parents": [
        "cc8baadc9f0363f2bdfe68a2f1cd8dbe4372d282"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Mon Oct 19 00:56:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 06:56:45 2026 +0800"
      },
      "message": "KAFKA-21257 Document tokenless OAUTHBEARER login for validate-only brokers (#23818)\n\nRef : https://issues.apache.org/jira/browse/KAFKA-21257\n\nA broker that only validates OAUTHBEARER tokens still runs a JAAS login\nat startup. With no login callback handler configured, the default\nOAuthBearerUnsecuredLoginCallbackHandler handles that login.\n\nSince KAFKA-21143, it creates no token unless an unsecuredLogin* option\nis set, so ssl.* options for JWKS TLS trust are fine. Some users rely on\nthis, but authentication-using-sasl.md never described it.\n\nThis PR adds a \"Tokenless login for validate-only brokers\" section\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "cc8baadc9f0363f2bdfe68a2f1cd8dbe4372d282",
      "tree": "89ed3c8dc7f5f12e9b65664f5c4de11a5aa1d2db",
      "parents": [
        "65566690ca1ddb584388c1026e2ff6673e9c6f19"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Sun Oct 18 23:10:49 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 22:10:49 2026 +0800"
      },
      "message": "MINOR: Fix login callback config cleanup in SaslAuthenticatorTest (#23746)\n\nSaslAuthenticatorTest#testServerLoginCallbackOverride puts a\nlistener-prefixed sasl.login.callback.handler.class to check that it is\nrejected without a mechanism prefix, but then removes the\n\"plain.\"-prefixed  key instead. That key had already been removed by the\nprevious step, so  the listener-prefixed key stays in the config for the\nrest of the test.\n\nThis does not change what the test verifies. After the listener prefix\nis  stripped, the server looks up the handler only with the mechanism\nprefix,  so the leftover key is ignored and the final step still checks\nthe  listener and mechanism prefixed override.\n\nThis removes the listener-prefixed key instead, and replaces the three\ntry/fail/catch blocks in this test with assertThrows, keeping the\nexpected  exception type and the failure messages. It also converts the\ntry/fail/catch  block in testMissingUsernameSaslPlain to assertThrows.\n\nReviewers: liuliu \u003cliuliugit@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "65566690ca1ddb584388c1026e2ff6673e9c6f19",
      "tree": "6e84dc380897d3dc9fa4518854672c60b3f79701",
      "parents": [
        "59046aecc31bd1bed83a434c0db61aea95fd644a"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Fri Oct 16 17:33:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 17:33:10 2026 -0400"
      },
      "message": "MINOR: Don\u0027t block on position() when advancing standby restored offsets (#23841)\n\nFollow-up to KAFKA-14302 (#23298). `maybeAdvanceStandbyRestoredOffset`\ncalled the blocking `restoreConsumer.position()`, which can wait up to\n`default.api.timeout.ms` while the position is unresolved. It runs on\nevery restore loop for every standby changelog, including paused ones\nwhile actives restore, so a single standby could stall the state-updater\nthread. Both calls now use `position(partition, Duration.ZERO)`, and a\ntimeout is logged at debug and retried on the next loop.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "59046aecc31bd1bed83a434c0db61aea95fd644a",
      "tree": "a2e72e3315744539ad73a877c9bd753e1a090beb",
      "parents": [
        "b35ed0ec911fb6a5a4a31e8481cd81ed5e040bf6"
      ],
      "author": {
        "name": "Omnia Ibrahim",
        "email": "o.g.h.ibrahim@gmail.com",
        "time": "Fri Oct 16 18:14:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 01:14:47 2026 +0800"
      },
      "message": "KAFKA-21289 Fix release.py stage-docs for Hugo kafka-site (#23833)\n\nChanges\n\n- swaps the sentinel check to `hugo.yaml` instead of `owered-by.html`\n- splits the extraction: markdown goes to `content/en/\u003cversion\u003e`,\njavadoc goes to `static/\u003cversion\u003e`\n- the site-docs tar bundles images in alongside the markdown, so those\nget pulled out of `content/en/\u003cversion\u003e/images` and moved into\n`static/\u003cversion\u003e/images` right after extraction — otherwise they’d sit\nin the wrong place. NOTE: I hardcoded `images` as the one directory that\nneeds pulling out of `content/\u003cversion\u003e` — based on what’s actually in\nthe tar now and what the existing slots look like. Any future doc change\nbundling some other asset directory into the tar won’t be caught by\nthis.\n\n- fixed a small pre-existing bug while I was in there: the sentinel\nfailure message was missing an `f` prefix, so it was printing\n`{kafka_site_repo_path}` literally instead of the actual path\n\nTesting\n- Ran stage-docs locally twice against `4.4.0`, staged into a real\nHugo-based kafka-site clone. `content/en/44` and `static/44` come out\nmatching exactly what the `4.0`, `4.3.0`, and `4.3.1` slots already look\nlike — same top-level structure. `4.4.0` docs are published as part of\n[kafka-site#925](https://github.com/apache/kafka-site/pull/925 )\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b35ed0ec911fb6a5a4a31e8481cd81ed5e040bf6",
      "tree": "309bf18f91b8564066942e0e1c38f355e235d1bb",
      "parents": [
        "f6f4cc09335ac8f51cb0d88d8fbe62d0bd303e8f"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Fri Oct 16 19:12:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 01:12:10 2026 +0800"
      },
      "message": "KAFKA-21214: [6/N] Add the balance step of the uniform2 assignor (#23735)\n\nuniform2 decides how many partitions of every topic each member gets,\nits quotas, in three steps. The first two give every extra partition to\na distinct subscriber of its topic, but they can leave a member with an\nassignment much larger than another subscriber of one of its topics.\n\nThis patch adds the balance step, `BalanceExtraPartitions`, which the\nassignor runs after the other two steps in a later patch. The step\napplies a single rule until it no longer applies. The member with the\nlargest assignment, among those with an extra partition that can move,\ngives one to the smallest member that can take it, which is a subscriber\nof the topic, with no extra partition of the topic and at least two\npartitions smaller. Every move lowers the sum of the squares of the\nassignment sizes, so the step ends, and it ends exactly when no extra\npartition can move to a subscriber of its topic at least two partitions\nsmaller.\n\nChanges:\n- The givers wait in a heap, the largest first, and a giver without a\n  receiver is parked until a move may give it one. The step ends once\n  the largest giver is less than two partitions above the smallest\n  member.\n- The giver gives the extra partition whose move revokes the fewest\n  partitions. On equal assignment sizes, a giver with a free extra\n  partition gives first, and a receiver owning more than the minimum\n  quota of a topic with extra partitions receives first, since only\n  such a receiver can keep one more of its partitions.\n- To find receivers quickly, each giver counts its extra partitions per\n  cohort, for the topics that the cohort subscribes to. The counts are\n  kept for every member when they fit, and otherwise for one member at\n  a time. A constructor forces either way, and a test checks that both\n  give the same quotas on random groups.\n- When all assignment sizes are within one of each other, nothing can\n  move, and the step returns without building any state.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "f6f4cc09335ac8f51cb0d88d8fbe62d0bd303e8f",
      "tree": "d5a8f75c6ec933ae5160d51c7169ecd56dab1b00",
      "parents": [
        "34f859e2ceac6d75a488508939c41687db585651"
      ],
      "author": {
        "name": "Kuan-Po Tseng",
        "email": "brandboat@gmail.com",
        "time": "Sat Oct 17 00:55:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 00:55:37 2026 +0800"
      },
      "message": "KAFKA-21153 Add physical log deletion tests to DeleteTopicTest (#23827)\n\nAdd dedicated physical log deletion coverage to `DeleteTopicTest`,\ncovering both normal cleanup and cleanup of pending `-delete`\ndirectories after a broker restart. This complements the existing\ncoverage in `ProducerSendWhileDeletionTest#verifyTopicDeletion`.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "34f859e2ceac6d75a488508939c41687db585651",
      "tree": "4c2a4cefacf6a4ebd1aef6698680b5e060ee21ef",
      "parents": [
        "e09cc6332101a976c738d38041e945402bc941e1"
      ],
      "author": {
        "name": "KhyatiVaghamshi",
        "email": "khyati220@gmail.com",
        "time": "Fri Oct 16 05:40:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:40:53 2026 +0200"
      },
      "message": "KAFKA-21268: Replace temp file handler with JUnit 5 @TempDir in server, shell, and storage tests (#23810)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, liuliu \u003cliuliugit@gmail.com\u003e\nCo-authored-by: khyativ \u003ckvaghamshi@salesforce.com\u003e"
    },
    {
      "commit": "e09cc6332101a976c738d38041e945402bc941e1",
      "tree": "0e9311fd8d878cdc93e20c29afae22256b7b148b",
      "parents": [
        "f7a6dfe076929c3b761bfb9fbb97f786ff9503e8"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Fri Oct 16 00:58:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 08:58:07 2026 +0100"
      },
      "message": "KAFKA-20684 [8/N]: Migrate clients tests to RebalanceListener (#23108)\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "f7a6dfe076929c3b761bfb9fbb97f786ff9503e8",
      "tree": "67c40b58204d07952b04ff6901df593b9a987ae7",
      "parents": [
        "b2f85364e44abfea2bb1937d894b36edae80b968"
      ],
      "author": {
        "name": "Andy Huang",
        "email": "ky052632@gmail.com",
        "time": "Fri Oct 16 07:16:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 07:16:28 2026 +0800"
      },
      "message": "MINOR: Migrate PlaintextConsumerAssignorsTest to Java (#23708)\n\nMigrates `PlaintextConsumerAssignorsTest` from Scala in `core` to Java\nin `clients-integration-tests` using `ClusterTestExtensions`, as part of\nKAFKA-19042.\n\nPreserves all nine assignor scenarios and reuses the existing\n`ConsumerAssignmentPoller` and `ClientsTestUtils` helpers. The group\nassignment checks now fail fast when a poller thread hits an exception,\ninstead of waiting for the timeout. Pollers and consumers are closed\nafter each test. Removes the original Scala test.\n\nReviewers: Chia-Ping Tsai\n\u003c[chia7712@gmail.com](mailto:chia7712@gmail.com)\u003e"
    },
    {
      "commit": "b2f85364e44abfea2bb1937d894b36edae80b968",
      "tree": "eebf590dc06bfb0382bb0dd3167ea6fec60ab603",
      "parents": [
        "dfd3dcab0756a8574105db4c159ed19d500bcef7"
      ],
      "author": {
        "name": "Ramu",
        "email": "kramu.k7@gmail.com",
        "time": "Fri Oct 16 03:18:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 17:48:27 2026 -0400"
      },
      "message": "KAFKA-14302: Advance restored offsets after changelog catch-up (#23298)\n\n## What is the bug?\n\nWhen restoring an empty changelog with a non-zero end offset,\nProcessorStateManager does not update the restored offset because no\nrecords are applied.\n\nAs a result, changelogOffsets() can report 0 even though restoration has\ncompleted at a higher offset. This can cause Kafka Streams to\nincorrectly report recovery lag for the task.\n\n## What does this change do?\n\nThe fix advances the restored offset once changelog restoration has\nactually reached its known boundary.\n\nThe implementation preserves the existing offset semantics and ensures\nthat the restored offset does not move backwards.\n\n## Testing\n\nAdded regression coverage for:\n\n* An empty changelog with a high end offset.\n* Task lag calculation after changelog restoration.\n* Active and standby restore scenarios.\n\nExisting relevant Streams tests also pass.\n\nReviewers: Alan Lau (github:alanlau28), Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "dfd3dcab0756a8574105db4c159ed19d500bcef7",
      "tree": "c973110b66eabab0e3e504d39b83e232bdb28e8a",
      "parents": [
        "383388b6700c9ca7d5dea2e50f425698853eef6f"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Thu Oct 15 16:37:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 16:37:14 2026 -0400"
      },
      "message": "KAFKA-21253: Always clear record collector offsets in closeDirty (#23791)\n\n`RecordCollectorImpl.closeDirty()` aborts the open transaction before\ncalling `close()`, which clears the collector\u0027s changelog offsets. If\nthe abort throws, `close()` is skipped and the offsets are kept. This\nhappens with an `IllegalStateException` after a timed-out\n`commitTransaction()`. The revived task reuses the collector, so if it\nis closed clean while its wiped store is still restoring, those stale\noffsets are checkpointed. The next restore then skips the missing\nrecords.\n\nThis change moves `close()` into a `finally` block so the offsets are\nalways cleared. It also logs the abort failure at ERROR before\nrethrowing. The caller still swallows the exception, and before this\nchange it was only logged at DEBUG, without the exception.\n\n`CommitTimeoutDirtyCloseIntegrationTest` uses the fault proxy to\nreproduce this. A delayed EndTxn leaves a commit pending, so the abort\nfails. A later `ILLEGAL_GENERATION` on `TxnOffsetCommit` migrates the\nthread, and the restoring task is closed clean.\n\nThe associated integration test replicates the issue and without the fix\nin this PR it fails.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "383388b6700c9ca7d5dea2e50f425698853eef6f",
      "tree": "b4471e455bd9e950251bd596e51b6ee5097d6c87",
      "parents": [
        "3d1e3f5547ea34b0777b50ab046de36046c91746"
      ],
      "author": {
        "name": "Pranav Siby",
        "email": "psiby@confluent.io",
        "time": "Fri Oct 16 01:27:23 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:57:23 2026 +0800"
      },
      "message": "KAFKA-15976 Follow-up fixes for initial offsets on connector creation (#23783)\n\nFollow-up to #23268, addressing the review comments left after it was\nmerged:\n\n- Leave `initial_offsets` out of the request when it is null, so a\nleader or extension that doesn\u0027t know the field doesn\u0027t reject it.\n- Re-read the connector configs before checking whether the connector\nexists, like the offsets endpoints do.\n- If another request creates the connector while the offsets are being\nwritten, don\u0027t wipe them, since they now belong to that connector.\n- Keep a single `CreateConnectorRequest` constructor.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "3d1e3f5547ea34b0777b50ab046de36046c91746",
      "tree": "d7baae51ab263fbe12aff0b2dac346371ecc353e",
      "parents": [
        "2f1f34df2fd3bf6e153ffc43a14fe67dfc3fb12f"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 15 13:29:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:29:52 2026 +0200"
      },
      "message": "KAFKA-21214: [5/N] Move the steps of the uniform2 assignor to a subpackage (#23823)\n\nThe steps of the uniform2 assignor and the data classes they work on\nshare one package, so only their names tell them apart. This patch moves\nthe steps to the `steps` subpackage. Java has no sub-package visibility,\nso the data classes and their members that are not private become\npublic.\n\nChanges:\n- Move `KeepStickyExtraPartitions` and `AssignRemainingExtraPartitions`,\n  and their tests, to `uniform2.steps`. The two classes, their\n  constructors and `run` become public.\n- Make `IndexedGroup`, `IndexedGroup.Builder`, `CurrentAssignment` and\n  `Quotas` public, with all their members that are not private.\n- Make the test fixture `QuotasFixture` public, with all its members\n  that are not private.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "2f1f34df2fd3bf6e153ffc43a14fe67dfc3fb12f",
      "tree": "50d8081e7f94f2a73a26d6651ce0da8e1f2d7edb",
      "parents": [
        "4abb5a26e44a46dac70f7c1b567bf5841e30d1fa"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Thu Oct 15 10:36:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:36:28 2026 +0200"
      },
      "message": "KAFKA-21111 [2/N]: Grant tasks at once to members that cannot be warmed up (#23784)\n\nThis is the second change of the series that makes the warm-up task\nrefiner (KAFKA-20665) compatible with clients that speak version 0 of\nthe streams group heartbeat (see KAFKA-21111), on top of #23761.\n\nA warm-up task can only complete a migration if the coordinator observes\nthe target owner restoring it, which a member that heartbeats with\nversion 0 never allows, as it does not report task offsets. When the\ntarget assignment moves a stateful task to such a member, the refiner no\nlonger stages the migration. It lets the target assignment through for\nthat task, so the current owner revokes it and the target owner takes it\nover, as it would without a refiner.\n\nThe check sits after the readiness check, so that a move between two\nmembers of one process still happens inside the instance, and before the\nanalysis of the incumbent and of the copies, so that a caught-up copy on\nanother process is not promoted as a temporary owner. That detour would\nonly postpone the same cold grant and add a second hand-over. The\nversion of the current owner is irrelevant: a member that processes a\ntask is hot by definition, and keeps it while a target owner that can be\nwarmed up restores it. If the target owner already holds a standby task\nof the task, the client recycles it into the active task, so the grant\nis warm in the common case, even though the coordinator cannot see that.\n\nThe refiner is not the default yet, so this change is not live. The\ntests cover the grant, the missing detour through a caught-up copy, and\na current owner of version 0 that keeps its task.\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "4abb5a26e44a46dac70f7c1b567bf5841e30d1fa",
      "tree": "6bb74afc00755fc0c6bccd22df8c47e4a60f7d38",
      "parents": [
        "292ad36280a55f4405033eb212451ea95513c6c1"
      ],
      "author": {
        "name": "Kuan-Po Tseng",
        "email": "brandboat@gmail.com",
        "time": "Thu Oct 15 15:58:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:58:34 2026 +0800"
      },
      "message": "KAFKA-21153: Remove the wait file cleanup logic in ClusterInstance#waitTopicDeletion (#23800)\n\nClusterInstance#waitTopicDeletion waits for asynchronous physical file\ncleanup, forcing tests to shorten `log.initial.task.delay.ms` and\n`log.segment.delete.delay.ms` to avoid timeouts. This wait is\nunnecessary for tests that only require logical topic deletion. Physical\ncleanup should be verified by dedicated tests, allowing other tests to\nuse the default configuration.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "292ad36280a55f4405033eb212451ea95513c6c1",
      "tree": "e23d7b7ce1587e956c991750c915c6e31753048b",
      "parents": [
        "8c012276cf118c88a99665a36112e09181459a90"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 15 09:46:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 09:46:26 2026 +0200"
      },
      "message": "KAFKA-21214: [3/N] Add the quotas and the first two steps of the uniform2 assignor (#23733)\n\nuniform2 decides how many partitions of every topic each member gets,\nits quotas, in three steps, and then places the partitions. A topic with\nP partitions and N subscribers has a minimum quota of P / N partitions,\nand its P % N extra partitions go to as many distinct subscribers.\n\nThis patch adds the quotas and their first two steps:\n- `Quotas` holds the minimum quota and the extra partitions of every\n  topic, the members getting the extra partitions, and the assignment\n  sizes of the members. The steps give the extra partitions and move\n  them.\n- `KeepStickyExtraPartitions`: a member owning more than the minimum\n  quota of a topic keeps one of its extra partitions, the members with\n  the smallest assignments first when the owners outnumber the extra\n  partitions.\n- `AssignRemainingExtraPartitions` gives the extra partitions that\n  nobody kept, one at a time, to subscribers without one of the topic,\n  among the ones with the smallest assignments: the topics with the\n  fewest subscribers first, and round robin within a cohort. It returns\n  without allocating anything when the owners kept them all.\n- `IntPair` packs two ints in a long, so that pairs sort in a `long[]`\n  or a `LongHeap` without allocating.\n- A step is created with what it works on and run once; the assignor\n  runs the steps in order in a later patch.\n- `QuotasFixture` holds the indexed group, the current assignment and\n  the quotas of a group for the tests of the steps.\n\nThe balance step comes in a later patch.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "8c012276cf118c88a99665a36112e09181459a90",
      "tree": "143d7cf4b90e978df68f0ca4ecd1b4a227fee706",
      "parents": [
        "e2c58a0163c89d00cebc877fbdd81d4267be774f"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Thu Oct 15 16:43:33 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:43:33 2026 +0800"
      },
      "message": "MINOR: Replace try/fail/catch with assertThrows in remaining Streams tests (#23636)\n\nReplace the remaining straightforward try/fail/catch exception\nassertions in the Streams tests with `assertThrows`, following #23277\nand #23389.\n\nIn #23389, streams.internals, streams.state.internals,\nstreams.processor.internals, and streams.integration were left unchanged\nbecause they overlapped with in-flight Hamcrest removal work.\nThe referenced PRs (#23307, #23386, and #23387) have since been merged,\nand KAFKA-21028 has been resolved. This PR covers the remaining\nstraightforward assertions in streams.state.internals,\nstreams.processor.internals, and streams.integration, along with those\nin streams.kstream.internals, streams.processor, and streams/test-utils.\n\nWhere the catch block checked the exception message, the `assertThrows`\nreturn value is used to keep that check. Descriptive `fail()` messages\nare kept, and generic ones are replaced with messages that name the\nrejected operation. Unused `fail` imports are removed.\n\nIn `FineGrainedAutoResetIntegrationTest`, only `builder.build()` is\nwrapped, because the overlapping source is rejected when the topology\nis built, not when `stream()` is called. In\n\n`TimeOrderedKeyValueBufferTest#shouldNotRestoreUnrecognizedVersionRecord`,\nthe `finally` block that cleans up the buffer is kept.\n\nLeft unchanged:\n- `GlobalStateTaskTest`: `fail()` is conditional on a test parameter,\n  so it is not a direct try/fail/catch.\n- `KafkaStreamsTest#shouldThrowTopologyExceptionOnEmptyTopology`: same\n  reason as in #23389 (the `fail()` sits inside try-with-resources).\n- `TimeOrderedKeyValueBufferTest` still imports `fail` for the\n  `default` branch of a switch in a callback.\n\nTesting:\n\n```sh\n./gradlew :streams:checkstyleTest :streams:spotlessCheck \\\n    :streams:test-utils:checkstyleTest :streams:integration-tests:checkstyleTest\n./gradlew :streams:test \\\n    --tests org.apache.kafka.streams.state.internals.CompositeReadOnlyWindowStoreTest \\\n    --tests org.apache.kafka.streams.state.internals.CompositeReadOnlySessionStoreTest \\\n    --tests org.apache.kafka.streams.state.internals.MaybeTest \\\n    --tests org.apache.kafka.streams.state.internals.TimeOrderedKeyValueBufferTest \\\n    --tests org.apache.kafka.streams.processor.internals.ProcessorContextImplTest \\\n    --tests org.apache.kafka.streams.processor.UsePartitionTimeOnInvalidTimestampTest \\\n    --tests org.apache.kafka.streams.kstream.internals.KStreamPeekTest \\\n    --tests org.apache.kafka.streams.kstream.internals.KTableTransformValuesTest\n./gradlew :streams:test-utils:test --tests org.apache.kafka.streams.MockProcessorContextTest\n./gradlew :streams:integration-tests:test \\\n    --tests org.apache.kafka.streams.integration.FineGrainedAutoResetIntegrationTest\n```\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "e2c58a0163c89d00cebc877fbdd81d4267be774f",
      "tree": "d6bc1ca43f99fa5e2c31799054357f11ed853ca0",
      "parents": [
        "e58847b4d46869704e87b071eb2b8b96cffe93a3"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Thu Oct 15 03:23:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:23:20 2026 +0900"
      },
      "message": "KAFKA-21223: Add topic-level configs (#23782)\n\nThis patch adds topic-level configurations for the Cluster Mirroring\nfeature (KIP-1279) and related unit tests. Note that these properties\nare temporarily defined as internal to avoid exposing to users.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Luke Chen\n\u003cshowuon@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "e58847b4d46869704e87b071eb2b8b96cffe93a3",
      "tree": "4f511f20c3ccf8b4ccd9abf7d537be5269252807",
      "parents": [
        "ca08bdc233e04c0786834771585c1f90d4eb4f2b"
      ],
      "author": {
        "name": "Yen-Ting Li",
        "email": "ytli.tw@gmail.com",
        "time": "Thu Oct 15 04:17:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 04:17:52 2026 +0800"
      },
      "message": "MINOR: Prevent swallowing exceptions in MetricsDuringTopicCreationDeletionTest (#23704)\n\n`createAndDeleteTopics()` wrapped `createTopic()` and `deleteTopic()` in\n`catch (Exception ignored)`. The original Scala test tolerated failures\nbecause `deleteTopic` did not wait for deletion to complete.\n`ClusterInstance.deleteTopic` now does, so the catch is no longer needed\nand only hides `InterruptedException`.\n\nThis PR removes the try/catch and lets exceptions propagate.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "ca08bdc233e04c0786834771585c1f90d4eb4f2b",
      "tree": "23e1a53822709c7f3fb7d78152c87f30bb3c3fd6",
      "parents": [
        "27801d794b4bcb3fad6d2cff3a3d2137ec779174"
      ],
      "author": {
        "name": "hysu",
        "email": "dame3902@gmail.com",
        "time": "Wed Oct 14 12:57:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 03:57:13 2026 +0800"
      },
      "message": "MINOR: Limit ConsoleConsumerTest to KRaft mode only (#23690)\n\nFollow-up to #23684. The `@ClusterTest` methods in `ConsoleConsumerTest`\ndo not depend on the controller deployment mode, so running them in both\n`KRAFT` and `CO_KRAFT` is redundant. This patch restricts the class to\n`Type.KRAFT` via `@ClusterTestDefaults`.\n\nReviewers: Andy Huang \u003cky052632@gmail.com\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "27801d794b4bcb3fad6d2cff3a3d2137ec779174",
      "tree": "38779ca861f7a9106e2d020a9b41039625955d18",
      "parents": [
        "b7665039a5b8dfa157fe1ea588fa8c7291b89a5d"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Wed Oct 14 21:40:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 03:40:02 2026 +0800"
      },
      "message": "KAFKA-21222 Add broker-level configs (part 2) (#23797)\n\nFollow-up to #23729: move DynamicClusterMirrorConfig to the server\nmodule as Java code, taking a Supplier\u003cAbstractKafkaConfig\u003e instead of\nKafkaBroker, and drop the redundant check on\nmirror.metadata.refresh.interval.ms already enforced by ConfigDef.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Luke Chen\n\u003cshowuon@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b7665039a5b8dfa157fe1ea588fa8c7291b89a5d",
      "tree": "7cbaf862f13afe1c37ef998cb6aaa8b9c15bac3c",
      "parents": [
        "b9b0c909c6f01a2b50ff3a2478903be11312e35a"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Wed Oct 14 14:25:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 02:25:13 2026 +0800"
      },
      "message": "MINOR: update upgrade.md on rack config (#23817)\n\nAdding rack config into 4.4, document it in upgrade.me\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b9b0c909c6f01a2b50ff3a2478903be11312e35a",
      "tree": "6b84953fbaa740ba73628a72c879c165a6ced674",
      "parents": [
        "abc2906503edc3509faf63e83ce424bc51c3432b"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Wed Oct 14 20:02:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 20:02:39 2026 +0530"
      },
      "message": "MINOR: Add optional acknowledgeType to ShareConsumeBenchSpec (#23802)\n\nAdd an optional \"acknowledgeType\" property (ACCEPT, REJECT or RELEASE)\nto the Trogdor ShareConsumeBenchSpec. When set, the share consumers use\nexplicit acknowledgement mode and acknowledge every polled record with\nthat type. RENEW is not supported. When absent, behaviour is unchanged\n(implicit acknowledgement), so existing specs and callers keep working.\n\nThe worker fails fast if acknowledgeType is combined with\nshare.acknowledgement.mode\u003dimplicit in the client configs. Also add an\nacknowledge_type argument to the ducktape ShareConsumeBenchWorkloadSpec.\nCo-Authored-By: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "abc2906503edc3509faf63e83ce424bc51c3432b",
      "tree": "a2b4f1f219e4c2da6f82f5b44b743cc88e4b9483",
      "parents": [
        "515a8c50c88e03a4a84f3b1175140802997bd830"
      ],
      "author": {
        "name": "Lucy Liu",
        "email": "lucliu@confluent.io",
        "time": "Wed Oct 14 05:15:19 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 18:15:19 2026 +0800"
      },
      "message": "MINOR: Address 4.4 documentation gaps for Streams and OAuth (#23809)\n\n## What\n  * Add KIP-1321 (headers-aware StreamPartitioner) to the 4.4.0 Streams\nupgrade guide.\n  * Add KIP-892 (transactional state stores) to the 4.4.0 Streams\nupgrade guide.\n  * List the streams rack-aware assignment tag configs in the rebalance\nprotocol page.\n  * Add expected audience/issuer to the broker OAUTHBEARER example,\nwhich otherwise fails to start since 4.4.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    }
  ],
  "next": "515a8c50c88e03a4a84f3b1175140802997bd830"
}
