)]}'
{
  "log": [
    {
      "commit": "209a1b6e39a535453d302ca1306d24eded62bfda",
      "tree": "951afac89ce1b199eb87da9718deb9626f40e64e",
      "parents": [
        "76507853bfa6c59a9f43c0ad18cad75aec422fab"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Wed Jul 29 11:29:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 10:29:06 2026 +0100"
      },
      "message": "KAFKA-20328 : [1/N] headers-aware api test coverage (#22196)\n\nRef : https://issues.apache.org/jira/browse/KAFKA-20328\n\nAfter audit, found a few gaps and also considered the work of 1271 kip\nThis is first PR. Next PRs will be on Decorator/forwarder coverage —\nAbstractReadWriteDecorator and AbstractReadX related and other\nintegration tests\n\nThis PR :\n\n- new tests for  PlainToHeadersWindowStoreIteratorAdapterTest,\nRocksDBMigratingWindowStoreWithHeaders and\nTimestampedToHeadersStoreAdapter (considered deleted files in\nhttps://github.com/apache/kafka/pull/21830)\n- Update StoresTest with coverage for all 6 *WithHeaders factory methods\non Stores\n- New test : DslStoreFormatTest cases for HEADERS enum\n- New contract tests for TimestampedKeyValueStoreWithHeaders,\nTimestampedWindowStoreWithHeaders and SessionStoreWithHeaders (with put,\nget, range, fetch, and backwardFetch, etc)\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, TengYao Chi\n \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "76507853bfa6c59a9f43c0ad18cad75aec422fab",
      "tree": "20d3bb1bdcc59993ab0a04463d43c0b6c8abd218",
      "parents": [
        "155640c0a72bab151a292b5b8e359c4a52899308"
      ],
      "author": {
        "name": "Dejan Stojadinović",
        "email": "dejan2609@users.noreply.github.com",
        "time": "Wed Jul 29 11:09:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:09:46 2026 +0200"
      },
      "message": "MINOR: Updates build and project dependencies (#22939)\n\ndetails:   - bcpkix: 1.84 --\u003e\u003e 1.85   - jgit: 7.6.0 --\u003e\u003e 7.7.1   -\njunit: 5.14.3 --\u003e\u003e 5.14.4   - junitPlatform: 1.14.3 --\u003e\u003e 1.14.4   -\nmavenArtifact: 3.9.15 --\u003e\u003e 3.9.16   - swagger: 2.2.48 --\u003e\u003e 2.2.52   -\nGradle plugins:    - gradle-versions-plugin: version update (0.54.0 --\u003e\u003e\n0.56.0) and name change (from `com.github.ben-manes.versions plugin` to\n`io.github.ben-manes.versions`)       - note: plugin now supports\nparallel build (and hence `--no-parallel` switch is not required\nanymore)    - dependencycheck: 12.2.1 --\u003e\u003e 12.2.2    - spotbugs: 6.5.1\n--\u003e\u003e 6.5.9    - scoverage: 8.1 --\u003e\u003e 9.1    - shadow: 9.4.1 --\u003e\u003e 9.6.1\n\nCVEs addressed via bcpkix and jgit version updates:   - bcpkix: several\nvulnerabilities are addressed:\nhttps://github.com/bcgit/bc-java/blob/r1rv85/docs/releasenotes.html#L330\n- JGit: these two vulnerabilities are addressed:     - CVE-2026-44432\n- https://www.cve.org/CVERecord?id\u003dCVE-2026-44432       -\n\nhttps://github.com/urllib3/urllib3/security/advisories/GHSA-mf9v-mfxr-j63j\n- CVE-2026-56624       - https://www.cve.org/CVERecord?id\u003dCVE-2026-56624\n- https://lists.apache.org/thread/o4c2jml522j3z80gbryqzc2f1253ltp6\n\nSome notable release notes links:   - bcpkix:\nhttps://github.com/bcgit/bc-java/blob/r1rv85/docs/releasenotes.html#L22\n- JGit:     -\nhttps://projects.eclipse.org/projects/technology.jgit/releases/7.7.0\n- https://projects.eclipse.org/projects/technology.jgit/releases/7.7.1\n- gradle-versions-plugin:     -\nhttps://github.com/ben-manes/gradle-versions-plugin/releases/tag/v0.55.0\n-\nhttps://github.com/ben-manes/gradle-versions-plugin/releases/tag/v0.56.0\n- scoverage gradle plugin:     -\nhttps://github.com/scoverage/gradle-scoverage/releases/tag/9.0     -\nhttps://github.com/scoverage/gradle-scoverage/releases/tag/9.1   -\nshadow gradle plugin:\nhttps://gradleup.com/shadow/changes/#961-2026-07-22\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "155640c0a72bab151a292b5b8e359c4a52899308",
      "tree": "d4320a31a487b14e5a08551c307f5271caeaa388",
      "parents": [
        "9ae317d728b69fb363be9326ef07e2656765e211"
      ],
      "author": {
        "name": "Mickael Maison",
        "email": "mimaison@users.noreply.github.com",
        "time": "Wed Jul 29 11:05:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:05:40 2026 +0200"
      },
      "message": "KAFKA-20648: Move Processor object and tests to server module (#22439)\n\nWe can\u0027t move the main Processor class just yet, as it still depends on\nother Scala classes.\n\nReviewers: Luke Chen \u003cshowuon@gmail.com\u003e"
    },
    {
      "commit": "9ae317d728b69fb363be9326ef07e2656765e211",
      "tree": "f163b44c6808b616a3b52550d07939be4e40693c",
      "parents": [
        "b706c58dd91f2f331a91d8b94b15b0912d1a8242"
      ],
      "author": {
        "name": "Mickael Maison",
        "email": "mimaison@users.noreply.github.com",
        "time": "Wed Jul 29 11:04:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:04:25 2026 +0200"
      },
      "message": "KAFKA-17840: Move QuotaFactory to server module (#22721)\n\nMoving the last quota logic out of core.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Luke Chen \u003cshowuon@gmail.com\u003e"
    },
    {
      "commit": "b706c58dd91f2f331a91d8b94b15b0912d1a8242",
      "tree": "f7fe469abac41f0327a089f744467fd98612ac68",
      "parents": [
        "b992620602d72f633dcdeabed498638c899e87f8"
      ],
      "author": {
        "name": "Alieh Saeedi",
        "email": "107070585+aliehsaeedii@users.noreply.github.com",
        "time": "Wed Jul 29 08:17:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 23:17:54 2026 -0700"
      },
      "message": "KAFKA-20413: Make Streams suppress headers-aware (#22165)\n\nThis PR  fixes the suppress-buffer part of KAFKA-20413 / KIP-1285.\n\n`InMemoryTimeOrderedKeyValueChangeBuffer` now uses the buffered record\u0027s\nown headers in serde calls and on eviction.\n\n Testing:  Added `shouldPropagateHeadersThroughEviction`,  and\n`shouldUseRecordHeadersNotProcessorContextHeadersOnPut`.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e, Uladzislau Blok\n \u003cblokv75@gmail.com\u003e"
    },
    {
      "commit": "b992620602d72f633dcdeabed498638c899e87f8",
      "tree": "82b337952bf64f86055237e6b52071cf7b45e2b5",
      "parents": [
        "17f3f8aeae8c7a93fce731b016ffb055c2bee4bc"
      ],
      "author": {
        "name": "Anton Liauchuk",
        "email": "anton93lev@gmail.com",
        "time": "Wed Jul 29 06:04:19 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 11:04:19 2026 +0800"
      },
      "message": "KAFKA-20430 Add configuration to control internal topic creation in Kafka Connect (#20384)\n\nImplementation of\n\nhttps://cwiki.apache.org/confluence/display/KAFKA/KIP-1209:+Add+configuration+to+control+internal+topic+creation+in+Kafka+Connect\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "17f3f8aeae8c7a93fce731b016ffb055c2bee4bc",
      "tree": "285ee63edaedf8c3c58e92e6b0291d009f19d1f6",
      "parents": [
        "58f63f448e3b8f94e71bbf1d96935b268443f1e6"
      ],
      "author": {
        "name": "Mickael Maison",
        "email": "mimaison@users.noreply.github.com",
        "time": "Wed Jul 29 04:56:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 10:56:57 2026 +0800"
      },
      "message": "MINOR: Cleanups following KAFKA-20637 (#22584)\n\nFollowing up comment on https://github.com/apache/kafka/pull/22408\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "58f63f448e3b8f94e71bbf1d96935b268443f1e6",
      "tree": "980fa88cc6d91eb67fe4b03ac87b9a52461557eb",
      "parents": [
        "507d01da4270ff65ae94ebef8793e35a6c5f358a"
      ],
      "author": {
        "name": "Ming-Yen Chung",
        "email": "mingyen066@gmail.com",
        "time": "Wed Jul 29 10:50:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 10:50:18 2026 +0800"
      },
      "message": "MINOR: Complete nodeApiVersions future when describeFeatures fails (#22978)\n\nFollow-up to\nhttps://github.com/apache/kafka/pull/20598#discussion_r3667202261\n\n`describeFeatures()` now returns an `InternalDescribeFeaturesResult`\ncarrying a `nodeApiVersions` future, but `handleFailure` only completes\nthe `FeatureMetadata` future. When the ApiVersions request fails (for\nexample on timeout), `nodeApiVersions()` is never completed and callers\nwaiting on it hang indefinitely. The error-code branch in\n`handleResponse` already completes both.\n\nExtended the existing `testDescribeFeatures*` tests to assert both\nfutures. `testDescribeFeaturesWithNodeFailure` is the one that covers\n`handleFailure`; it hangs until the class-level timeout without this\nfix.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "507d01da4270ff65ae94ebef8793e35a6c5f358a",
      "tree": "b2512ec32a55a467f51eca80feb4ce337a206a7f",
      "parents": [
        "acca881314a2a718ee1653f7b22f5811b7911bb0"
      ],
      "author": {
        "name": "TengYao Chi",
        "email": "frankvicky@apache.org",
        "time": "Wed Jul 29 02:49:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:49:19 2026 +0800"
      },
      "message": "KAFKA-14648 Do not fail clients if bootstrap servers is not immediately resolvable (#21080)\n\nThis PR implements KIP-909 to prevent immediate client failures when\nbootstrap.servers cannot be resolved during initialization.\n\nReviewers: PoAn Yang \u003cpayang@apache.org\u003e, Rajini Sivaram\n \u003crajinisivaram@googlemail.com\u003e, Lianet Magrans \u003clmagrans@confluent.io\u003e,\n Nikita Shupletsov \u003cnikita@shupletsov.ca\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "acca881314a2a718ee1653f7b22f5811b7911bb0",
      "tree": "8eec7337e7fa324b5791d614254d8e3f9265a2bc",
      "parents": [
        "6fd96a3d3916b69eb1c7e0b488fc8882c592af1a"
      ],
      "author": {
        "name": "PoAn Yang",
        "email": "payang@apache.org",
        "time": "Wed Jul 29 09:15:01 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 09:15:01 2026 +0900"
      },
      "message": "MINOR: Update MiniKdc class path in minikdc.py (#22976)\n\nFollow up from\nhttps://github.com/apache/kafka/pull/21407#issuecomment-5104377112\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e\n\nSigned-off-by: PoAn Yang \u003cpayang@apache.org\u003e"
    },
    {
      "commit": "6fd96a3d3916b69eb1c7e0b488fc8882c592af1a",
      "tree": "93a80d4b1abcf332cad696112a5fd78811486158",
      "parents": [
        "20e952c78383e18e9102dd436dc5a8071a08bb05"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Tue Jul 28 16:17:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 16:17:39 2026 -0700"
      },
      "message": "KAFKA-20665: Bump group epoch for warm-up refinement steps (#22748)\n\nReplace the streams-heartbeat bumpGroupEpoch boolean with an\nAssignmentUpdate enum (NONE/RECOMPUTE/REFINE). RECOMPUTE keeps today\u0027s\nbehavior (re-run the assignor for a new final target). REFINE only\nadvances the assignment epoch of the unchanged final target via the\ntarget-assignment metadata record, without re-running the assignor, so\nmembers re-reconcile toward the next intermediate (warm-up) step.\n\nA REFINE bump is triggered by hasHotWarmupTask(): a caught-up warm-up\n(lag within acceptable.recovery.lag). Each refinement step needs its own\nassignment epoch because members only pick up a changed assignment when\nthe epoch advances, and a new assignment epoch requires a group-epoch\nbump.\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, Sean Quah\n \u003csquah@confluent.io\u003e, David Jacot \u003cdavid.jacot@gmail.com\u003e"
    },
    {
      "commit": "20e952c78383e18e9102dd436dc5a8071a08bb05",
      "tree": "87abdb213ed68c3215b5774fc837cff28ba97c26",
      "parents": [
        "209ef931f22566daca3fe4f71a90550f878067ad"
      ],
      "author": {
        "name": "Lianet Magrans",
        "email": "98415067+lianetm@users.noreply.github.com",
        "time": "Tue Jul 28 16:20:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 16:20:39 2026 -0400"
      },
      "message": "KAFKA-20780: Fix to clear completed inflight poll on empty fetch response and time left  (#22979)\n\nFix to ensure that a new fetch request (new inflightPoll event) is sent\nright away in the case where a previous fetch event completed without\nrecords and there is still time to poll internally.\n\nBefore this PR, a second iteration of the internal poll loop would not\nclear the previous event that was already done (and generated no data),\nso it would block on the buffer before sending a next fetch, introducing\nlatency.\n\nFix by ensuring that the inflight poll is cleared if completed before\nchecking the need to send a new one.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "209ef931f22566daca3fe4f71a90550f878067ad",
      "tree": "06324f19f27e45ae8b59ab65120be64ea2ec755c",
      "parents": [
        "a5b7fc0fae22d933ef8254701225f5ed5a0a7a18"
      ],
      "author": {
        "name": "Nikita Shupletsov",
        "email": "nikita@shupletsov.ca",
        "time": "Tue Jul 28 12:46:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 15:46:33 2026 -0400"
      },
      "message": "MINOR: deflake AdminMetadataTest (#22968)\n\nClusterTest harness only waits for brokers to reach RUNNING, not for all\nof them to be registered and propagated, so a single describeCluster()\ncan race with metadata propagation and see fewer brokers.   Adding a\nwait until all of them have been discovered.\n\nReviewers: Lianet Magrans \u003clmagrans@confluent.io\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a5b7fc0fae22d933ef8254701225f5ed5a0a7a18",
      "tree": "42dcce9f0190363fe547ac507c29fe9f8b832de3",
      "parents": [
        "553f6635a934f76e96570341b3acb2a257aa7055"
      ],
      "author": {
        "name": "Aravind Reveendran",
        "email": "37244926+errwnd@users.noreply.github.com",
        "time": "Wed Jul 29 00:23:13 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 20:53:13 2026 +0200"
      },
      "message": "MINOR: Fix blog post link in uses.md (#22972)\n\nUpdated the link to the blog post about Apache Kafka use cases.\n\n[Onboarding docu](https://kafka.apache.org/uses/) had a link pointing to\nLinkedIn Engineering blog, which was non functional. The actual link was\npasted.\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "553f6635a934f76e96570341b3acb2a257aa7055",
      "tree": "5b8aef9af5324e1ef781dce0a2fd085b24d0693a",
      "parents": [
        "6ce2682d7bb860bd3b875404fb46e2cbf4e6b96d"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Tue Jul 28 10:52:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 10:52:48 2026 -0700"
      },
      "message": "KAFKA-20665: Promote a warm-up task to active in place in the reconciler (#22923)\n\nWhen the target assignment moves a task to a member that currently holds\nit as a warm-up, the reconciler now promotes the warm-up to active in\nplace instead of revoking it and reassigning the active in a later step.\nThis lets the member recycle the task\u0027s (in-memory) state store instead\nof closing it and restoring from the changelog (cf. KAFKA-9501).\n\nCurrentAssignmentBuilder:\n - The active-task \"unreleased\" predicate no longer treats a warm-up\n   held by *this* member for the same task as a blocker (that is the promotion).\n   It still blocks when a *different* member on the same process holds\n   the warm-up, so a process never runs a task as both active and warm-up.\n - applyWarmupPromotions() keeps the warm-up as an assigned task\n   while the active is still owned elsewhere, or while its grant is deferred\n   by another pending revocation (buildNewMember gives revocation\n   priority), and drops it only in the step in which the active is actually granted.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "6ce2682d7bb860bd3b875404fb46e2cbf4e6b96d",
      "tree": "b088a5154f2286ab1430cea09e7b6ac05b7ad30c",
      "parents": [
        "12e135bd26411448f80d0b566d7f42d31090a5ae"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Tue Jul 28 22:25:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 22:25:23 2026 +0800"
      },
      "message": "KAFKA-20539 Prevent Hot Data Loss on Partition Expansion for Latest Policy (#22784)\n\nEnhanced the auto.offset.reset documentation in ConsumerConfig.java to\nclearly explain the message-loss risk when using latest after increasing\nthe partition count, and recommended by_duration:\u003cduration\u003e as a safer\nalternative.\n\nUpdated `basic-kafka-operations.md` with a recommendation section and a\ncomparison table for suitable `\u003cduration\u003e` values under both the\nconsumer (KIP-848) and classic group protocols.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "12e135bd26411448f80d0b566d7f42d31090a5ae",
      "tree": "f6a0a5fef08bc43cac827a17461e6320fcd53c18",
      "parents": [
        "0d26e55129204c22e9157b80e8f7d71f76cd05ca"
      ],
      "author": {
        "name": "Sanskar Jhajharia",
        "email": "sjhajharia@confluent.io",
        "time": "Tue Jul 28 19:36:24 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 22:06:24 2026 +0800"
      },
      "message": "MINOR: Fix Javadoc code sample in KafkaShareConsumer (#22974)\n\nThe class-level Javadoc example used `Optional.getOrElse(...)`, which\nisn\u0027t a method on `java.util.Optional` (should be `orElse`), and\nreferenced an undefined `rec` variable instead of the actual loop\nvariable `record`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "0d26e55129204c22e9157b80e8f7d71f76cd05ca",
      "tree": "7fe6cae461e08241b26a52145fdd04fd7003967a",
      "parents": [
        "ab61875188f698d9a14ffff2f262a2844f15d5dd"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Tue Jul 28 18:31:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 18:31:29 2026 +0800"
      },
      "message": "KAFKA-20825 Fix native image startup with share group DLQ manager (#22900)\n\nNative Kafka images built from trunk can fail during broker startup with\na  `ClassNotFoundException` for `DefaultShareGroupDLQManager`.\n\nDuring startup, `BrokerServer.createShareGroupDLQManager` reads the\n`group.share.dlq.manager.class.name` configuration. This configuration\ndefaults  to\n`org.apache.kafka.server.share.dlq.DefaultShareGroupDLQManager`, so\nevery  broker process follows this code path even when the user has not\nexplicitly  configured a DLQ manager.\n\nThe method previously passed the configured class name to\n`Utils.loadClass`  before comparing it against the two supported\nimplementations. Runtime  class-name loading requires additional\nreachability metadata in a GraalVM  native image, causing the native\nexecutable to fail before the broker could  finish starting.\n\nThis reflective class loading is unnecessary because arbitrary DLQ\nmanager  implementations are not supported. The method only accepts\n`DefaultShareGroupDLQManager` and `NoOpShareGroupDLQManager`, and both\nare  instantiated directly.\n\nThis change compares the configured class name directly against the two\nsupported implementations. The behavior for the default, no-op, empty,\nand  unsupported configurations remains unchanged, while native-image\nstartup no  longer depends on reflection metadata for the DLQ manager.\n\nThe original native-image failure was reported in:\nhttps://github.com/apache/kafka/pull/22379#pullrequestreview-4731595296\n\nTesting:\n\n```text\n./gradlew core:compileScala\n```\n\nResult:\n\n```text\n\u003e Task :core:compileScala\nBUILD SUCCESSFUL\n```\n\nA release archive and GraalVM native Docker image were then built from\nthe  modified working tree:\n\n```text\n./gradlew clean releaseTarGz\ndocker build --no-cache --progress\u003dplain ...\n```\n\nNative-image build result:\n\n```text\n[8/8] Creating image...\n127.17MB in total\n\nProduced artifacts:   /app/kafka/kafka.Kafka (executable)\n\nFinished generating \u0027kafka.Kafka\u0027 in 2m 32s.\n```\n\nThe resulting native image was started as a single-node KRaft broker\nusing the  default DLQ manager. The relevant output was collected with:\n\n```bash\ndocker logs kafka-native-dlq-test 2\u003e\u00261 |\n  grep -E \\\n  \"ClassNotFoundException|DefaultShareGroupDLQManager|Kafka Server\nstarted\"\n```\n\nOutput:\n\n```text\ngroup.share.dlq.manager.class.name \u003d\norg.apache.kafka.server.share.dlq.DefaultShareGroupDLQManager\n[KafkaRaftServer nodeId\u003d1] Kafka Server started\n```\n\nNo `ClassNotFoundException` or `NoClassDefFoundError` was present, and\nthe  container remained running after startup.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Gaurav Narula\n \u003cgaurav_narula2@apple.com\u003e"
    },
    {
      "commit": "ab61875188f698d9a14ffff2f262a2844f15d5dd",
      "tree": "3d49701063eb5c8d8676f647c289a477ab46216b",
      "parents": [
        "ec89db257f0ebe3ba80542df30ebefcec26eca7a"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Tue Jul 28 12:07:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 18:07:16 2026 +0800"
      },
      "message": "KAFKA-20842 Bump lz4 to 1.11.1 (#22962)\n\nBump lz4 to 1.11.1\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "ec89db257f0ebe3ba80542df30ebefcec26eca7a",
      "tree": "d7b2889cabcd5cb83002412d1e498d85a9bb7aff",
      "parents": [
        "8001408711059edc5dda803d2f50e551a7e7e7a9"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Mon Jul 27 22:35:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 22:35:26 2026 -0700"
      },
      "message": "MINOR: Align consumer assignor loading with share and streams (#22929)\n\ngroup.consumer.assignors is a broker config, and thus its type is always\nString. The class loader nevertheless accepted Class objects\nunnecessarily.\n\nThis PR drops the Class branch to simplify the code. Additionally, this\nPR improves some error messages.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "8001408711059edc5dda803d2f50e551a7e7e7a9",
      "tree": "ecb4938a891a8ce5ca9610333b1193fca462eee3",
      "parents": [
        "dee0805194531a88bedb6974bafcfdc27db4079b"
      ],
      "author": {
        "name": "Jess668",
        "email": "jejin@confluent.io",
        "time": "Mon Jul 27 18:59:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 23:59:38 2026 +0100"
      },
      "message": "KAFKA-20706: IQv2 TimestampedWindowRangeWithHeadersQuery (KIP-1356) (#22853)\n\n## Summary\n\nAdds the fourth and final IQv2 query type from\n\n[KIP-1356](https://cwiki.apache.org/confluence/spaces/KAFKA/pages/430408653/KIP-1356+Introduce+IQv2+for+headers-aware+state+stores),\n`TimestampedWindowRangeWithHeadersQuery` — the headers-aware parallel of\n`WindowRangeQuery`. It returns a `ReadOnlyRecordIterator\u003cWindowed\u003cK\u003e,\nV\u003e` whose elements carry the windowed key, value, event-time, and record\nheaders, and — like `WindowRangeQuery` — has two mutually  exclusive\nforms:\n\n- `withWindowStartRange(timeFrom, timeTo)` is handled by window stores\nand returns every key whose window start falls within the closed range\n`[timeFrom, timeTo]`. Each element\u0027s `timestamp()` is the stored\nrecord\u0027s event-time.\n- `withKey(key)` is handled by session stores and returns every session\nfor that key. Session aggregations carry no per-record event-time, so\n`timestamp()` is the session window\u0027s (inclusive) end.\n\nSubmitting the wrong form (`withKey` to a window store, or\n`withWindowStartRange` to a session store) fails with\n`UNKNOWN_QUERY_TYPE`, as does submitting the query to a store not built\nwith a `WithHeaders` builder.\n\n## Implementation\n\nHandling is done at the metered layer:\n\n- `MeteredTimestampedWindowStoreWithHeaders` serves the\n`withWindowStartRange` form by forwarding\n  a raw `WindowRangeQuery.withWindowStartRange` to the wrapped store and\nsurfacing each entry as a\n  `ReadOnlyRecord` (via `Record`) carrying the stored event-time and\nheaders, with the headers\n  frozen read-only. Because a `ReadOnlyRecord` timestamp is\ncontractually non-negative, an entry\n  with a negative stored timestamp (e.g. `NO_TIMESTAMP`/`-1` from a\n`WithHeaders` store built over\n  a plain window supplier) cannot be represented, so advancing the\niterator throws\n  `StreamsException` at that entry. The `withKey` form is rejected.\n- `MeteredSessionStoreWithHeaders` serves the `withKey` form by\nforwarding a raw\n  `WindowRangeQuery.withKey` and surfacing each session as a\n`ReadOnlyRecord` whose timestamp is\n  the session-window end. The `withWindowStartRange` form is rejected.\n\nThe native RocksDB header stores (`RocksDBSessionStoreWithHeaders`,\n`RocksDBTimeOrderedSessionStoreWithHeaders`,\n`RocksDBTimestampedWindowStoreWithHeaders`,\n`RocksDBTimeOrderedWindowStoreWithHeaders`) previously overrode\n`query()` to return  `UNKNOWN_QUERY_TYPE` (the window stores\nspecial-cased only `WindowKeyQuery`). Removing those  overrides lets\nthem inherit native IQv2 handling via `StoreQueryUtils`, so the raw\n`WindowRangeQuery` forwarded by the metered layer is served on native\nbuilds. This also fixes the  pre-existing gap where a plain\n`WindowRangeQuery` was unsupported against a natively-built header\nstore.\n\nMinor: `MeteredSessionStoreWithHeaders.query()` now records execution\ninfo once after dispatch  instead of per-branch, and both metered stores\nseed the timing clock from `time.nanoseconds()`  (matching the parent\nstores) so execution-info durations are correct under a mock clock.\n\n## Testing\n\nUnit, store-builder, and end-to-end coverage across both forms and all\nbuild paths (native,  timestamped/plain adapter, in-memory):\n\n- **Metered-store unit tests**\n(`MeteredTimestampedWindowStoreWithHeadersTest`,\n  `MeteredSessionStoreWithHeadersTest`): bounds/key are forwarded as a\nraw `WindowRangeQuery`; the\n  wrong form is rejected; wrapped-store failures propagate;\n`num-open-iterators` is tracked,\n  including the intentionally non-idempotent double-close and leaving\nthe iterator open when\n  `next()` throws on a negative stored timestamp; returned values,\nheaders, and read-only\n  (immutable) headers are asserted.\n- **RocksDB store tests**: the native stores now serve the forwarded raw\n`WindowRangeQuery` /\n  `WindowKeyQuery` through their inherited `StoreQueryUtils` handling,\nreturning the raw stored\n  header-format bytes.\n- **Store-builder tests** (`SessionStoreWithHeadersBuilderTest` (new),\n  `TimestampedWindowStoreWithHeadersBuilderTest`): builder wiring plus\nend-to-end query behavior —\n  header round-trip and immutability, empty headers on the adapter\nbuild, plain-supplier and\n  negative-timestamp throws, execution-info, and native-vs-adapter\nparity with an interleaved\n  noise key and variable-length sessions.\n- **Integration tests** (`IQv2HeadersStoreIntegrationTest`): end-to-end\nIQv2 queries for both\n  forms through `KafkaStreams` — header round-trip, empty headers on the\nadapter build,\n  position/caching semantics (a cache-only write is not visible under a\nposition bound), cross-form\n  and non-headers-store rejection, and variable-length merged session\nwindows.\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, TengYao Chi\n \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "dee0805194531a88bedb6974bafcfdc27db4079b",
      "tree": "413d8363b4655db1136f9527ad9735c2e8d7886a",
      "parents": [
        "63f445aaa9688f919d0606f2c6d118b6a7e3f3b3"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Mon Jul 27 13:25:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:25:12 2026 -0700"
      },
      "message": "MINOR: add suppress() header-propagation scenario tests (#22955)\n\nPart of KIP-1285.\n\nAdds SuppressHeadersScenarioTest, a baseline harness for record-header\npropagation through suppress(). The suppress buffer holds a prior, an\nold and a new value per row, each originating from a different input\nrecord, so each must be (de)serialized with the headers of the record it\ncame from. Header-agnostic serdes discard the headers they are handed,\nso this is invisible from the output topic; the tests therefore observe\nevery serde invocation and assert on what the serdes actually saw.\n\nScenarios: non-windowed and windowed, crossed with eviction triggered by\nthe same row versus a different row, plus tombstone handling in both the\nforwarded and the deliberately-dropped case.\n\nAll scenarios currently fail and are therefore @Disabled; they encode\nthe expected behaviour so a fix can be validated against them, and\nshould be enabled by that fix.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "63f445aaa9688f919d0606f2c6d118b6a7e3f3b3",
      "tree": "3693c5ae5303714e7433ee34d57310e679219a33",
      "parents": [
        "ab890f66f31b4bc8178bdaa5e7767defc0d9f2e6"
      ],
      "author": {
        "name": "Arnab Nandy",
        "email": "arnab_nandy7@yahoo.com",
        "time": "Mon Jul 27 22:45:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 10:15:21 2026 -0700"
      },
      "message": "KAFKA-20828: Derive client throttling from response schema (#22908)\n\n`AbstractResponse.shouldClientThrottle()` previously defaulted to\n`false`. As a result, newer response types containing a `throttleTimeMs`\nfield did not enable client-side throttling unless they explicitly\noverrode this method.\n\nThis change derives the default behavior from the response schema. A\nclient now throttles when the response schema for the negotiated API\nversion contains the `throttle_time_ms` field.\n\nExisting overrides remain unchanged to preserve historical\nversion-specific throttling behavior for older APIs.\n\nThis fixes client-side throttling for:\n\n- `ConsumerGroupHeartbeatResponse`\n- `ShareGroupHeartbeatResponse`\n- `StreamsGroupHeartbeatResponse`\n\nIt also prevents newly added response types with a throttle-time field\nfrom accidentally omitting the required behavior.\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e, Hardanish Singh (github:Hardanish-Singh)"
    },
    {
      "commit": "ab890f66f31b4bc8178bdaa5e7767defc0d9f2e6",
      "tree": "a7b08e316126c9bfdc97a43064d76bdf37f32d41",
      "parents": [
        "774e0ab6b1b93cfa8806dd38ca56690574cde783"
      ],
      "author": {
        "name": "TengYao Chi",
        "email": "frankvicky@apache.org",
        "time": "Mon Jul 27 17:47:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 17:47:29 2026 +0100"
      },
      "message": "MINOR: Rewrite testListTopicsWithOptionListInternal (#22960)\n\nRewrite `testListTopicsWithOptionListInternal` to explicitly create the\n`__consumer_offsets`  topic via Admin rather than relying on a\n`consumer.poll(100ms)` to trigger group formation.\n\nThe Scala predecessor of this test relied on\n`IntegrationTestHarness.setUp()`\npre-creating `__consumer_offsets` via `createOffsetsTopic()`. The Java\nmigration in\n#22290 replaced that with a `consumer.subscribe` + `poll(100ms)`\nsequence, which\nraces against internal group join timing.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "774e0ab6b1b93cfa8806dd38ca56690574cde783",
      "tree": "c0a72f0c4b4b8394aa20c3e3b7a9e87a3cfed55f",
      "parents": [
        "8e365aea244da3c11f1cd1a948a5a135ef7b44bc"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Mon Jul 27 07:38:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 07:38:54 2026 -0700"
      },
      "message": "MINOR: \"streams\" TaskAssignors must be thread-safe (#22930)\n\nWith KIP-1357, task assignors are instantiated differently and now must\nbe thread safe.\n\nThis PR updates the interface JavaDocs accordingly.\n\nAdditionally, it fixes StickyTaskAssignor, which currently keeps local\nstate in an instance field, what is not thread safe. This PR refactors\nStickyTaskAssignor accordingly.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "8e365aea244da3c11f1cd1a948a5a135ef7b44bc",
      "tree": "d60e0c0699447a315c5a8fd9ff6d6e07419d948c",
      "parents": [
        "fa9e1e448d2bc48abc76d49c562ed5d76458606c"
      ],
      "author": {
        "name": "Christo Lolov",
        "email": "lolovc@amazon.com",
        "time": "Mon Jul 27 15:17:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 15:17:04 2026 +0100"
      },
      "message": "KAFKA-15899: [2/2] Move kafka.security package from core to server module (#21407)\n\nPart 2 of https://github.com/apache/kafka/pull/15572.\n\nMoves tests from `core` to `server`\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "fa9e1e448d2bc48abc76d49c562ed5d76458606c",
      "tree": "c942f74ff8a2b1082590c550227e9a6721f019c9",
      "parents": [
        "64d9aa77355654593ba104842592096226f69a60"
      ],
      "author": {
        "name": "Yu-Chia Ma",
        "email": "79797958+Mirai1129@users.noreply.github.com",
        "time": "Mon Jul 27 20:56:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 20:56:00 2026 +0800"
      },
      "message": "MINOR: Fix StreamPartitioner deprecation warning in ProcessorTopology (#22944)\n\n`constantPartitioner` used a lambda, which implicitly overrides the\ndeprecated 4-arg `StreamPartitioner#partitions(String, K, V, int)`.\nSince a lambda cannot be annotated with `@Deprecated`, the warning could\nnot be suppressed via the lambda itself.\n\nReplaced the lambda with an anonymous class that implements the new\n5-arg `partitions(String, K, V, Headers, int)` method, and kept the\ndeprecated 4-arg override (annotated `@Deprecated`) delegating to it for\nsource compatibility.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "64d9aa77355654593ba104842592096226f69a60",
      "tree": "bbe69ea4d434b388bc2c7c6dcffe1c4a05cadfb4",
      "parents": [
        "b231920c4364b1aae6b79b8faa98b8d98f933fcd"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Mon Jul 27 20:48:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 20:48:53 2026 +0800"
      },
      "message": "MINOR: Clean up SSL support for ClusterTestExtensions (#22876)\n\nThis PR addresses two follow-up review comments from #22184:\n\n- Remove the redundant security protocol allowlist, which enumerated\nevery `SecurityProtocol` value.\n- Simplify SSL endpoint collection by using\n`dataPlaneAcceptors().keySet()` directly.\n\nMixed broker and controller security protocol handling remains unchanged\nand can be addressed separately.\n\n### Testing\n\n```bash\n./gradlew :test-common:test-common-runtime:test \\\n  --tests org.apache.kafka.common.test.TestKitNodeTest \\\n  --tests\norg.apache.kafka.common.test.junit.ClusterTestExtensionsTest.testSsl\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b231920c4364b1aae6b79b8faa98b8d98f933fcd",
      "tree": "ada673c0f3a6e145ef054699ef5502cca33949ec",
      "parents": [
        "01f50af8b8de007d2474e7035e27cd331b9132bb"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Mon Jul 27 14:32:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:32:33 2026 +0200"
      },
      "message": "KAFKA-20840: Bump jetty to 12.0.37 (#22956)\n\nBump jetty to 12.0.37\n\nReviewers: Luke Chen \u003cshowuon@gmail.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e, Mickael Maison \u003cmickael.maison@gmail.com\u003e\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "01f50af8b8de007d2474e7035e27cd331b9132bb",
      "tree": "655f2ec24af8388d3970d3682c3311e4f0d09fd9",
      "parents": [
        "226ce2d8354694625ce98c7213df724f6fead22e"
      ],
      "author": {
        "name": "Mingi Cho",
        "email": "81455273+ChoMinGi@users.noreply.github.com",
        "time": "Mon Jul 27 21:25:09 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:25:09 2026 +0100"
      },
      "message": "KAFKA-20253: Trigger rejoin on heartbeat thread AuthenticationException (#22073)\n\n[KAFKA-20253](https://issues.apache.org/jira/browse/KAFKA-20253)\n\nReproduced the 100% CPU busy loop using @mstruk\u0027s\n[reproducer](https://github.com/mstruk/kafka-consumer-reproducer) and\ntracked it down to `AbstractCoordinator.HeartbeatThread`. When an\n`AuthenticationException` hits the outer catch (e.g. after a transient\nOAuth server outage), it only calls `setFailureCause(e)` and exits — but\nnothing triggers a rejoin. So `state` stays `STABLE`, `rejoinNeeded`\nstays `false`, `heartbeatThread` gets cleared to `null`,  and\n`timeToNextHeartbeat()` returns the stale`heartbeatTimer.remainingMs()\n\u003d\u003d 0`. The main thread then spins `NetworkClient.poll(0)` via\n`selectNow()` indefinitely.\n\nFixed by adding `requestRejoin()` to the auth catch block — the same\npattern already used for `REBALANCE_IN_PROGRESS` / `UNKNOWN_MEMBER_ID`\nin `HeartbeatResponseHandler`. On the next `poll()` this kicks off\n`ensureActiveGroup()` → `startHeartbeatThreadIfNeeded()` →\n`heartbeat.resetTimeouts()`, and the consumer recovers on its own.\n`GroupAuthorizationException` is left as-is since rejoining on an ACL\ndenial would just loop.\n\nUnit test and validation with the reproducer:\n\n| Scenario | CPU | Generation |  | --- | --- | --- |  | Before fix |\n~101% (sustained) | Stuck at 5 |  | After fix | ~0.3% | 5 → 15 (rejoin)\n|\n\nThanks to @mstruk for the detailed report and the reproducer.\n\nThis change targets the Classic consumer; the related AsyncKafkaConsumer\nissue is handled separately in #21714.\n\nReviewers: Evan Zhou \u003cezhou@confluent.io\u003e, Andrew Schofield\n \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "226ce2d8354694625ce98c7213df724f6fead22e",
      "tree": "590fcf7d257ece9074ef0e06347dd9c7e4f9e254",
      "parents": [
        "6784c621e16117734d04436f6788cc050c0033f3"
      ],
      "author": {
        "name": "Mickael Maison",
        "email": "mimaison@users.noreply.github.com",
        "time": "Mon Jul 27 14:16:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 14:16:02 2026 +0200"
      },
      "message": "KAFKA-20832: Fix cordon logic with user specified assignments (#22926)\n\nFix the createTopics, createPartitions and alterPartitions code paths\n\nReviewers: Paolo Patierno \u003cppatierno@live.com\u003e, Gaurav Narula\n \u003cgaurav_narula2@apple.com\u003e, Luke Chen \u003cshowuon@gmail.com\u003e"
    },
    {
      "commit": "6784c621e16117734d04436f6788cc050c0033f3",
      "tree": "68c557a6c563bb9aa73a619f37fc2efda7ec415f",
      "parents": [
        "6455a7b85750e3341361d1eb5c7064e7ec6a30ba"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Mon Jul 27 17:21:18 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 12:51:18 2026 +0100"
      },
      "message": "KAFKA-20809: Updated getting started docs with share group DLQ. (#22950)\n\n* Add overview of share group DLQ in `upgrade.md`.\n* Update `basic-kafka-operations.md` with a new section on configuring\nshare groups with DLQ.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "6455a7b85750e3341361d1eb5c7064e7ec6a30ba",
      "tree": "58338ca9c81282c8c0ee38b0c4a25895812d2cba",
      "parents": [
        "bf49716f25b9467fe0a97e131e9e4a400d028a4d"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Mon Jul 27 11:51:39 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 11:51:39 2026 +0200"
      },
      "message": "KAFKA-19686: Trigger docker builds with rc and release in release script (#21963)\n\n- new file `release/gh_actions.py` wraps gh actions using pygithub\n- new `trigger_docker_workflows()` in `release/release.py`, invoked\nafter `git.push_ref(rc_tag)` (happens in 2 steps. build and push)\n- gh personal access token is cached in `.release-settings.json`\n- token generation steps are in readme\n- reqs adds new import PyGithub\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "bf49716f25b9467fe0a97e131e9e4a400d028a4d",
      "tree": "ffd41a4a0a537e7d3de92a8b4676e6f3a9ee6f35",
      "parents": [
        "205b70af944be4a9620f2df035f4b96469bdd506"
      ],
      "author": {
        "name": "Ritikj55",
        "email": "54116064+Ritikj55@users.noreply.github.com",
        "time": "Mon Jul 27 14:38:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 10:08:41 2026 +0100"
      },
      "message": "KAFKA-19491 CONSUMER protocol metrics documentation (#22684)\n\nDescription \nAdded documentation for new consumer metrics related to the CONSUMER\nprotocol implementation\n\nBelow are metrics for which documentation has been added :\n\n1. time-between-network-thread-poll\n2. application-event-queue-size\n3. application-event-queue-time-avg\n4. application-event-queue-processing-time-avg\n5. application-events-expired-count\n6. background-event-queue-size\n7. background-event-queue-time-avg\n8. background-event-queue-processing-time-avg\n9. unsent-requests-queue-size\n10. unsent-requests-queue-time-avg\n\nTesting : \nTested using javascript  wrapper in local for checking indentation\n\n\n\u003cimg width\u003d\"1250\" height\u003d\"494\" alt\u003d\"image\"\nsrc\u003d\"https://github.com/user-attachments/assets/bcfbecbe-fadb-4f5c-a289-c8b03e3b1f76\"\n/\u003e\n\nReviewers: Sushant Mahajan \u003csmahajan@confluent.io\u003e, Andrew Schofield\n\u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "205b70af944be4a9620f2df035f4b96469bdd506",
      "tree": "44834f6152c4da340ced44edd53871ac5f7ad9f1",
      "parents": [
        "ae9cf0f26925a4ee3f2aebedd71845f7d77a1d62"
      ],
      "author": {
        "name": "Gabriel Dutra",
        "email": "gvdutra@gmail.com",
        "time": "Mon Jul 27 01:53:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 09:53:25 2026 +0100"
      },
      "message": "KAFKA-12570: Document compact arrays in flexible versions (#22862)\n\n## What changed\n\n- explain that flexible message versions use compact encodings for\nvariable-length fields\n- explicitly document that arrays use `COMPACT_ARRAY` instead of `ARRAY`\n- mention the related compact string and byte-array encodings,\nvariable-length length prefix, and tagged-fields section\n\n## Why\n\nThe protocol primitive-type table lists compact encodings but did not\nexplain when clients must use them. This left implementers to infer that\nflexible message versions use `COMPACT_ARRAY` and the other `COMPACT_*`\ntypes.\n\n## Impact\n\nClient implementers can now determine the correct array encoding for\nflexible message versions directly from the wire-protocol guide.\n\n## Validation\n\n- `./gradlew siteDocsTar`\n- `git diff --check`\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\nCo-authored-by: gabrieldutra \u003cgdutra3@gatech.edu\u003e"
    },
    {
      "commit": "ae9cf0f26925a4ee3f2aebedd71845f7d77a1d62",
      "tree": "626d39d116ba59bb5cc0dbe59a14340fc5652604",
      "parents": [
        "19815b82ce6b9281c1f42ef964aa226800809d90"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Mon Jul 27 13:18:36 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 08:48:36 2026 +0100"
      },
      "message": "KAFKA-20723: Resolve DLQ copy records per produce round. (#22919)\n\n* ShareGroupDLQStateManager previously resolved a DLQ record parameter\u0027s\nentire archived offset range once, eagerly, before the handler was even\nenqueued to send - capping total copyable content at roughly one\nmessage\u0027s worth (regardless of how many produce requests the range\nneeded) and delaying the first produce request until the whole range,\nincluding any remote-tiered reads, had been read.\n* Move to resolving one produce round at a time instead: resolveRound()\nnow fetches only the window starting at nextOffsetToSend, with a fresh\ndecompression budget per round, and handleProduceResponse() resolves the\nnext round before rejoining the coalescing node map. This lets a large\nrange recover real content across every round it needs, and lets the\nfirst produce request go out as soon as its own round resolves.\n* Also harden two related failure paths surfaced while working through\nthis: an uncaught exception from one handler\u0027s onComplete() no longer\nprevents other handlers sharing the same coalesced produce response from\nbeing notified (each is now wrapped via completeHandlerSafely(), with\nits own future explicitly failed if it throws), and resolveRound() no\nlonger lets a synchronous exception from maybeFetchRecordData() escape\ninto a RequestCompletionHandler callback, where depending on the\nresponse-delivery path it wasn\u0027t guaranteed to be caught before reaching\nthe broker\u0027s fatal-error handling.\n* Separately, in ShareGroupDLQRecordFetcher, tighten the decompression\nbudget accounting the round-based design depends on: the fetch now stops\nonce enough content has been collected.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e, Apoorv Mittal\n \u003capoorvmittal10@gmail.com\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "19815b82ce6b9281c1f42ef964aa226800809d90",
      "tree": "f405cb32c4c461a8e1e6ef6a8bdf54abec9b44c5",
      "parents": [
        "3978783370bb25ddc293a79e8f830334baea05c7"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Mon Jul 27 12:51:56 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 08:21:56 2026 +0100"
      },
      "message": "KAFKA-20410: Make KIP-1191 cluster configs dynamic. (#22949)\n\nKIP-1191 defines share group DLQ configs\n`errors.deadletterqueue.auto.create.topics.enable` and\n`errors.deadletterqueue.topic.name.prefix` as DYNAMIC cluster configs,\nwhich wasn\u0027t the case in the code base. This PR remedies the situation.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "3978783370bb25ddc293a79e8f830334baea05c7",
      "tree": "3ae3cceb930930c03ee478555947d2589cd7a7c5",
      "parents": [
        "908d4967362cdc1dbd4dead47574d31367f41516"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Mon Jul 27 13:54:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:54:43 2026 +0800"
      },
      "message": "KAFKA-20826 Fix EndToEndLatencyTest#testInvalidRecordHeaderValue (#22909)\n\n`testInvalidRecordHeaderValue` incorrectly treats -1 as invalid,\nalthough it represents a null header value.\n\nThis change uses -2 for the invalid case and validates options directly,\navoiding unnecessary Kafka client initialization and the resulting\nconnection timeout.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "908d4967362cdc1dbd4dead47574d31367f41516",
      "tree": "fd37cbaf69592d56212d22f7fdea3ef285dab09c",
      "parents": [
        "36a69b49c5b4bfdba775f54a9dc08bebde273081"
      ],
      "author": {
        "name": "PoAn Yang",
        "email": "payang@apache.org",
        "time": "Mon Jul 27 14:43:29 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 13:43:29 2026 +0800"
      },
      "message": "HOTFIX: Remove Time.SYSTEM from ProducerMetadata (#22953)\n\nFollowup from\nhttps://github.com/apache/kafka/pull/22083#issuecomment-5087539668\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "36a69b49c5b4bfdba775f54a9dc08bebde273081",
      "tree": "f308be38a169ccba8b041297df14dd6b19fc52b0",
      "parents": [
        "a3123b01ecac52306d603c54099fcaa498b5bea8"
      ],
      "author": {
        "name": "PoAn Yang",
        "email": "payang@apache.org",
        "time": "Mon Jul 27 12:19:44 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 11:19:44 2026 +0800"
      },
      "message": "KAFKA-16937 Inline Time#waitObject to ProducerMetadata#awaitUpdate (#22083)\n\nInline `Time#waitObject` to `ProducerMetadata#awaitUpdate` and use\n`Timer` in `ProducerMetadata#awaitUpdate`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Sean Quah\n \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "a3123b01ecac52306d603c54099fcaa498b5bea8",
      "tree": "89c6174143b36491811bdbdd4a9e43a0fc360aad",
      "parents": [
        "123356bad50da1418f42f2f675c963156d4bb78c"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Mon Jul 27 10:57:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 10:57:04 2026 +0800"
      },
      "message": "KAFKA-967 Use key range in ProducerPerformance (#22326)\n\nCurrently, kafka-producer-perf-test.sh only produces records with null keys, which makes it impossible to benchmark real-world keyed workloads (e.g., compacted topics, semantic partitioning, and stream joins). This PR implements KIP-1299 to introduce key generation support for the producer performance tool.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "123356bad50da1418f42f2f675c963156d4bb78c",
      "tree": "dcbe22e180a3842dde65dc5eebdf71992d18d4ae",
      "parents": [
        "a9fa6f7c715c46712d208df8faa976b6a12d3f34"
      ],
      "author": {
        "name": "Nikita Shupletsov",
        "email": "nikita@shupletsov.ca",
        "time": "Sun Jul 26 05:46:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 20:46:16 2026 +0800"
      },
      "message": "MINOR: Scala to Java migration. Migrated some tests from PlaintextAdminIntegrationTest to a new java class. (#22290)\n\nContributing to the bigger effort of migrating scala to java\n\nReviewers: Sushant Mahajan \u003csmahajan@confluent.io\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a9fa6f7c715c46712d208df8faa976b6a12d3f34",
      "tree": "63783275bc4328a350153f141f370fe79f4359f1",
      "parents": [
        "34e04e35e057b22ec6b43d3ffbc73c037b7ce093"
      ],
      "author": {
        "name": "red-flames",
        "email": "hjtiun852@gmail.com",
        "time": "Sun Jul 26 13:12:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 13:12:15 2026 +0800"
      },
      "message": "KAFKA-20830 Speed up testFailToStartWhenInternalTopicsAreNotCompacted (#22931)\n\nThe test uses REST to verify the health of a dead worker, but the\ndefault timeout is 10 seconds. That means it takes 30 seconds (3 * 10\nseconds) to complete all verifications for a run. So we add\nconnect.requestTimeout(1000) to speed it up. The timeout has to be set\nafter every addWorker() call since a new worker starts with the default\ntimeout.\n\nLocally this cuts the test time from 1m41.50s to 20.802s (times taken\nfrom the JUnit report). The ~81s difference matches the expected saving:\n9 health checks (3 rounds x 3 assertions) x 9s shorter timeout.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "34e04e35e057b22ec6b43d3ffbc73c037b7ce093",
      "tree": "2bdb3a4d461010baf8dc174d1748f998a33f22e5",
      "parents": [
        "cba250ead18e8fa72dbf3b7539e1bed76fb6fce2"
      ],
      "author": {
        "name": "Uladzislau Blok",
        "email": "blokv75@gmail.com",
        "time": "Sun Jul 26 03:24:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 18:24:25 2026 -0700"
      },
      "message": "KAFKA-20412: Fix prefixScan for KV-Store with headers (#21971)\n\nPart of KIP-1271.\n\nThis PR closes a gap in headers passing. For `prefixScan`, we are not\nyet correctly passing\nHeaders into the serdes.\n\nApproach is similar to\n`MeteredTimestampedKeyValueStoreWithHeaders#delete(key)`\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, Matthias J. Sax\n\u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "cba250ead18e8fa72dbf3b7539e1bed76fb6fce2",
      "tree": "1a817b48159ee49b0fe682e0ec188e086cc8dc92",
      "parents": [
        "b91561ac8ab325986a80e34ee20864e5d5392327"
      ],
      "author": {
        "name": "Uladzislau Blok",
        "email": "blokv75@gmail.com",
        "time": "Sun Jul 26 03:15:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 18:15:28 2026 -0700"
      },
      "message": "KAFKA-20197: Headers aware StreamPartitioner (#22570)\n\nImplementation for header-aware partitioners (KIP-1321).\n\nThis PR allows to pass in a records `Headers` object into\n`StreamPartitioner`.\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, Matthias J. Sax\n\u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "b91561ac8ab325986a80e34ee20864e5d5392327",
      "tree": "d2fad149521076e099dffc6a9ccb83a1ab47285f",
      "parents": [
        "3ab2c3e62029cdaf5a073b67d8479e67541d2910"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Sat Jul 25 21:07:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 18:07:58 2026 -0700"
      },
      "message": "KAFKA-20744: Add back `rack.aware.assignment.tags` config (#22213)\n\nThis PR adds broker- and client-side plumbing for `rack.aware.assignment.tags`\nto support rack-aware standby task assignment in Kafka Streams (new \nstream\" group protocol via KIP-1071). This PR does not include the assignor\nlogic change -- only  the config propagation and client-side validation.\n\nAdds `group.streams.rack.aware.assignment.tags` as a broker-level config\nwith a per-group override `streams.rack.aware.assignment.tags`. Adds\nRackAwareAssignmentTags field to the StreamsGroupHeartbeatResponse\nRPC schema and populate it in the heartbeat response. On the client\nside, compares the broker\u0027s required tags against the client\u0027s client.tag.*\nkeys and logs a WARN for any missing tags.\n\nReviewers: ChickenchickenLove (@chickenchickenlove ), Lucas Brutschy\n\u003clbrutschy@confluent.io\u003e, Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "3ab2c3e62029cdaf5a073b67d8479e67541d2910",
      "tree": "1fbce52c2d6c8c3572b9c1669c0a688c6586dc06",
      "parents": [
        "a1d9d8a5175600ec01b9fd07cef038c63c6dcc47"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Sun Jul 26 08:46:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 08:46:57 2026 +0800"
      },
      "message": "KAFKA-20553 Use ClusterInstance for streams ResetIntegrationTest (#22871)\n\nFollowup from:\nhttps://github.com/apache/kafka/pull/22521#discussion_r3491032876\n\nMigrate the streams group command integration tests from\nEmbeddedKafkaCluster to the ClusterInstance test framework:\n\n- ResetIntegrationTest.java\n- AbstractResetIntegrationTest.java\n- ResetIntegrationWithSslTest.java\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a1d9d8a5175600ec01b9fd07cef038c63c6dcc47",
      "tree": "70c6813a307ae3c3b093aa56c3e3b69226513159",
      "parents": [
        "be319eacb86d5c3170c347421acf4010a916f086"
      ],
      "author": {
        "name": "Adam Souquières",
        "email": "asouquieres@korfinancial.com",
        "time": "Sat Jul 25 05:07:47 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 20:07:47 2026 -0700"
      },
      "message": "KAFKA-20829: Throttle StreamThread shutdown rebalance enforcement to avoid log flood (#22917)\n\nWhen a Kafka Streams application requests an app-wide shutdown, every\nStreamThread on the classic rebalance protocol floods the log with:\n`Request joining group due to: Shutdown requested`\n\nThis PR gates the `enforceRebalance` call behind the existing 10s\nthrottle that already guards  WARN logs, so both fire together at most\nonce per 10s.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "be319eacb86d5c3170c347421acf4010a916f086",
      "tree": "6a2aa337d6ad8750e15cf754ee35e38d5b4d432f",
      "parents": [
        "9533d788d8ec0e955ee5caeeb9d6e36cd220fa7d"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Sat Jul 25 07:55:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 07:55:59 2026 +0800"
      },
      "message": "MINOR: Remove testImplementation storage:storage-api (#22924)\n\nSee the comment:\nhttps://github.com/apache/kafka/pull/22903#issuecomment-5068682305\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "9533d788d8ec0e955ee5caeeb9d6e36cd220fa7d",
      "tree": "b135301a3aa4903ee7b9e8b656b075ec2baea66a",
      "parents": [
        "f4c3454b220545c4a17908f7583a765c95cb606d"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Sat Jul 25 07:54:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 25 07:54:19 2026 +0800"
      },
      "message": "KAFKA-20553 Prevent modules from depending on core test output (#22564)\n\nThis patch adds core to `protectedModules` to prevent modules from\ndepending directly on `core.sourceSets.test.output.`\n\nThe existing dependencies were removed in separate PRs. This validation\nprevents them from being reintroduced and helps unblock the upgrade to\nGradle 9.5+.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "f4c3454b220545c4a17908f7583a765c95cb606d",
      "tree": "c8395d66ad357ccaeb8de51a30c665140b7dd625",
      "parents": [
        "e51258d9e8fe43671fc1134d024015792a42fec8"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Fri Jul 24 18:29:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 18:29:39 2026 -0400"
      },
      "message": "KAFKA-20827: don\u0027t re-create an already-owned task on assignment (#22925)\n\nA task that fails to (re)initialize is left owned (registered and\nflagged failed) to be reconciled via the corruption/failed-task path. It\nis excluded from handleAssignment\u0027s rectify-existing pass (which\niterates only non-failed tasks), so the next assignment builds a SECOND\nrepresentation of it in createNewTasks; that duplicate fails init and\ntrips the single-owner invariant in Tasks.addStandbyTask/addActiveTask\n(IllegalStateException: \u0027Attempted to create an standby task that we\nalready own\u0027), killing the StreamThread from an otherwise recoverable\npath.\n\ncreateNewTasks now skips creating any task the registry already owns\n(including failed ones), so the duplicate is never built and the\nsingle-owner invariant stays strict. Adds a TaskManagerTest regression\ntest.\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "e51258d9e8fe43671fc1134d024015792a42fec8",
      "tree": "2fe5ca9dab7e58ca26218c4d7e66474d0d4ebba2",
      "parents": [
        "2699fc40748da5ce9dc4b6aac41687fbc603ab1d"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Fri Jul 24 14:06:53 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 11:06:53 2026 -0700"
      },
      "message": "KAFKA-20790: Promote streams assignor API to public module (#22788)\n\nPart of KIP-1357.\n\nThis PR adds the newly defined public API as defined in KIP-1357 to\nsupport  customer broker side \"streams\" task assignors. It also\nrefactors the existing  runtime code and StickyTaskAssignor to\nuse/implement the new public APIs.\n\n`org.apache.kafka.coordinator.group.api.assignor.streams` (in\n`group-coordinator-api`), all annotated with `@InterfaceAudience.Public`\nand `@InterfaceStability.Evolving`.\n\nAlso fixes a latent bug: the old code incorrectly passed the old target\nassignment into the assignor. This PR now ensures that we correctly pass\nthe current assignment instead.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e, Sean Quah\n \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "2699fc40748da5ce9dc4b6aac41687fbc603ab1d",
      "tree": "ff8adf9c59b8d09b4c96646817804d1b346a4258",
      "parents": [
        "9f15f3c540eccfbff4dd4cc4bcb93e2e55750185"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Fri Jul 24 18:03:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 18:03:41 2026 +0800"
      },
      "message": "KAFKA-20553 Remove clients-integration-tests dependency on core test output (#22884)\n\nThis PR removes the `clients:clients-integration-tests` dependency on\nthe core test output by replacing usages of `kafka.utils.TestUtils` in\n`ProducerCompressionTest` and `ProducerIdExpirationTest`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "9f15f3c540eccfbff4dd4cc4bcb93e2e55750185",
      "tree": "aac9b73e4171a7fd1b7e04ee2cbd441a78a68be3",
      "parents": [
        "c0579dbfb418092bf92caf1054bb1339e6921318"
      ],
      "author": {
        "name": "Xi",
        "email": "gxtogether@gmail.com",
        "time": "Fri Jul 24 02:40:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 15:10:39 2026 +0530"
      },
      "message": "KAFKA-20804: Reduce lock contention in ProducerMetadata#add (#22810)\n\n## Summary\nadd() is called on every send() via KafkaProducer.waitOnMetadata, and\nthe synchronized method acquiring the instance lock causing synchronized\ncontention which impacts the performance.\n\nSwitch the topics map to a ConcurrentHashMap and refresh known topics\nvia a lock-free replace(), which only writes if the topic is still\npresent. For a topic seen for the first time (or one concurrently\nevicted by retainTopic()), fall back to a synchronized block so the map\ninsert and newTopics bookkeeping happen atomically with retainTopic() -\notherwise retainTopic() could expire-and-remove the topic in the gap\nbetween the two, leaving it recorded in newTopics without the\ncorresponding map entry, or silently re-inserting an evicted topic\nwithout the newTopics bookkeeping needed to trigger an immediate\nrefresh.\n\nretainTopic() switches to a conditional remove(topic, expireMs) so a\nconcurrent refresh of an existing topic in add() can\u0027t be undone by an\neviction decision based on the expiry value read just before the refresh\nlanded.\n\n## Testing\n- Adds ProducerMetadataTest#testRetainTopic for direct coverage of\nretainTopic()\u0027s branches.\n- Adds a JMH benchmark (ProducerMetadataAddBenchmark) comparing add()\nbefore and after the change.\n\nBenchmark result:  With 8 threads concurrently refreshing a shared pool\nof 200 already-tracked topics:  │ Commit │ Throughput (ops/ms) │    │\nBefore (fully-synchronized add()) │ 5838.871 ± 825.545 │    │ After\n(lock-free refresh path) │ 10951.748 ± 3325.858 │  ~1.88x higher\nthroughput under this contention pattern.\n\nReviewers: Kamal Chandraprakash \u003ckamal.chandraprakash@gmail.com\u003e, Gaurav\n Narula (github:gnarula), faheedy_ (github:1230fahid)"
    },
    {
      "commit": "c0579dbfb418092bf92caf1054bb1339e6921318",
      "tree": "dbec73ecabe215ee7d7ea19dae009d63652abc2e",
      "parents": [
        "362a0371c6e34e12830b666045f4ff0d283e3fe4"
      ],
      "author": {
        "name": "Sepuri Sai Krishna",
        "email": "saik20533@gmail.com",
        "time": "Fri Jul 24 11:01:20 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 22:31:20 2026 -0700"
      },
      "message": "KAFKA-20769: ListDeserializer can silently deserialize a corrupted entry when the input is truncated mid-entry (#22755)\n\nListDeserializer.deserialize is using DataInputStream.read(byte[]) which\nmay return \"early\" if the stream is shorter than expected (ie, cannot\nfill  the provided `byte[]` array) w/o error. This can lead to a\ncorrupted  deserialization result.\n\nThis PR switches to DataInputStream.readFully, which throws EOFException\nwhen the buffer cannot be filled.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "362a0371c6e34e12830b666045f4ff0d283e3fe4",
      "tree": "637a37c1695f32923154a2c0d6db851f6602194b",
      "parents": [
        "f324cb595910d42a402daaa3fa18f44bd0534765"
      ],
      "author": {
        "name": "Mingi Cho",
        "email": "81455273+ChoMinGi@users.noreply.github.com",
        "time": "Fri Jul 24 06:38:39 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 17:38:39 2026 -0400"
      },
      "message": "KAFKA-20198: Fix StickyTaskAssignor capacity calculation to use proportional instance limit (#22006)\n\n[KAFKA-20198](https://issues.apache.org/jira/browse/KAFKA-20198)\n\nSaw the discussion on Confluent Slack about `StickyTaskAssignor` taking\nmany rebalance rounds to converge with the classic group protocol when\nscaling up. Dug into it and found the root cause in\n`hasRoomForActiveTask`.\n\nThe per-instance limit is computed as `capacity * (taskCount /\ntotalCapacity)`, but the integer division floors — so with 450 tasks and\n20 threads, each instance gets a limit of `10 * 22 \u003d 220` instead of the\nfair share 225. The 10-task gap pushes overflow into\n`findBestClientForTask`, which picks differently each round due to\nHashMap iteration order, creating a feedback loop that prevents\nconvergence.\n\nFixed by computing the instance limit directly as a proportional share:\n`(taskCount * capacity + totalCapacity - 1) / totalCapacity`, giving\n`ceil(450 * 10 / 20) \u003d 225`. Same approach as\n`AbstractStickyAssignor.maxQuota`.\n\nSimulated with the actual `StickyTaskAssignor` across cooperative\nrebalance rounds:\n\n| Scenario | Before | After | |----------|--------|-------| | 450p/10t |\n5 rounds | 2 rounds | | 100p/4t | 4 rounds | 2 rounds | | 200p/8t | 6\nrounds | 2 rounds | | 1000p/16t | 9 rounds | 5 rounds | | 500p/12t | 9\nrounds | 3 rounds | | Even cases | 2 rounds | 2 rounds |\n\nAll existing tests pass.\n\nReviewers: gabriellafu (github:gabriellefu), Hari Mohan (github:harimm),\n Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "f324cb595910d42a402daaa3fa18f44bd0534765",
      "tree": "15fb5be30b6cfb2b6c45c1d8b3228e1b1433db06",
      "parents": [
        "805eb7b260be7d4670ad39180c99aae3d991b4ab"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Thu Jul 23 14:34:02 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 14:34:02 2026 -0400"
      },
      "message": "MINOR: Set StreamThread to non-daemon status (#22902)\n\nThis PR sets\n\n1. `StreamThread` `daemon\u003dfalse`\n2. `GlobalStreamThread` `daemon\u003dfalse`\n3. `StateUpdaterThread` `daemon\u003dtrue`\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "805eb7b260be7d4670ad39180c99aae3d991b4ab",
      "tree": "bf48881b64677bdadab122a8013e0040ba9c83a8",
      "parents": [
        "5a018810d42742615b83155a60086047c6611dfd"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Thu Jul 23 21:16:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 16:46:03 2026 +0100"
      },
      "message": "KAFKA-20723: Bound decompression memory in ShareGroupDLQRecordFetcher (#22905)\n\n### What\n\nA compressed source record could decompress to far more data than its\non-wire size suggests, since the previous implementation fully\nmaterialized a compressed batch via `DefaultRecordBatch.iterator()` and\nallocated per-record buffers based on an unchecked, attacker-controlled\nlength.\n\n### How\nCompressed v2 batches are now decompressed into a size-capped\nbuffer before any record is parsed, so even a single oversized record\ncan\u0027t force a large allocation; the cap is derived from the DLQ topic\u0027s\nown `max.message.bytes` rather than an arbitrary constant. Uncompressed\nbatches are left uncapped (no expansion risk), and fetch()/resume() now\ncatch Throwable so an OOM can\u0027t escape uncontained.\n\n### Testing\nAdded new unit tests in `ShareGroupDLQRecordFetcherTest` and integ tests\nin `ShareConsumerDLQTest`.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e Reviewers:\nAndrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "5a018810d42742615b83155a60086047c6611dfd",
      "tree": "19b77e30121a46af68eb6af1edcf18dbfe0fd783",
      "parents": [
        "9f692648b3cfe0df9c5a9c61220dcc885900d449"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Thu Jul 23 13:03:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 13:03:59 2026 +0800"
      },
      "message": "MINOR: Fix typo in build.gradle and dependencies.gradle (#22916)\n\nFix the `junitPlatformLanucher` typo in the Gradle dependency alias.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "9f692648b3cfe0df9c5a9c61220dcc885900d449",
      "tree": "a537fd9bf3fff3e374fe33bc9b4dd70c1bf230d8",
      "parents": [
        "c300006a7705c240642db6950b5a95fec982bfc5"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Thu Jul 23 12:33:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 12:33:41 2026 +0800"
      },
      "message": "KAFKA-20553 Remove tools module dependency on core test output (#22899)\n\nThis PR removes the `tools` module dependency on the core test output by\nreplacing usages of `kafka.utils.TestUtils` in\n`ConfigCommandIntegrationTest`, `ConsoleProducerTest`,\n`DumpLogSegmentsTest`, and `ReplicationQuotasTestRig`.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "c300006a7705c240642db6950b5a95fec982bfc5",
      "tree": "66807663e05e66cd0ad48e8d482a77b98ffd6058",
      "parents": [
        "13f5dd3451e6565e8ce2ed1a8dff439fd460bd2a"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Wed Jul 22 19:01:07 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 16:01:07 2026 -0700"
      },
      "message": "KAFKA-20695: Extend \"describe group\" to return \"task offset\" metadata (#22808)\n\nUnder KIP-1071, Streams group members report their per-task cumulative\nchangelog offsets (`taskOffsets`) and end offsets (`taskEndOffsets`)\nto the group coordinator via the `StreamsGroupHeartbeat` RPC,\nand the coordinator keeps the latest reported values in memory.\n\nThis PR exposes those stored offsets through the `StreamsGroupDescribe`\nRPC /\n`Admin.describeStreamsGroups(...)`. These offsets are transient and not\npersisted (per KIP-1071), so they are read from the latest in-memory\nstate\nrather than at the committed offset. A member that has not reported\noffsets,\nor an empty group, describes as empty lists.\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, Matthias J. Sax\n\u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "13f5dd3451e6565e8ce2ed1a8dff439fd460bd2a",
      "tree": "5abb90d4c297f61d4feb6786529a2e0ce11c0d56",
      "parents": [
        "3c257464fe4c2e83d85c13d611546e28f09f967c"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Thu Jul 23 06:33:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 06:33:58 2026 +0800"
      },
      "message": "MINOR: Cleanup build.gradle unused dependency (#22903)\n\nCleanup unused dependencies in `build.gradle`\n\n1. `libs.spotbugs`: he SpotBugs Gradle plugin performs static analysis\nusing its own bundled jar, it does not require this compile-time\ndependency.\n2. `libs.jacksonJDK8Datatypes`: Jackson 2.15+ baked Optional support\ndirectly into jackson-databind core.\n3. `libs.jmhCoreBenchmarks`: Benchmarks only use jmh-core (annotations,\nBlackhole, Runner) and jmh-generator-annprocess. No source file imports\nanything from the org.openjdk.jmh.samples or benchmarks package.\n4. `libs.bndlib`: Safely removed as no modules currently depend on it.\n5. `libs.jacksonDataformatYaml` \u0026 `libs.junitPlatformLanucher`: Removed\nfrom individual submodules because they are already globally included in\nthe runtimeTestLibs array.\n6. `libs.caffeine` \u0026 `libs.hdrHistogram`: group-coordinator does not use\nthem\n7. `libs.jacksonDataformatCsv`, `libs.jacksonJakartarsJsonProvider`, and\n`libs.junitPlatformSuiteEngine`: Removed from specific modules as they\nare either no longer directly imported or handled implicitly\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "3c257464fe4c2e83d85c13d611546e28f09f967c",
      "tree": "9c3536c43f6c04530deb719068e580edc49af846",
      "parents": [
        "3d48cb3fa1f08794fe0c6ac3b89492f0f2ddbbe0"
      ],
      "author": {
        "name": "Lucy Liu",
        "email": "lucliu@confluent.io",
        "time": "Wed Jul 22 12:04:21 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:04:21 2026 -0700"
      },
      "message": "MINOR: Fix KStream leftJoin doc and test param naming for KStream-GlobalKTable  (#22889)\n\nThis PR fixes:\n- Wrong description regarding leftJoin(GlobalKTable, ...) Javadoc when\nkeySelector is null\n- Wrong param ordering for ValueJoinerWithStreamAndMappedKey for 2 unit\ntests\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "3d48cb3fa1f08794fe0c6ac3b89492f0f2ddbbe0",
      "tree": "b5991f0cdf7c8631716861cac876c45e04365c68",
      "parents": [
        "e9eef5275f4cf586699a07301c4a76426f514942"
      ],
      "author": {
        "name": "Sebastien Viale",
        "email": "sebastien.viale@michelin.com",
        "time": "Wed Jul 22 19:03:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 10:03:03 2026 -0700"
      },
      "message": "KAFKA-19871: Update test with new TopologyTestDriverBuilder (#22892)\n\nAs part of KIP-1238: Multi-partition support in TopologyTestDriver, the\nTopologyTestDriverBuilder was introduced and the existing\nTopologyTestDriver constructors were deprecated.\n\nThis PR migrates the test suite to use the new builder API instead of\nthe deprecated constructors, ensuring that the tests remain aligned with\nthe new public API and preparing for the eventual removal of the\ndeprecated constructors.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "e9eef5275f4cf586699a07301c4a76426f514942",
      "tree": "4b8ea69b2e4c2c5a88dee07017cadd06ee50480a",
      "parents": [
        "0ed2ce8c6c40342dcb1a5c9aff12f961c018ee45"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Jul 22 15:02:01 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 15:02:01 2026 +0200"
      },
      "message": "MINOR: bump jline to 3.30.16 (#22906)\n\nSee [KAFKA-20815](https://issues.apache.org/jira/browse/KAFKA-20815) and\nhttps://github.com/apache/kafka/pull/22898#discussion_r3629242510\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Mickael Maison\n \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "0ed2ce8c6c40342dcb1a5c9aff12f961c018ee45",
      "tree": "911d83e2102e5ab4e7dd2366ab0b49c6a6dfa7ae",
      "parents": [
        "df0392fd64bb71de2046855050603a36246a4179"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Wed Jul 22 18:07:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 18:07:13 2026 +0800"
      },
      "message": "MINOR: Reduce DescribeStreamsGroupTest execution time (#22885)\n\nThis is a follow-up to:\nhttps://github.com/apache/kafka/pull/22701#issuecomment-5017052320\n\n`ClusterTest` creates and stops a cluster for every annotated test\nmethod.  After migrating `DescribeStreamsGroupTest` to\n`ClusterInstance`, the test  class execution time increased\nsignificantly because each describe scenario  created its own cluster,\ntopics, and Kafka Streams application.\n\nThis change combines the live streams-group describe scenarios into a\nsingle  `ClusterTest`. The two topics and Kafka Streams applications are\nstarted once,  and the existing assertions are executed against the\nshared test setup.\n\nThe non-existing group test remains separate because it does not require\na  Kafka Streams application and retaining it as an independent test\nprovides  clearer failure reporting.\n\nNo test coverage or option-order validation is removed.\n\nPerformance measured from the Gradle test report:\n\n- Before: 61.551s\n- After: 15.529s\n- Reduction: approximately 74.8%\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "df0392fd64bb71de2046855050603a36246a4179",
      "tree": "c284bf50db8917eaf8af5084f21b99e5c82619f9",
      "parents": [
        "cb2f143b0df9b692d6b3a8dacf9b99cec2b1cad1"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Jul 22 11:00:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 11:00:04 2026 +0200"
      },
      "message": "KAFKA-20815: Remove unnecessary jline deps and bump to latest 3.x (#22898)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "cb2f143b0df9b692d6b3a8dacf9b99cec2b1cad1",
      "tree": "bd38df663dd65ad7a2d08e96a1a3dee9d68a62c7",
      "parents": [
        "ebac341b28d4224c296ada31eb45122176e8b27b"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Wed Jul 22 10:49:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 16:49:30 2026 +0800"
      },
      "message": "KAFKA-20673 Skip stale-leader lookup retry while the AdminClient is closing (follow-up) (#22529)\n\nFollow-up to KAFKA-20673 (#22493). That change lets the AdminClient\nrecover a partition-leader request whose cached leader has left the\ncluster by sending the keys back to the lookup stage from the admin\nclient thread. The re-lookup is enqueued through the runnable, which\nrejects new calls once close() has been initiated, failing them with\n\"Cannot accept new calls when AdminClient is closing\". As a result, a\nrequest that took this recovery path during the close(timeout) grace\nperiod would fail immediately instead of being retried until the\ndeadline, even though the user asked for a grace period.\n\nThis change skips the recovery while the client is shutting down.\nhandleNodeUnavailable returns false once a hard shutdown time has been\nset, so the call is left in pendingCalls and follows the normal\nclose(timeout) handling: it can still be retried, or assigned if the\nbroker reappears, within the shutdown grace period rather than being\nkilled instantly. The behaviour outside of shutdown is unchanged.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "ebac341b28d4224c296ada31eb45122176e8b27b",
      "tree": "902f61179268c01aa9d739a6c661dc7b52e06743",
      "parents": [
        "974afa23d5ef942feace0cd24c2ae5a801833421"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Tue Jul 21 15:37:46 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 14:37:46 2026 +0100"
      },
      "message": "KAFKA-20278 : streams - Refactor setup pattern, PART-1 (#21754)\n\nNote : This pr is just part 1 of KAFKA-20278\n\nRefactor setup pattern : multiple things - create builder, add state\nstore, add stream, add processor, build topology, create KafkaStreams,\nstart\n\nIntroduced two reusable helper methods\n- buildAndStart\n- assertDowngradeThrowsProcessorStateException\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, TengYao Chi\n \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "974afa23d5ef942feace0cd24c2ae5a801833421",
      "tree": "51784340a3b36383ee58d857e7645ad07f955d10",
      "parents": [
        "8fc539cb383c34e44bdb31721e0643faf453b8e6"
      ],
      "author": {
        "name": "Gaurav Narula",
        "email": "gaurav_narula2@apple.com",
        "time": "Tue Jul 21 13:19:44 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 20:19:44 2026 +0800"
      },
      "message": "KAFKA-19584 add SecurityManager shim support to native image (#22379)\n\nKAFKA-17078 introduced a shim for SecurityManager to handle the removal\nof SecurityManager from JDK 23.\n\nThis shim relies on reflection to load `legacy` and `modern` classes at\nruntime. Unfortunately, the native image\u0027s reachability metadata was not\nupdated to account for this reflective access.\n\nThis change fixes the regression and updates reflect-config.json\nappropriately.\n\nReviewers: Jose Ignacio Gil Jaldo \u003cnaranja82@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "8fc539cb383c34e44bdb31721e0643faf453b8e6",
      "tree": "d1d87abfc68fd6d7840d5ecc436e6ebeea43be05",
      "parents": [
        "b68bb0da27b2798213d2738bc4dfe95ccd8243a4"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Tue Jul 21 12:02:58 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 12:02:58 2026 +0100"
      },
      "message": "KAFKA-20783: Minor change to include try/finally block for locks release (#22891)\n\nGuard the remaining handleFetchException error paths with try-finally so\na throw from the exception handling cannot leak the partition locks.\n\nReviewers: Abhinav Dixit \u003cadixit@confluent.io\u003e, Andrew Schofield\n \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "b68bb0da27b2798213d2738bc4dfe95ccd8243a4",
      "tree": "42bb601c1c3f8187b37d96128836c5ff747185dd",
      "parents": [
        "eac5d5716e3a901d5607d5fbe18d64c098918e7c"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Mon Jul 20 23:10:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 14:10:21 2026 +0800"
      },
      "message": "MINOR: increase build timeout to 3.5 hours (#22887)\n\nCurrent p95 build time is about 2:50h, and we did see an increased\nnumber of PR build failures due do hitting the current 3h limit.\n\nAs a short term solution, this PR increases the timeout to 3.5h. We\nshould work with INFRA to maybe get better hardward to reducee the\nruntime.\n\nReviewers: Bill Bejeck\u003cbbejeck@gmail.com\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "eac5d5716e3a901d5607d5fbe18d64c098918e7c",
      "tree": "3f7a9782d636668a3cc2dc4c4ff30abaa3fb39bb",
      "parents": [
        "01ba1b2d4db7ce14dd4df7bc71dbb97db75e2666"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Tue Jul 21 14:06:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 14:06:29 2026 +0800"
      },
      "message": "KAFKA-20553 Remove storage dependency on core test output (#22854)\n\nThis PR removes the `storage` module\u0027s dependency on the `core` test\noutput.\n\nThe remaining usages of `kafka.utils.TestUtils` are replaced by:\n\n- Using empty `Properties` instances in `RemoteLagCopyTest` and\n`RemoteLogManagerTest`, since the required remote log manager properties\nare added by `appendRLMConfig`.\n- Using `org.apache.kafka.test.TestUtils.tempDirectory()` in\n`TieredStorageTestUtils`.\n\nWith these usages removed, the following dependency is no longer\nrequired:\n\n```gradle\ntestImplementation project(\u0027:core\u0027).sourceSets.test.output\n```\n\nThe dependency on the `core` main output is retained because the storage\ntests still use broker classes from that module.\n\n### Testing\n\n```bash\n./gradlew :core:clean :storage:clean :storage:test --rerun-tasks\n--no-build-cache\n```\n\nAll storage tests passed.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "01ba1b2d4db7ce14dd4df7bc71dbb97db75e2666",
      "tree": "209c8817f2e79badadaf136aff88b398b312d554",
      "parents": [
        "524ef3b42e70a60ce3934f424c6858168491cb54"
      ],
      "author": {
        "name": "David Simon",
        "email": "6491976+david-simon@users.noreply.github.com",
        "time": "Tue Jul 21 07:48:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 13:48:19 2026 +0800"
      },
      "message": "MINOR: Fix RandomAccessFile leak in FileRecords.openChannel (#22878)\n\n`randomAccessFile` is leaked when `setLength` throws. This change wraps\nthe call in a try-catch that closes the file before re-throwing.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "524ef3b42e70a60ce3934f424c6858168491cb54",
      "tree": "adc52c4907ae83533a2252b81f758c5c4f61a856",
      "parents": [
        "cb69d5716e5924001ddc269ec95ae5a09e1f80f2"
      ],
      "author": {
        "name": "Jian",
        "email": "fujian1115@gmail.com",
        "time": "Tue Jul 21 11:52:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 11:52:07 2026 +0800"
      },
      "message": "MINOR: Narrow remote copy lag validator props to Map\u003cString, ?\u003e and update the upgrade doc for KIP-1241 (#22363)\n\nThis is one followup PR for the review:\nhttps://github.com/apache/kafka/pull/20913#discussion_r3289589447 thanks\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "cb69d5716e5924001ddc269ec95ae5a09e1f80f2",
      "tree": "3b8388a0920f87090823213c199f56ff01aa7088",
      "parents": [
        "45443a6a6f21d6d25b5a1104f4c0d644c6d2dd6a"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Tue Jul 21 02:20:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 21 02:20:44 2026 +0800"
      },
      "message": "MINOR: Rewrite TransactionMetadataTest from Scala to Java (#22811)\n\nRewrite it, and move it to transaction coordinator module\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "45443a6a6f21d6d25b5a1104f4c0d644c6d2dd6a",
      "tree": "b14633461247cbf81e31a48976fb91619a8a07f8",
      "parents": [
        "8f48a25fdb5ada256e05569f2276a719895bf644"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Mon Jul 20 18:29:53 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 18:29:53 2026 +0100"
      },
      "message": "KAFKA-20783: Fixes for locks release for async handling in DelayedShareFetch (6/N) (#22881)\n\nHardens partition fetch-lock release across the async/remote completion\npaths so an acquired lock is released exactly once on every success,\ntimeout, and exception path.\n\nTests: added DelayedShareFetchTest cases for each fix covering fast-path\nfailure, slow-path remote transition and\nexception-during-error-handling.\n\nReviewers: Abhinav Dixit \u003cadixit@confluent.io\u003e, Andrew Schofield\n\u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "8f48a25fdb5ada256e05569f2276a719895bf644",
      "tree": "05c2770d443ca3f9fd816c548f0152dcf5022000",
      "parents": [
        "33ea66bf7ef3821aaacb983308080ec0883a4f83"
      ],
      "author": {
        "name": "Lucy Liu",
        "email": "lucliu@confluent.io",
        "time": "Mon Jul 20 11:53:42 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 09:53:42 2026 -0700"
      },
      "message": "KAFKA-20787: Implement KIP-1340: Expose Both Mapped Key and Stream Key in Streams-GlobalKTable Joins (#22807)\n\nThis PR implements KIP-1340. Prior to this KIP,\n`ValueJoinerWithKey`-based KStream-GlobalKTable join pass the `KStream`\nrecord key as the `readOnlyKey`, so users had no way to access the join\nkey produced by their `KeyValueMapper` inside the joiner without\nrecomputing it.\n\nThis change adds a new joiner interface\n`ValueJoinerWithMappedAndStreamKey\u003cK1, K2, V1, V2, VR\u003e`\nand new overrides of existing join/leftJoin methods to allow\npassing in both the mappedKey and the streamKey.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "33ea66bf7ef3821aaacb983308080ec0883a4f83",
      "tree": "c778b6d2999daf9288cf40ff1f0c63b60dae293f",
      "parents": [
        "260a39724d3d82a11957ea4689f5ca8f00e60ad3"
      ],
      "author": {
        "name": "Andrew Schofield",
        "email": "aschofield@confluent.io",
        "time": "Mon Jul 20 11:02:50 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 11:02:50 2026 +0100"
      },
      "message": "KAFKA-20736: Improve share session handling on leader change (#22766)\n\nIn some situations, the share consumer does not tidy up share sessions\nsufficiently on leadership change. In particular, if a broker loses\nleadership of a partition, the share consumer should send a further\nShareFetch/ShareAcknowledge to remove the partition from its share\nsession. In most cases, this removal happens naturally, but it depends\nupon whether the share consumer has other requests to send to that\nbroker. This PR tidies up the maintenance of share sessions when\nleadership changes occur.\n\nReviewers: Lianet Magrans \u003clmagrans@confluent.io\u003e, Shivsundar R\n \u003cshr@confluent.io\u003e, Apoorv Mittal \u003capoorvmittal10@gmail.com\u003e"
    },
    {
      "commit": "260a39724d3d82a11957ea4689f5ca8f00e60ad3",
      "tree": "c6e353b2ef405ccc853796d941ef235590366e2f",
      "parents": [
        "8c695ce8a02eb3fb9e7966cc601dfde75e51e11e"
      ],
      "author": {
        "name": "red-flames",
        "email": "hjtiun852@gmail.com",
        "time": "Mon Jul 20 06:14:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 06:14:12 2026 +0800"
      },
      "message": "MINOR: Remove redundant bcpkix test dependency from tools module (#22868)\n\nSince tools depends on `testFixtures(project(\u0027:clients\u0027))`, which\ndeclares testFixturesImplementation libs.bcpkix, bcpkix is already\nprovided transitively on the test classpath. The explicit\ntestImplementation libs.bcpkix in tools is therefore redundant and can\nbe removed.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "8c695ce8a02eb3fb9e7966cc601dfde75e51e11e",
      "tree": "643d3eb239b1d24c963984b0ff4996c683e192be",
      "parents": [
        "fdc59be8c84af1424b2f51a2df81386927f01a90"
      ],
      "author": {
        "name": "PoAn Yang",
        "email": "payang@apache.org",
        "time": "Mon Jul 20 04:20:54 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 03:20:54 2026 +0800"
      },
      "message": "KAFKA-20553 Use ClusterInstance for streams group command tests (#22701)\n\nFollowup from:\nhttps://github.com/apache/kafka/pull/22521#discussion_r3491032876\n\nMigrate the streams group command integration tests from\n`EmbeddedKafkaCluster` to the `ClusterInstance` test framework:\n- DescribeStreamsGroupTest\n- ListStreamsGroupTest\n- DeleteStreamsGroupTest\n- DeleteStreamsGroupOffsetTest\n- ResetStreamsGroupOffsetTest\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "fdc59be8c84af1424b2f51a2df81386927f01a90",
      "tree": "b1239c250323a1fe1971e28d0a96f7cc2b3533ee",
      "parents": [
        "a47f8ce190dc5b7f414f2008981b2bce00484a62"
      ],
      "author": {
        "name": "Igor Soarez",
        "email": "i@soarez.me",
        "time": "Sun Jul 19 08:22:34 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 15:22:34 2026 +0800"
      },
      "message": "KAFKA-18448 SSL support for ClusterTestExtensions (#22184)\n\nMixed protocols - SSL only between brokers and clients, not between\nbrokers and the quorum or vice versa is not yet supported.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "a47f8ce190dc5b7f414f2008981b2bce00484a62",
      "tree": "fe8ce6cb4b923c3ba2693adce127cd20bc8ae00e",
      "parents": [
        "d366f759be87c3f211c2b5ebaedff98a8af59d3a"
      ],
      "author": {
        "name": "YANG-SYUAN CHOU",
        "email": "dino2895un@gmail.com",
        "time": "Sun Jul 19 14:52:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 14:52:37 2026 +0800"
      },
      "message": "MINOR: Move JaasModule into JaasUtils (#22867)\n\nThis PR moves `JaasModule` into `JaasUtils` as a nested record,\nalongside `JaasSection`.\n\nIt also updates `KafkaClusterTestKit` to reference the nested\n`JaasUtils.JaasModule` type and removes the standalone `JaasModule.java`\nfile.\n\nThis is a code organization change with no intended behavior change.\n\n### Testing\n\n```bash\n./gradlew clean :test-common:test-common-runtime:test \\\n  --tests\n\u0027org.apache.kafka.common.test.junit.ClusterTestExtensionsTest.testSaslPlaintext\u0027\n\\\n  --tests\n\u0027org.apache.kafka.common.test.junit.ClusterTestExtensionsTest.testSaslPlaintextWithController\u0027\n\\\n  --tests\n\u0027org.apache.kafka.common.test.junit.ClusterTestExtensionsTest.testSaslSslWithController\u0027\n```\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "d366f759be87c3f211c2b5ebaedff98a8af59d3a",
      "tree": "84a8feb64bbfac01cfa85c0eff1f8ab936cac86e",
      "parents": [
        "0e08d48de4bf0ea332b4963585417a11e51cbd48"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Sun Jul 19 06:36:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 19 06:36:22 2026 +0800"
      },
      "message": "MINOR: Rewrite SaslClientsWithInvalidCredentialsTest and rename to ConsumerGroupCommandSaslAuthenticationTest (#22582)\n\nMigrate `SaslClientsWithInvalidCredentialsTest` to `ClusterInstance` and\nrename to `ConsumerGroupCommandSaslAuthenticationTest`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "0e08d48de4bf0ea332b4963585417a11e51cbd48",
      "tree": "d3cd6cd0a995818870995a16bb446f54ab9cf757",
      "parents": [
        "8301882bb2ed7a113f8e2a19844e1ff4453bcd75"
      ],
      "author": {
        "name": "Sanskar Jhajharia",
        "email": "sjhajharia@confluent.io",
        "time": "Sat Jul 18 23:18:58 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 18:48:58 2026 +0100"
      },
      "message": "KAFKA-20772 (3/3): Add ducktape system tests for share group DLQ with tiered storage (#22858)\n\n### Rationale\n\nThe existing DLQ system tests (`ShareConsumerDLQTest`) and the JUnit\nintegration suite of the same name both exercise record-copy correctness\n(`errors.deadletterqueue.record.copy.enable`) against source records\nthat are still on local disk. Neither exercises the path where the DLQ\nproducer has to read a rejected/expired record back from **tiered\nstorage** after it has been offloaded and deleted locally — the JUnit\nsuite only covers this with a mocked `RemoteLogManager`, never against a\nreal broker with a real `RemoteStorageManager` plugin wired in and real\nsegment offload/deletion timing.\n\nThat gap matters because the DLQ copy path re-reads the original record\nvia a normal fetch, and tiered reads go through a completely different\ncode path (`RemoteLogManager` / `RemoteStorageManager`) than local\nreads. A regression that only breaks the remote-read path would be\ninvisible to every other DLQ test in the suite.\n\nThis PR adds two ducktape tests that produce records, force them onto\n`LocalTieredStorage` and off local disk (via a very short\n`local.retention.ms` and small segment sizes), then reject them through\na share consumer and verify the DLQ topic ends up with the correct\nvalues — proving the DLQ fetch pulled the original record back from\nremote storage rather than silently producing a null/wrong value or\nhanging.\n\n### Changes\n\n- **`build.gradle`**: add `testImplementation\ntestFixtures(project(\u0027:storage\u0027))` to `core`, so `LocalTieredStorage`\n(in `storage`\u0027s test fixtures) is available on the broker\u0027s test\nclasspath (`core/build/dependant-testlibs/`) for ducktape runs.\n- **`tests/kafkatest/services/kafka/kafka.py`**: add\n`earliest_local_offset(topic, partition)`, a thin wrapper around\n`kafka-get-offsets.sh --time earliest-local` (KIP-405\u0027s\n`OffsetSpec.earliestLocal()`), used to detect when segments have\nactually been tiered and removed locally.\n-\n\n**`tests/kafkatest/tests/client/share_consumer_dlq_tiered_storage_test.py`**\n(new): a single-broker `ShareConsumerDLQTieredStorageTest` with\n`LocalTieredStorage` wired onto the broker via\n`remote.log.storage.manager.class.path` (pointed at the resolved\ntest-fixtures jar file, not the whole lib directory, to avoid a\n`ClassCastException` from double-loading the storage jars through\n`ChildFirstClassLoader`). Two tests:\n1. `test_tiered_topic_dlq_reject` — every record is tiered and evicted\nlocally, then REJECTed; DLQ values must match the originals, which can\nonly happen if the DLQ read came from remote storage.\n2. `test_mixed_tiered_and_local_dlq_reject` — first batch is tiered and\nevicted locally, second batch is produced afterwards and stays local;\nboth are REJECTed together and the DLQ must contain correct values for\nboth, exercising the remote-read and local-read paths in the same run.\n\nBoth tests run against `@matrix(metadata_quorum\u003d[isolated_kraft,\ncombined_kraft])` consistent with the rest of the DLQ test suite.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e, Sushant Mahajan\n \u003csmahajan@confluent.io\u003e"
    },
    {
      "commit": "8301882bb2ed7a113f8e2a19844e1ff4453bcd75",
      "tree": "5a31f0f5538da9e32096b923df2ceb221c03b530",
      "parents": [
        "678c0e07e4733c5a592e52046dc2c4e1625587f1"
      ],
      "author": {
        "name": "yangxuze",
        "email": "yangxuze2@gmail.com",
        "time": "Sun Jul 19 01:47:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 18 18:47:51 2026 +0100"
      },
      "message": "MINOR: Correct configuration property names in the Kafka Connect ACL tables (#22847)\n\nThe Kafka Connect ACL tables referenced two invalid configuration\nproperty names. The Source connector table used the connector-level\n`offsets.storage.topic` name for the worker fallback, whose actual\nproperty is `offset.storage.topic`. The Sink connector table also\nmisspelled the connector client override `consumer.override.group.id` as\n`consumer.overrides.group.id`.\n\nThis change corrects both references so that the ACL guidance matches\nthe worker configuration and connector override names used elsewhere in\nthe guide and in the Connect configuration classes.\n\nNo tests were run because this is a documentation-only change. `git diff\n--check` completed successfully.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "678c0e07e4733c5a592e52046dc2c4e1625587f1",
      "tree": "a47ddcd3311699109f25874d4cfceb1846eb3914",
      "parents": [
        "edc0800b480a5996c969730d889f01cb838d7fbb"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Fri Jul 17 14:03:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 14:03:20 2026 -0700"
      },
      "message": "MINOR: Kafka Streams should log broker provided KIP-1071 config values (#22730)\n\nIn the \"streams\" protocol, certain configs moved from the client to the\nbroker, and the broker provides some of these configs to the client via\nthe heartbeat response. The client should log these values for better\nclient-side observability.\n\nReviewers: Lianet Magrans \u003clmagrans@confluent.io\u003e, Bill Bejeck\n \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "edc0800b480a5996c969730d889f01cb838d7fbb",
      "tree": "452d803d354f04f192e4551624d31d28305ae7b1",
      "parents": [
        "05cbe688f75aadd1fb58b9d093201f7aa9e174c2"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Fri Jul 17 12:38:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 12:38:55 2026 -0700"
      },
      "message": "KAFKA-20808: StreamThread dies with fatal InvalidStateStoreException after TaskCorruptedException (#22855)\n\nThis PR ensures that an unsuccessfully opened segment is remove from the\nin-memory cache for open segments.\n\nReviewers: Nick Telford \u003cnick.telford@gmail.com\u003e, Bill Bejeck\n \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "05cbe688f75aadd1fb58b9d093201f7aa9e174c2",
      "tree": "beff6be05096a2734de9393f41a8b231175bde19",
      "parents": [
        "7e368e800256ff877a86cdae855ffe7496907763"
      ],
      "author": {
        "name": "Zhiyan Tang",
        "email": "ztang@confluent.io",
        "time": "Fri Jul 17 08:16:15 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 09:16:15 2026 -0400"
      },
      "message": "KAFKA-20726: Don\u0027t reuse the BufferSupplier in kraft state machine (#22678)\n\nKRaftControlRecordStateMachine reused a single BufferSupplier across all\nreads. The supplier returned by BufferSupplier.create() caches\nByteBuffers by capacity without eviction, so the cached buffers lived as\nlong as the state machine and consumed memory unboundedly.\n\nCreate a fresh BufferSupplier per read in maybeLoadLog() and\nmaybeLoadSnapshot() instead, allowing it to be released once the read\ncompletes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) \u003cnoreply@anthropic.com\u003e\nReviewers: Kevin Wu \u003ckwu@confluent.io\u003e, Jonah Hooper\n \u003cjhooper@confluent.io\u003e, José Armando García Sancio \u003cjsancio@apache.org\u003e"
    },
    {
      "commit": "7e368e800256ff877a86cdae855ffe7496907763",
      "tree": "49affbb4c3c86978ff6a1132f69aaf10bd0bcee8",
      "parents": [
        "3408aa3a49c3b453f7680646b73b3471bcdc0ac9"
      ],
      "author": {
        "name": "Sanskar Jhajharia",
        "email": "sjhajharia@confluent.io",
        "time": "Fri Jul 17 17:43:04 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 13:13:04 2026 +0100"
      },
      "message": "KAFKA-20772 (2/n): Add multi-partition and multi-topic DLQ system tests (#22851)\n\n### Summary\nExtends the share-group DLQ system test suite (`ShareConsumerDLQTest`,\nadded in the prior PR covering single-partition scenarios) to cover two\nmore topologies from the KAFKA-20772 test plan:\n- Multi-partition (single topic, 3 partitions):\n`test_multi_partition_dlq_reject` (parametrized over\n`num_dlq_partitions\u003d[3, 1]` to cover both 1:1 and modulus-collapsing DLQ\nrouting), `test_multi_partition_dlq_release`,\n`test_multi_partition_dlq_mixed`.\n- Multi-topic (two source topics sharing one share group and one DLQ\ntopic): `test_multi_topic_dlq_reject`, `test_multi_topic_dlq_release`. A\nsingle `VerifiableShareConsumer` member subscribes to both topics at\nonce via a comma-separated `--topic` list (new capability added here).\nDLQ records are asserted to carry the correct `__dlq.errors.topic`\nheader and route to `source_partition % num_dlq_partitions` per topic.\n\n### Changes\n- Multi-topic membership: two independent VerifiableShareConsumer\nmembers join the same share group, each subscribed to just one source\ntopic, instead of one member subscribed to both.\n- Routing/attribution verification: instead of reading per-record\n__dlq.errors.* headers, routing correctness is verified from the\nobservable per-DLQ-partition record counts (via the existing\nkafka.get_offset_shell helper), computed from\nproducer.acked_values_by_partition and the source_partition %\nnum_dlq_partitions rule.\n\nReviewers: Sushant Mahajan \u003csmahajan@confluent.io\u003e, Andrew Schofield\n \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "3408aa3a49c3b453f7680646b73b3471bcdc0ac9",
      "tree": "521542a8ed8dc9e74ac66724c0969926f2d87971",
      "parents": [
        "234548262c574d1428a4a21bc0c734db689e4681"
      ],
      "author": {
        "name": "Alieh Saeedi",
        "email": "107070585+aliehsaeedii@users.noreply.github.com",
        "time": "Fri Jul 17 02:04:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 17:04:42 2026 -0700"
      },
      "message": "KAFKA-20538: Make RocksDBTimeOrderedKeyValueBuffer headers-aware (#22166)\n\nProblem: `RocksDBTimeOrderedKeyValueBuffer` (the persistent buffer used\nby stream-table joins with grace periods) was missed when headers were\npropagated through Streams serdes. Two bugs:\n\n1. evictWhile() deserializes with the wrong headers. Both key and value\ndeserializers are called with internalContext.headers() -- the headers of\nwhatever record the processor is currently handling, not the record\nbeing evicted. Since records can sit in the buffer for the entire grace\nperiod, these almost never match.\n\n2. put() does not persist the record\u0027s headers. It stores the\ncaller-supplied recordContext directly in BufferValue, so\nrecord.headers() is never copied into the persisted\n`ProcessorRecordContext` and is unrecoverable at eviction time.\n\nThis PR fixes the followings:\n\n - put() builds a fresh ProcessorRecordContext carrying\nrecord.headers() and stores that in BufferValue, so the headers are\npersisted with the record\n\n- evictWhile() uses bufferValue.context().headers() for both key and\nvalue deserialization, so each evicted record is deserialized with the\nheaders it was buffered with.\n\nReviewers: Matthias J. Sax \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "234548262c574d1428a4a21bc0c734db689e4681",
      "tree": "d2f71c0aefea6c2bc8e075258865b43fa6b730c4",
      "parents": [
        "2f04be7b0dc31ddd840bff0768cfad3e418a6a23"
      ],
      "author": {
        "name": "Gabriel Dutra",
        "email": "gvdutra@gmail.com",
        "time": "Thu Jul 16 15:08:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 06:08:30 2026 +0800"
      },
      "message": "KAFKA-18951 Correct topic name in client example docs (#22812)\n\n## What changed\n\n- replace stale `topic1` references with the demo\u0027s actual `my-topic`\ntopic name\n- correct the README wording from \"to synchronous send\" to \"to\nsynchronously send\"\n- keep the Java example comments consistent with the README and\n`TOPIC_NAME`\n\n## Why\n\nThe producer/consumer example uses `my-topic`, but its documentation\nstill referred to `topic1`. This mismatch could confuse users following\nthe example.\n\n## Validation\n\n- `./gradlew :examples:compileJava :examples:checkstyleMain\nspotlessCheck`\n- `git diff --check`\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "2f04be7b0dc31ddd840bff0768cfad3e418a6a23",
      "tree": "355620ace653324b907761d9aedee44f0ec15568",
      "parents": [
        "23927a2037f201536a7cc44313b2cbfaa5e543cf"
      ],
      "author": {
        "name": "Apoorv Mittal",
        "email": "apoorvmittal10@gmail.com",
        "time": "Thu Jul 16 22:58:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 05:58:45 2026 +0800"
      },
      "message": "MINOR: Updated log reader interface to abstractions (#22841)\n\nThe minor PR updates the LogReader interface to match the other passed\nparams abstractions rather specific Map implementation.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "23927a2037f201536a7cc44313b2cbfaa5e543cf",
      "tree": "c1a060986f4dc5c936840afa9f55a66173a37cb9",
      "parents": [
        "5b6a94bb5bbbdaee4461d2f3ede458363353c1ee"
      ],
      "author": {
        "name": "Ming-Yen Chung",
        "email": "mingyen066@gmail.com",
        "time": "Fri Jul 17 04:58:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 04:58:22 2026 +0800"
      },
      "message": "MINOR: Fix broken relative links in docs/ (#22813)\n\nSeveral docs/ cross-links use relative paths assuming a flat\nsingle-page-HTML layout, pre-dating the move to per-page Hugo\ndirectories (foo.md -\u003e /foo/) on kafka.apache.org, so they resolve one\nlevel too shallow and 404 — including the Kafka Connect quickstart link\nand the new Streams/Connect security-model cross-links.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "5b6a94bb5bbbdaee4461d2f3ede458363353c1ee",
      "tree": "6ba1109ff08cc97f5e4aadb753ef44085d14a09d",
      "parents": [
        "d9c4e22b736b8ff3432eb680f263b95b1034f306"
      ],
      "author": {
        "name": "Jiayáo Sun",
        "email": "jiayao.s@outlook.com",
        "time": "Fri Jul 17 08:44:51 2026 +1200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 17 04:44:51 2026 +0800"
      },
      "message": "MINOR: Replace deprecated TopologyTestDriver constructor in TestTopicsTest (#22782)\n\nThis patch updates `TestTopicsTest` to use `TopologyTestDriverBuilder`\ninstead of the deprecated `TopologyTestDriver` constructor.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "d9c4e22b736b8ff3432eb680f263b95b1034f306",
      "tree": "aedbda07b937c056b966567e0735e55d0f37ea64",
      "parents": [
        "b30cd5f6a9dbda39f0dc59643f215326ad81d8ad"
      ],
      "author": {
        "name": "Matthias J. Sax",
        "email": "matthias@confluent.io",
        "time": "Thu Jul 16 12:50:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 12:50:17 2026 -0700"
      },
      "message": "MINOR: fix flakey SwallowUnknownTopicErrorIntegrationTest (#22845)\n\nThis PR reduces `max.block.ms` to avoid hitting the test timeout. The\nsame fix was added via https://github.com/apache/kafka/pull/16710 in the\npast (the test was rename from `CustomHandlerIntegrationTest` to\n`SwallowUnknownTopicErrorIntegrationTest` later), but the fix was\ndropped via https://github.com/apache/kafka/pull/17163 (unclear why).\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e, TengYao Chi\n \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "b30cd5f6a9dbda39f0dc59643f215326ad81d8ad",
      "tree": "a784cccf3663664bd2d9a06c47ca0df61dc4bfd3",
      "parents": [
        "bd5fcec64e0a2ec057ca9f88da345926d8c58342"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Thu Jul 16 14:49:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:49:51 2026 -0400"
      },
      "message": "KAFKA-20760: Break out PositionRestartIntegrationTest into sub-class for transactional stores (#22823)\n\nThe transactional (KIP-892) Position-across-restart coverage previously\nadded to  PositionRestartIntegrationTest expanded the parameter matrix\nacross the full  cache x log x store x kind cross-product, roughly\ndoubling the case count and  runtime and making the test prone to\ntimeouts.\n\nThis splits the concern:\n- PositionRestartIntegrationTest returns to its original\nnon-transactional matrix,\n  with small hooks (an overridable `data()` source and a\n`transactional()` flag)\n  so the machinery can be reused\n\n- TransactionalPositionRestartIntegrationTest extends it and supplies a\ncompact\n  covering set for the transactional path: every persistent and\nin-memory store\n  family (transactional state stores are supported for both), log\nenabled\n  throughout, rotating cache and kind so both values are exercised\nwithout a full\n  cross-product, all under exactly-once-v2.\n\nReviewers: Nick Telford \u003cnick.telford@gmail.com\u003e, Matthias J. Sax\n \u003cmatthias@confluent.io\u003e"
    },
    {
      "commit": "bd5fcec64e0a2ec057ca9f88da345926d8c58342",
      "tree": "6f3472c43993705e139e67dea21c9a601980c783",
      "parents": [
        "931fde96ffd449161661c96fbf89c705aa349603"
      ],
      "author": {
        "name": "Sanskar Jhajharia",
        "email": "sjhajharia@confluent.io",
        "time": "Thu Jul 16 19:27:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:57:21 2026 +0100"
      },
      "message": "MINOR: Fix DLQ records using a non-epoch clock for their timestamp (#22849)\n\n### Summary\n\nShare-group DLQ records (KIP-1191) were built with `Time#hiResClockMs()`\nas their timestamp instead of `Time#milliseconds()`. `hiResClockMs()` is\n`System.nanoTime()` converted to milliseconds, explicitly documented as\nmeasuring elapsed durations from an arbitrary, non-epoch origin, not\nwall-clock time. Every DLQ record ended up stamped with something like\n`332800244 (~4 days after the Unix epoch)` instead of a real 2026\ntimestamp.\n\nKafka\u0027s log retention decides whether to delete a segment by comparing\neach record\u0027s timestamp against the current wall-clock time. With a\nnear-epoch timestamp, that comparison is always \"yes, delete this\"\nregardless of the configured `retention.ms`. So the DLQ record is\nproduced successfully, and then deleted by the very next retention\ncheck, typically well under a second later.\n\n### Impact\n\nThis affects every DLQ write, on any broker. Whether it\u0027s visible in\npractice depends entirely on how fast something reads the DLQ topic\nafter the record lands relative to `log.retention.check.interval.ms`\n(default 5 minutes, but frequently lowered in tiered-storage/testing\nconfigs) — so the practical exposure ranges from \"DLQ appears completely\nempty\" to \"DLQ briefly has data that vanishes moments later,\" neither of\nwhich produces any error, warning, or log line pointing at the cause.\n\n### Why this was hard to find\n\n- The write path itself is silent on success: the produce request\ncompletes normally (broker ack, high watermark advances), so there\u0027s no\nexception or log line anywhere suggesting anything is wrong.\n- The existing JUnit coverage (`ShareConsumerDLQTest`) reads the DLQ\ntopic via a bare `consumer.assign() + seekToBeginning() + poll()` —\nnear-zero setup latency. It happened to read the records within a few\nhundred milliseconds, comfortably beating the next retention cycle every\ntime. It was passing by winning a timing race, not because the write\npath was correct.\n- A newer ducktape system test, whose DLQ reader goes through a real\nconsumer-group `subscribe()` (requiring a multi-second group\njoin/rebalance before it can fetch anything), reliably lost that same\nrace — which is what surfaced this as worth investigating rather than\ndismissing as test-infra flakiness.\n- The existing unit tests (`ShareGroupDLQStateManagerTest`) never\nasserted on the actual timestamp value of produced records, only on\nheaders/key/value — so there was no test that could have caught a wrong\nclock being used.\n\n### Fix\n\nOne-line change: `time.hiResClockMs() -\u003e time.milliseconds()`\n\nAdded a regression test (`assertDlqRecordTimestampsAreWallClock`, wired\ninto `testDlqHappyPathExistingTopic`) asserting the produced record\u0027s\ntimestamp matches Time#milliseconds(). Confirmed it fails against the\npre-fix code and passes with the fix, closing the coverage gap above.\n\nReviewers: Sushant Mahajan \u003csmahajan@confluent.io\u003e, Apoorv Mittal\n \u003capoorvmittal10@gmail.com\u003e, Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "931fde96ffd449161661c96fbf89c705aa349603",
      "tree": "d2003508f2c99a2427de0f4873d90d364e6da5fb",
      "parents": [
        "3b849ff2bdf245722b462d5f3c92f47088fb772a"
      ],
      "author": {
        "name": "Sanskar Jhajharia",
        "email": "sjhajharia@confluent.io",
        "time": "Thu Jul 16 19:00:24 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 14:30:24 2026 +0100"
      },
      "message": "KAFKA-20772 (1/n): Add DLQ system tests for single-partition share group scenarios (#22786)\n\nThis adds the first system-test coverage for share group dead-letter\nqueues (KIP-1191, part of KAFKA-19469), plus the client-side tooling\nchanges needed to drive it — there was previously no way for any\nducktape test client to explicitly REJECT or RELEASE a share-consumed\nrecord; VerifiableShareConsumer only ever implicitly accepted.\n\n`VerifiableShareConsumer.java`\n- New `--ack-pattern` CLI flag: a comma-separated cycle of\n`accept|release|reject|renew`, applied per record via `(offset %\npattern.length)` — keyed off the immutable record offset so the\nassignment is stable across redeliveries.\n- When set, the consumer is switched to\n`share.acknowledgement.mode\u003dexplicit` and requires\n`--acknowledgement-mode sync|async` (rejects auto at arg-parse time,\nsince explicit per-record acks still need a commit to ship).\n- `offsets_acknowledged` events now optionally include an\n`ackTypeCounts` breakdown `({\"ACCEPT\": n, \"RELEASE\": n, ...})`, omitted\nentirely when `--ack-pattern` isn\u0027t used — no change to the existing\nJSON schema for any current caller.\n\n`verifiable_share_consumer.py` (ducktape service)\n- Plumbs `ack_pattern` through to the CLI, and adds\n`total_accepted()/total_released()/total_rejected()/total_renewed()`\naccessors backed by the new `ackTypeCounts` data.\n\n`kafka.py`\n- `set_share_group_dlq_config(group, topic_name, copy_record_enable)` —\nsets the GroupConfig DLQ configs via kafka-configs.sh.\n- `set_share_group_delivery_count_limit(group, limit)` — sets\n`share.delivery.count.limit` (the per-group override).\n- New share_version constructor param to bootstrap a cluster with\n`--feature share.version\u003d\u003cn\u003e`. Since DLQ (share.version\u003d2) is above\n`ShareVersion.LATEST_PRODUCTION`, this also flips on\n`unstable.feature.versions.enable` in the broker properties.\n\nNew: `tests/kafkatest/tests/client/share_consumer_dlq_test.py`\nThree tests on a real 3-broker isolated-KRaft cluster, verifying actual\nDLQ topic content (not just consumer-side counters):\n- `test_single_partition_dlq_reject` — every record REJECTed, DLQ\u0027d\nexactly once, values null (copy-record disabled, the default).\n- `test_single_partition_dlq_release` — every record RELEASEd\nrepeatedly; once delivery count exceeds a lowered\nshare.delivery.count.limit, it lands in the DLQ.\n- `test_single_partition_dlq_mixed` — records cycled\nreject/release/accept by offset % 3, copy-record enabled; asserts the\nDLQ\u0027d record set and values exactly match the subset of produced values\nthat should have been rejected/released (cross-checked against\nVerifiableProducer.acked_values, not just \"value is non-null\").\n\nAll three verified passing end-to-end against a live ducker cluster\n(tests/docker/run_tests.sh).\n\n```\n\u003e TC_PATHS\u003d\"tests/kafkatest/tests/client/share_consumer_dlq_test.py\"\nbash tests/docker/run_tests.sh\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nSESSION REPORT (ALL TESTS)\nducktape version: 0.14.0\nsession_id:       2026-07-08--005\nrun time:         5 minutes 27.339 seconds\ntests run:        6\npassed:           6\nflaky:            0\nfailed:           0\nignored:          0\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_mixed.metadata_quorum\u003dCOMBINED_KRAFT\nstatus:     PASS\nrun time:   45.786 seconds\n--------------------------------------------------------------------------------\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_mixed.metadata_quorum\u003dISOLATED_KRAFT\nstatus:     PASS\nrun time:   1 minute 5.269 seconds\n--------------------------------------------------------------------------------\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_reject.metadata_quorum\u003dCOMBINED_KRAFT\nstatus:     PASS\nrun time:   43.421 seconds\n--------------------------------------------------------------------------------\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_reject.metadata_quorum\u003dISOLATED_KRAFT\nstatus:     PASS\nrun time:   1 minute 2.872 seconds\n--------------------------------------------------------------------------------\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_release.metadata_quorum\u003dCOMBINED_KRAFT\nstatus:     PASS\nrun time:   43.429 seconds\n--------------------------------------------------------------------------------\ntest_id:\nkafkatest.tests.client.share_consumer_dlq_test.ShareConsumerDLQTest.test_single_partition_dlq_release.metadata_quorum\u003dISOLATED_KRAFT\nstatus:     PASS\nrun time:   1 minute 5.794 seconds\n--------------------------------------------------------------------------------\n```\n\nReviewers: Sushant Mahajan \u003csmahajan@confluent.io\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e, Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "3b849ff2bdf245722b462d5f3c92f47088fb772a",
      "tree": "51a5fa30c82851176cefa2738f3783adc0d1e13c",
      "parents": [
        "0f1496b4a086bbf0bbfeb354a6fdc8272eced2f5"
      ],
      "author": {
        "name": "TaiJuWu",
        "email": "tjwu1217@gmail.com",
        "time": "Thu Jul 16 19:37:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 16 19:37:57 2026 +0800"
      },
      "message": "KAFKA-19663 Unify kafka-broker-api-versions tool to cluster-tool and support bootstrap controllers (#20598)\n\nUnify kafka-broker-api-versions tool to cluster-tool and support\nbootstrap controllers.  This change  reuse  current KafkaAdminClient\ndescribeFeature to get api response by  introducing\nInternalFeatureDescribeFeatureResult.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    }
  ],
  "next": "0f1496b4a086bbf0bbfeb354a6fdc8272eced2f5"
}
