)]}'
{
  "log": [
    {
      "commit": "d18f93f9852d4ea06f47d256df642070e986a67a",
      "tree": "cf9bebd057888c0d2bd4f29aa185acb2acc5470c",
      "parents": [
        "2d351886500fa6a9bcb297ef1acfe7a36240fa05"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 22 21:18:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 21:18:29 2026 +0200"
      },
      "message": "KAFKA-21214: [7/N] Add the partition placement of the uniform2 assignor (#23736)\n\nThe quotas of the uniform2 assignor tell how many partitions of every\ntopic each member gets. Once the steps have decided them, the assignor\nplaces the partitions.\n\nThis patch adds `PartitionPlacement`, which places the partitions of a\ntopic on its subscribers, moving as few partitions as possible. Every\nowner keeps its partitions with the lowest ids, up to its quota. The\nother partitions, those without an owner and those beyond the quota of\ntheir owner, go to the subscribers below their quota, each taking the\nlowest ids left. A partition thus moves only when its owner owns more\npartitions than its quota. `place` returns `false` when every partition\nstays with its owner, so that the members keep their current sets of\npartitions of the topic.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "2d351886500fa6a9bcb297ef1acfe7a36240fa05",
      "tree": "ddb86f94fb866270664aa3386ca47b4fde8209df",
      "parents": [
        "0290810b879fc7c965991a02288d444b0347fcba"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "sushant.mahajan88@gmail.com",
        "time": "Fri Oct 23 00:31:36 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:31:36 2026 +0530"
      },
      "message": "KAFKA-21197: Preserve original record headers in share group DLQ records. (#23659)\n\n- When record copy is enabled for a share group\u0027s DLQ,\nShareGroupDLQRecordHelper.headers() now preserves the original source\nrecord\u0027s headers on the DLQ record instead of discarding them.\n- If an original header\u0027s key collides with a DLQ context header that is\nactually added for that record — unconditionally for\ntopic/partition/offset/group/delivery-count/cause. The original header\nis dropped so the DLQ-computed value\nis the only one present.\n- Headers are now built RecordHeaders instead of hand-rolled array/size\nbookkeeping, removing a class of size/counter-mismatch risk on future\nedits.\n\nCo-Authored-By: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e Reviewers:\nAndrew Schofield \u003caschofield@confluent.io\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0290810b879fc7c965991a02288d444b0347fcba",
      "tree": "4ed732fd16692e453fe3ba3f3df52a40234a36e5",
      "parents": [
        "7f231b8f37fb10af48ef6acddc6deb68ec3910f4"
      ],
      "author": {
        "name": "Doyeon Kim",
        "email": "132787602+dybyte@users.noreply.github.com",
        "time": "Fri Oct 23 01:32:22 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:32:22 2026 +0800"
      },
      "message": "KAFKA-21294 Add missing OAuth login configs to production SASL examples (#23840)\n\nThe production OAUTHBEARER examples don\u0027t work as written. Add the\nmissing login callback handler to the broker and client examples, and\nthe org.apache.kafka.sasl.oauthbearer.allowed.urls system property,\nwhich has defaulted to empty since 4.0.\n\nAlso add an integration test that runs the documented broker config with\na replicated topic.\n\nGenerated-by: Claude Opus 5.5\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "7f231b8f37fb10af48ef6acddc6deb68ec3910f4",
      "tree": "366c8861a50ec27bd5bc5b638fc599004466d727",
      "parents": [
        "a817e6f9924deea5e0dce340b9d692dabac4b2a0"
      ],
      "author": {
        "name": "Dejan Stojadinović",
        "email": "dejan2609@users.noreply.github.com",
        "time": "Thu Oct 22 17:05:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 17:05:44 2026 +0200"
      },
      "message": "KAFKA-21299: Upgrade Gradle to 9.8.2 and fetch the wrapper jar from a pinned commit (#23770)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a817e6f9924deea5e0dce340b9d692dabac4b2a0",
      "tree": "e42ef82bd25e00b1a3f91c6231f1de35f427c68e",
      "parents": [
        "349a647c47d3e1e6bb1632f629fdedf10f6efd00"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Thu Oct 22 23:10:09 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 16:10:09 2026 +0200"
      },
      "message": "MINOR: Replace try/fail/catch with assertThrows in Connect tests (#23860)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "349a647c47d3e1e6bb1632f629fdedf10f6efd00",
      "tree": "4078478ed955940d6971f955d9f29bc4b4be0754",
      "parents": [
        "a3444d8b32beee97bd0afaa267a9c4180815de60"
      ],
      "author": {
        "name": "ChickenchickenLove",
        "email": "ojt90902@naver.com",
        "time": "Thu Oct 22 18:23:07 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:23:07 2026 +0200"
      },
      "message": "KAFKA-21303: Use classic member session timeouts when reloading consumer groups (#23856)\n\nWhen a consumer group is reloaded, members using the classic protocol\nare assigned the consumer protocol session timeout. This can cause\nmembers to expire prematurely or remain in the group longer than their\nconfigured timeout allows.\n\nUpdate `GroupMetadataManager.onLoaded()` to check each member\u0027s protocol\nand use the persisted `classicProtocolSessionTimeout` for classic\nmembers. Members using the consumer protocol continue to use the\nconsumer protocol session timeout.\n\nReviewers: liuliu \u003cliuliugit@gmail.com\u003e, David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "a3444d8b32beee97bd0afaa267a9c4180815de60",
      "tree": "71d319769be56148915c1cbfb534050616fca1ae",
      "parents": [
        "dbe15eb1b7c987f02993624067f428275238305e"
      ],
      "author": {
        "name": "Omnia Ibrahim",
        "email": "o.g.h.ibrahim@gmail.com",
        "time": "Thu Oct 22 00:30:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 07:30:29 2026 +0800"
      },
      "message": "MINOR: Stop staging LICENSE/NOTICE into kafka-site content dir (#23906)\n\nFollow-up to KAFKA-21289 (#23833), which fixed `release.py stage-docs`\nfor the Hugo-based kafka-site layout.\n\nThe site-docs tar carries the repo\u0027s top-level `LICENSE` and `NOTICE` at\nits root. `stage-docs` extracts the tar with `tar xf ...\n--strip-components 1` straight into `content/en/\u003cversion\u003e/`, so those\ntwo files get dumped into the  kafka-site content tree alongside the\nactual docs. They are not docs content and do not belong there — the\nprevious release slot (`content/en/43`) has neither, and the javadoc\ntree already carries its own `legal/` license files under\n`static/\u003cversion\u003e/javadoc/`.\n\nThis was flagged on the 4.4 kafka-site PR, where `content/en/44/LICENSE`\nand `content/en/44/NOTICE` showed up as spurious additions and had to be\nremoved by hand. Without this change they return on every `stage-docs`\nrun.\n\nThis patch drops `LICENSE` and `NOTICE` from the content directory after\nextraction, mirroring the existing post-extraction cleanup that moves\n`images/` out to `static/\u003cversion\u003e/`.\n\nNo behavior change for any other staged file.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "dbe15eb1b7c987f02993624067f428275238305e",
      "tree": "affa65900875d5fc1cbf111407fc1e48c9af9c4e",
      "parents": [
        "8b5fc1bb0280f42edef6f1e39d71dca55089faa0"
      ],
      "author": {
        "name": "Christo Lolov",
        "email": "lolovc@amazon.com",
        "time": "Thu Oct 22 00:03:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 07:03:47 2026 +0800"
      },
      "message": "KAFKA-15853: [4/N] Move DynamicLogConfig and log config accessors to Java  (#23662)\n\nThis PR moves DynamicLogConfig from Scala to Java, along with its\nvalidation of local retention, remote copy lag and cordoned log dirs.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "8b5fc1bb0280f42edef6f1e39d71dca55089faa0",
      "tree": "e8a8347db47a1e92ee5af2a84e12b6f23c7998dd",
      "parents": [
        "df536bd51eaf3ab8fe03449e468c56ce331d1a5a"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Wed Oct 21 17:59:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 17:59:11 2026 +0100"
      },
      "message": "MINOR: Make share group state partition metadata unmodifiable (#23888)\n\nWrap InitMapValue\u0027s partitions and\nShareGroupStatePartitionMetadataInfo\u0027s collections in unmodifiable\nviews, so that the share group state partition metadata cannot be\nmodified through them. Add withAddedPartitions and withRemovedPartitions\nto InitMapValue to derive new values.\n\nUse them in GroupMetadataManager and remove the copies that are no\nlonger needed. combineInitMaps reuses a value when only one of the maps\nhas the topic, and initializeShareGroupState no longer deep copies the\ninitializing topics to remove partitions in place.\ninitializedShareGroupPartitions and\nsharePartitionsEligibleForOffsetDeletion no longer copy the partitions.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "df536bd51eaf3ab8fe03449e468c56ce331d1a5a",
      "tree": "fa5b209f59b3a359c74cd56f8b02f54a366e3cad",
      "parents": [
        "787c2b4d9f032890226590f9956d501812f10cbd"
      ],
      "author": {
        "name": "Lyphixia Wang",
        "email": "mieah.hhlj@gmail.com",
        "time": "Wed Oct 21 21:49:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:49:34 2026 +0200"
      },
      "message": "KAFKA-20404: Replace bulk DefaultStateUpdater atomicity excludes with field-level suppressions (#22333)\n\n## Background\n[KAFKA-20404](https://issues.apache.org/jira/browse/KAFKA-20404) tracks\nreplacing the bulk SpotBugs atomicity excludes (introduced when SpotBugs\nwas upgraded from 4.8.6 to 4.9.4) with per-field investigations. This PR\nhandles `DefaultStateUpdater$StateUpdaterThread`, the second class in\nthe series after `StreamThread` (#22320).\n\n## Investigation\nAfter removing `DefaultStateUpdater$StateUpdaterThread` from the two\nbulk excludes it appeared in\n(`AT_NONATOMIC_OPERATIONS_ON_SHARED_VARIABLE` at line 505 and\n`AT_NONATOMIC_64BIT_PRIMITIVE` at line 544 on trunk), SpotBugs reports\nexactly one field with warnings:\n\n- `totalCheckpointLatency` at `DefaultStateUpdater.java:100`, flagged at\nline 732 (`measureCheckpointLatency`) and line 750 (`recordMetrics`).\n\nWalking the call sites:\n- `measureCheckpointLatency` is `private` and only called from within\n`StateUpdaterThread`: `restoreTasks`, `pauseTasks`, `resumeTasks`,\n`removeUpdatingTask`, `maybeCheckpointTasks`.\n- `recordMetrics` is `private` and only called from\n`StateUpdaterThread.runOnce` (line 213).\n- All callers run on the `StateUpdaterThread` itself (the inner class\nextends `Thread`).\n\nSo `totalCheckpointLatency` is thread-confined and the SpotBugs warnings\nare false positives.\n\n## Changes\n- Remove `DefaultStateUpdater$StateUpdaterThread` from the two bulk\n`\u003cOr\u003e` blocks.\n- Add two targeted `\u003cMatch\u003e` blocks scoped to the class plus the\n`totalCheckpointLatency` field, each with a rationale comment explaining\nthe thread-confinement, one per bug pattern.\n\n## Verification\n- `:streams:spotbugsMain --rerun-tasks` clean.\n- `:streams:checkstyleMain` / `:streams:checkstyleTest` /\n`:streams:spotbugsTest` clean.\n- `:streams:test --tests \"*DefaultStateUpdater*\"` all green."
    },
    {
      "commit": "787c2b4d9f032890226590f9956d501812f10cbd",
      "tree": "e57fdc4cf6ce8c3416c178b7f761d76bae6a9e0e",
      "parents": [
        "95621a0929866db58002af50da0ec04ad0955053"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Wed Oct 21 05:55:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:55:52 2026 +0100"
      },
      "message": "MINOR: Reject reserved client instance ID in GetTelemetrySubscriptions v0 (#23825)\n\n`GetTelemetrySubscriptions` v0 only treated `ZERO_UUID` or `null` as \"no\nclient instance ID\", so a request carrying `ONE_UUID` was accepted and\ncached as a real client instance ID. Is is then rejected in\n`PushTelemetry` by `isValidClientInstanceId` since it is a reserved\nUUID.\nSo v0 now rejects reserved IDs with `INVALID_REQUEST`, matching\n`PushTelemetry` and v1 `GetTelemetrySubscriptions`.\n\nReviewers: Apoorv Mittal \u003capoorvmittal10@gmail.com\u003e"
    },
    {
      "commit": "95621a0929866db58002af50da0ec04ad0955053",
      "tree": "2e29597fc00bb1100daa7d227bc47253070f21e0",
      "parents": [
        "c1b92ad6af7697c2cf93fc92b7cfc55c3e630b45"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Wed Oct 21 10:55:21 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:55:21 2026 +0100"
      },
      "message": "MINOR: Break down TargetAssignmentBuilderBenchmark by builder (#23868)\n\nSplit the benchmark into separate benchmarks for building the group\nspec, the target assignment and the target assignment records. The group\nspec is benchmarked both with and without assignor offload, because\noffloading copies the group\u0027s members and target assignment so that the\nassignor can run off the coordinator thread.\n\nPopulate a ConsumerGroup and read the members, target assignment and\ninverted target assignment from it, instead of plain HashMaps. This\nmakes the benchmarks iterate over and copy the same TimelineHashMaps as\nGroupMetadataManager, which matters most for the offload group spec\nbenchmark.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: David Jacot \u003cdajac@apache.org\u003e"
    },
    {
      "commit": "c1b92ad6af7697c2cf93fc92b7cfc55c3e630b45",
      "tree": "22440725d189dd384f668d52cbb8511f455a9f01",
      "parents": [
        "9fbcd3f76cecd04015e5d893976d9849f407af30"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Wed Oct 21 04:26:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 10:26:39 2026 +0200"
      },
      "message": "MINOR: Fix RackAwareStandbyPicker javadoc on how tag keys are picked     (#23889)\n\npick() keeps the tag keys in rack.aware.assignment.tags order, each only\nif a process with room still meets it together with those kept so far.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "9fbcd3f76cecd04015e5d893976d9849f407af30",
      "tree": "cba72ee99ea0c08e5c7472a12daf1b7b3edd5b0c",
      "parents": [
        "132ce7095342997d48a87026d27962a5600ba92b"
      ],
      "author": {
        "name": "I-Chau (David) Wang",
        "email": "yichaowang639@gmail.com",
        "time": "Wed Oct 21 08:53:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:53:54 2026 +0800"
      },
      "message": "MINOR: Fixed typos in comments across multiple Java classes (#23875)\n\nSupersedes #21393.\nFixed typos in comments and updated ConfigDef exception message as\nsuggested in review.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e\n\n---------\n\nCo-authored-by: Rbaddam \u003cRBaddam@walmartlabs.com\u003e"
    },
    {
      "commit": "132ce7095342997d48a87026d27962a5600ba92b",
      "tree": "aec4160d60afc840ae22fd8da49d7180c42f9fb7",
      "parents": [
        "a81c9e662bccf2305ade32863fb977bf542d76a4"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Oct 21 02:45:12 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:45:12 2026 +0800"
      },
      "message": "KAFKA-21305 Bump Jackson version to 2.22.4 (#23862)\n\nThere is a new jackson patch release\n\nhttps://github.com/FasterXML/jackson/wiki/Jackson-Release-2.22.4\n\nIt fixes a bunch of CVEs but I think for Kafka only CVE-2026-110879 can\nbe impactful.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a81c9e662bccf2305ade32863fb977bf542d76a4",
      "tree": "451dcdfe630d9416f532c0b691bcded1ccdd4704",
      "parents": [
        "db4700fa9ebb7f1aac2938a9e8879bb8dc8dd919"
      ],
      "author": {
        "name": "Jian",
        "email": "fujian1115@gmail.com",
        "time": "Wed Oct 21 08:25:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:25:41 2026 +0800"
      },
      "message": "MINOR: Update document for KIP-1241 (#23520)\n\nAdd a “Delay Upload” section to the tiered storage docs for the\nremote.copy.lag.ms and remote.copy.lag.bytes configs introduced by\nKIP-1241.\n\nThe section explains why segments are stored redundantly in both tiers\nduring the local retention window, how the two lag checks decide when a\nsegment becomes eligible for upload (either check satisfied, 0 means\nupload immediately, -1 follows local retention), and gives two examples:\na time-based delay and a size-based delay. It also mentions the\nbroker-level counterparts log.remote.copy.lag.ms and\nlog.remote.copy.lag.bytes.\n\nFollow-up of\nhttps://github.com/apache/kafka/pull/22394#issuecomment-5029666292.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "db4700fa9ebb7f1aac2938a9e8879bb8dc8dd919",
      "tree": "c5871914ee040ae8603bae86f9e518b4e5671c3a",
      "parents": [
        "702446e4ec28af501d348043ab9326afe9e0b8f3"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Wed Oct 21 08:04:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 08:04:37 2026 +0800"
      },
      "message": "KAFKA-21058 Simplify jsonNodeToInt and jsonNodeToLong (#23436)\n\nThis PR simplifies MessageUtil.jsonNodeToInt and jsonNodeToLong. The old\ncode converted non-int/long integral nodes to text and parsed them back.\nThe new code checks isIntegralNumber() and\ncanConvertToInt()/canConvertToLong() directly. The hex branch is removed\nsince it was unreachable. Behavior is unchanged except for clearer error\nmessages.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "702446e4ec28af501d348043ab9326afe9e0b8f3",
      "tree": "16dc63b65f266b3e51f5786654f3b8056abfed9e",
      "parents": [
        "6adbf155a6aeda2bbc3dcf0893dd6ffe4a333ed5"
      ],
      "author": {
        "name": "hysu",
        "email": "dame3902@gmail.com",
        "time": "Tue Oct 20 16:57:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:57:42 2026 +0800"
      },
      "message": "KAFKA-12188 Assert specific connection failure in SaslAuthenticatorTest (#23485)\n\nPreviously, `SaslAuthenticatorTest` blindly caught\n`AssertionFailedError`. This allows unrelated assertion failures in\n`checkClientConnection` to pass the test.\n\nAdded an exact message check for \"No disconnects should have occurred\"\nto ensure the tests pass only when the server explicitly drops the\nconnection, which is the expected behavior.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "6adbf155a6aeda2bbc3dcf0893dd6ffe4a333ed5",
      "tree": "a282464e0b846e1bb1f1fc577cf62f381f3b71fc",
      "parents": [
        "f45fc4bbd31c885bf6aaa19571aadc102849c0c5"
      ],
      "author": {
        "name": "S.Y. Wang",
        "email": "johnny123tw@gmail.com",
        "time": "Wed Oct 21 08:43:03 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:43:03 2026 +0800"
      },
      "message": "MINOR: Validate operation types in incremental config updates (#23822)\n\nThere are already similar checks. It will be better to add the same\ncheck accordingly.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Luke Chen\n \u003cshowuon@gmail.com\u003e"
    },
    {
      "commit": "f45fc4bbd31c885bf6aaa19571aadc102849c0c5",
      "tree": "35926f06d5908cdb761841f9b6b082484a936b98",
      "parents": [
        "46dc4b51f74c1af6791c631635265c90aa6ee27a"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Wed Oct 21 01:25:37 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 07:25:37 2026 +0800"
      },
      "message": "KAFKA-21258 Move the Docker image usage guide from docker/examples/README.md to the website docs (#23819)\n\nMove the Docker image usage guide (default configs, file input,\nenvironment variables, SASL and SSL modes) from\ndocker/examples/README.md to docs/getting-started/docker.md so it shows\non the website.\n\nThe README keeps the docker compose examples and links to the docs page.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "46dc4b51f74c1af6791c631635265c90aa6ee27a",
      "tree": "6b9790334448822ee2b6d3c33dda331da6edcd64",
      "parents": [
        "0d82450b0abc4dcefa68c0c17b4b33fc815838a6"
      ],
      "author": {
        "name": "Mykyta Bozhenko",
        "email": "21245729+cheeeee@users.noreply.github.com",
        "time": "Tue Oct 20 14:10:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 11:10:31 2026 -0700"
      },
      "message": "KAFKA-21280: Do not send stale bytes after a failed file read in SslTransportLayer.transferFrom (#23832)\n\n`SslTransportLayer.transferFrom` clears `fileChannelBuffer` before\nreading the next chunk of the file. When the read threw, or returned no\nbytes, the buffer was left cleared rather than flipped, so it still\nlooked full of the previous chunk. If bytes had already been written in\nthe same call the `IOException` was swallowed, and the next call sent\nthe stale buffer as the contents of the position that could not be read:\na read error on the segment never surfaced, and the client received a\ncorrupt batch.\n\nThis flips the buffer whether or not the read succeeds, so that it holds\nexactly what was read: nothing after a failed read or at the end of the\nfile. It also rethrows the `IOException` when bytes were already written\nin the same call: the connection is closed on it anyway, and returning\nthe bytes written only delayed the error to the next call.\n\nGenerated-by: Claude (Anthropic)\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e"
    },
    {
      "commit": "0d82450b0abc4dcefa68c0c17b4b33fc815838a6",
      "tree": "e3224fdd739539d4d0a345508b74643e0c7cc2b6",
      "parents": [
        "814cfa34ebd4b13e09b5eef7782f99bd82f1e9ea"
      ],
      "author": {
        "name": "Mykyta Bozhenko",
        "email": "21245729+cheeeee@users.noreply.github.com",
        "time": "Tue Oct 20 13:50:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 10:50:52 2026 -0700"
      },
      "message": "KAFKA-16304: Offline the log directory on a disk error in the zero-copy Fetch path (#23445)\n\nThe Fetch response is sent zero copy: the records are read from the\nsegment by `FileRecords.writeTo`, on the network thread, while the\nresponse is written to the socket. A failed read of the medium and a\nclient that went away both arrive there as a bare `IOException`, and\n`Selector` treats every one of them as a disconnect. A disk error on\nthis path therefore never offlines the log directory, unlike an I/O\nerror in the `LocalLog` operations.\n\nThis change offlines it, with the same split as elsewhere in the log:\nthe layer that sees the `IOException` reports it, and storage decides.\n\n* `LocalLog.read` gives the `FileRecords` slices it returns a transfer\n  failure handler.\n* When the transfer fails, `FileRecords.writeTo` passes the region it\n  was writing to the handler and rethrows the original exception\n  unchanged. A `ClosedChannelException` is not passed on: the file was\n  not read.\n* The handler re-reads the region on the log\u0027s scheduler, at most once\n  at a time per log directory, and calls\n  `LogDirFailureChannel.maybeAddOfflineLogDir` only if the read fails,\n  with the failed transfer attached. As the log cleaner does, the\n  directory is offlined and the error is not rethrown.\n\nThe network thread does no extra I/O on a failed send. The send itself\nis logged as a disconnect, at DEBUG; the ERROR comes from\n`LogDirFailureChannel`.\n\nThe classification is as accurate as what the JVM reports, and no more.\nNothing below the JVM is second-guessed: a transient media error that\nhas cleared by the time of the re-read is attributed to the socket, and\na read that fails for a reason other than the medium is treated as a\nstorage failure, the criterion `LocalLog` already applies. At the JVM\nlevel, the re-read of the region:\n\n* reads completely: the socket was at fault;\n* reaches the end of the file: the log was truncated concurrently (e.g.\n  the replica became a follower);\n* makes no progress: nothing can be concluded;\n* fails with `ClosedChannelException` or a subclass: the segment was\n  closed or deleted concurrently, which says nothing about the medium\n  (the reasoning of KAFKA-19571);\n* fails with any other `IOException`: the log directory is offlined.\n\nThe whole region is re-read rather than its first byte because,\ndepending on the platform, the transfer can fail anywhere within it\nwithout reporting progress: on macOS both `sendfile(2)` and `read(2)`\ndrop the partial progress of a chunk whose read fails, and on Windows\nthe JDK does not use `TransmitFile` for a non-blocking socket and falls\nback to a mapped buffer or `ReadFile`. On Linux the transfer fails at\nthe first unreadable page. The re-read reads at most what the failed\ncall was about to send. The message text of the exception is not\ninspected: it is platform specific.\n\nOnce the directory is offline its segments are closed, and the next\nFetch gets `KAFKA_STORAGE_ERROR`.\n\nConsequences worth stating:\n\n* A broker whose only log directory, or whose metadata log directory,\n  fails on this path now shuts down, as it does today for any other I/O\n  error in that directory.\n* The KRaft metadata log is read through `LocalLog` too. A read failure\n  while the leader sends it marks the raft log\u0027s directory offline, the\n  next append on the leader fails, and the raft I/O thread\u0027s fatal fault\n  handler stops the node, as it does today for an I/O error in\n  `LocalLog.read` on the metadata log.\n* The checks run on the broker\u0027s shared background scheduler (the raft\n  manager\u0027s own scheduler for the metadata log).\n* KRaft snapshots are sent through `UnalignedFileRecords`, which this\n  change does not cover; I will follow up separately.\n* On TLS listeners a read error does not reach `FileRecords` today:\n  `SslTransportLayer.transferFrom` swallows it and sends a stale buffer\n  instead (KAFKA-21280, #23832). This change takes effect on TLS\n  listeners once that is fixed.\n\nGenerated-by: Claude (Anthropic)\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e"
    },
    {
      "commit": "814cfa34ebd4b13e09b5eef7782f99bd82f1e9ea",
      "tree": "5ddc860648a22e04a0a25d55872c1759180bf20d",
      "parents": [
        "bfb092bbc0834048effce0a4aae1f1b4c8592d7d"
      ],
      "author": {
        "name": "Ritika Reddy",
        "email": "98577846+rreddy-22@users.noreply.github.com",
        "time": "Tue Oct 20 12:42:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 09:42:00 2026 -0700"
      },
      "message": "KAFKA-21181: Allow committing an empty transaction in TV2 (#23831)\n\nFollow-up to #23630, addressing\nhttps://github.com/apache/kafka/pull/23630#discussion_r4151983373.\n#23630\nreturns NOT_COORDINATOR once the broker has applied the leadership\nchange;\nthis covers a coordinator whose metadata is still behind.\n\nWith transaction V2, an EndTxn(COMMIT) at the current epoch on a\ntransaction\nin Empty, CompleteCommit or CompleteAbort state returned\nINVALID_TXN_STATE,\nwhich is fatal to the client. A coordinator that has lost leadership but\nnot\nyet applied the metadata change sees the transaction in exactly this\nstate,\nsince its partitions were added on the new coordinator, and answered\nfrom its\nstale cache.\n\nCommit an empty transaction instead, the same way an empty abort is\nhandled:\nbump the epoch, write PrepareCommit with no partitions and complete it\nwithout\nmarkers.\n\n- A stale coordinator cannot get that write replicated. The transaction\nlog\nis written with acks\u003d-1, and the new leader is in the old leader\u0027s ISR\nbut\nstopped fetching from it before the partitions were added. The client\ngets\na retriable error (NOT_COORDINATOR or COORDINATOR_NOT_AVAILABLE), looks\nup\n  the coordinator again and commits on the new one.\n- A coordinator that is up to date only sees an empty transaction when\nthe\nclient wrote nothing, since a TV2 produce always adds its partition to\nthe\n  transaction before it succeeds. Committing it is a no-op epoch bump.\n\nRetries are unchanged: CompleteCommit + Commit + Retry still returns\nNONE and\nCompleteAbort + Commit + Retry still returns PRODUCER_FENCED.\nTransaction V1\nis unchanged. A PrepareCommit with no partitions is loaded and completed\nthe\nsame way as the empty PrepareAbort that TV2 already writes.\n\nTests cover the updated state table, completing without markers, the\nretriable error when the write fails, producer ID rotation on an\nexhausted\nepoch, and loading an empty PrepareCommit from the log.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: Justine Olshan \u003cjolshan@confluent.io\u003e, Artem Livshits\n\u003calivshits@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "bfb092bbc0834048effce0a4aae1f1b4c8592d7d",
      "tree": "8ad451108585520442897e9efced38889f947789",
      "parents": [
        "e149305a6589e2c22e9f24cdcc157a9daffd53e9"
      ],
      "author": {
        "name": "Andrew Schofield",
        "email": "aschofield@confluent.io",
        "time": "Tue Oct 20 14:50:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 14:50:23 2026 +0100"
      },
      "message": "KAFKA-20858: Refactor subscription state (#22996)\n\nThe SubscriptionState class in the client is a core class in the\nconsumer and share consumer. It keeps track of all manner of consumer\nstate such as subscribed topics, assigned partitions and fetch\npositions.\n\nAlthough there are some concepts which are common to consumer group and\nshare group subscription state management, there are also many\ndifferences.\n\nThis task refactors the subscription state to remove this false coupling\nbetween group types, and give share groups better control over the\ntopics included in the metadata. It\u0027s a largely mechanical change.\n\nReviewers: Lianet Magrans \u003clmagrans@confluent.io\u003e"
    },
    {
      "commit": "e149305a6589e2c22e9f24cdcc157a9daffd53e9",
      "tree": "3559ea570bd51a3299be1e2612d6f6c72de92172",
      "parents": [
        "8e46092edac3e837972ee13b40dcc149e7113ae7"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Tue Oct 20 12:02:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 11:02:45 2026 +0100"
      },
      "message": "KAFKA-21288: Add MirrorPartitionState (#23830)\n\nThis patch add the `MirrorPartitionState` enum that is used by the\nvarious internal components to drive the mirror partition state. Note\nthat this is not exposed to clients.\n\nReviewers: Luke Chen \u003cshowuon@gmail.com\u003e, Christo Lolov\n \u003clolovc@amazon.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "8e46092edac3e837972ee13b40dcc149e7113ae7",
      "tree": "005687e1e2e72aaa80e510db6646731886f55876",
      "parents": [
        "f2f91b11706804181cbee2e0fd9807b18e92dad6"
      ],
      "author": {
        "name": "Dejan Stojadinović",
        "email": "dejan2609@users.noreply.github.com",
        "time": "Tue Oct 20 10:42:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 10:42:24 2026 +0200"
      },
      "message": "KAFKA-12744: Upgrade argparse4j from 0.7.0 to 0.9.0 (#23796)\n\n- Replace ArgumentParsers.newArgumentParser(...) with the builder API\nArgumentParsers.newFor(...)...build() in core, tools, shell, generator,\ntrogdor and connect-mirror. In StorageTool and KafkaDockerWrapper the\nold 4-arg call is reduced to newFor(..).fromFilePrefix(\"@\").build(),\nsince addHelp(true) and prefixChars(\"-\") are the builder defaults.\n- HelpScreenException moved from argparse4j.internal to\nargparse4j.helper; update imports accordingly.\n- Update the argparse4j version in LICENSE-binary.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "f2f91b11706804181cbee2e0fd9807b18e92dad6",
      "tree": "a1433808c9aec2939abc7e19085e8a0244e6d788",
      "parents": [
        "a0d918c5b582588f9da7124d0f78409063b07517"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Tue Oct 20 02:11:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 02:11:49 2026 +0800"
      },
      "message": "MINOR: Update documentation version references to 4.4 (#23869)\n\nUpdate outdated documentation version references to 4.4. Adjust the\ntiered storage example to use the test fixtures JAR, as\n`LocalTieredStorage` has moved to `src/testFixtures`.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a0d918c5b582588f9da7124d0f78409063b07517",
      "tree": "4381fd4e426932dae1968da70c548ad5a6c3e714",
      "parents": [
        "cf93eefad7aae3eb6e5e2d4afd7688f84874bc2e"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Mon Oct 19 22:02:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 22:02:41 2026 +0530"
      },
      "message": "KAFKA-21307: Add share group DLQ setup to ShareConsumeBenchSpec (#23867)\n\nAdd two optional fields to ShareConsumeBenchSpec:\n\n- shareGroupDLQConfig: the DLQ topic name, its PartitionsSpec and\ncopyRecordEnable. Before the consumers start, ShareConsumeBenchWorker\ncreates the DLQ topic, enables it for use as a DLQ, and sets the DLQ\ntopic name and copy record configs on the share group.\n- recordAcknowledger: a RecordAcknowledger, following the\nRecordProcessor pattern, that returns the AcknowledgeType for each\nconsumed record. RandomRecordAcknowledger is the first implementation.\nIts counts are reported in the worker status.\n\nrecordAcknowledger makes the consumers use explicit acknowledgement mode\nand cannot be combined with acknowledgeType.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "cf93eefad7aae3eb6e5e2d4afd7688f84874bc2e",
      "tree": "3eeae374f7eb01a710d78d476b88b367f2ff8e6b",
      "parents": [
        "efe988d1084b61bbe1c35d4a1775b38434d43573"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Mon Oct 19 23:39:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 23:39:43 2026 +0800"
      },
      "message": "KAFKA-21293 SubscriptionState#unsubscribe should not reset the rebalance listener (#23852)\n\n`SubscriptionState#unsubscribe()` resets the listener context to\n`NULL_LISTENER`, so calling `unsubscribe()` silently drops the user\u0027s\nrebalance listener.\n\nKIP-1306 only states that passing null removes the current listener. The\nprevious implementation also did not reset the listener on\nunsubscribe().\n\nReviewers: ChickenchickenLove \u003cojt90902@naver.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "efe988d1084b61bbe1c35d4a1775b38434d43573",
      "tree": "ae5566ed9a2ea918d383ad7d64cb1bc7bc39fb44",
      "parents": [
        "f568b7b2c8802e6635b4d8df93ede88e55a2b84d"
      ],
      "author": {
        "name": "gomudayya",
        "email": "gomudayya@gmail.com",
        "time": "Tue Oct 20 00:23:18 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 17:23:18 2026 +0200"
      },
      "message": "KAFKA-20391: Improve types returned by the Connect REST API (#22001)\n\n- Replace generic `Response` return types with specific types in\n`LoggingResource` and `ConnectorsResource` to improve OpenAPI spec\ngeneration\n- Update corresponding unit tests\n- Endpoints returning non-200 status codes (201, 202, 204) or using\nconditional status codes were left unchanged as they require `Response`\nfor status code control.\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, Murali Basani \u003cmuralidhar.basani@aiven.io\u003e"
    },
    {
      "commit": "f568b7b2c8802e6635b4d8df93ede88e55a2b84d",
      "tree": "25de853604341da3bb5071842a533e271ec2990a",
      "parents": [
        "2b5dfe22cdb7be8ef5d32296f77687ee32e9182e"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Mon Oct 19 13:15:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 13:15:29 2026 +0200"
      },
      "message": "MINOR: Share one empty array between empty IntLists (#23861)\n\nA uniform2 `IntList` created with a capacity of 0 allocates an empty\narray, and the balance step creates up to three such lists per member,\nmost of which stay empty. This patch makes these lists share one empty\narray, which they replace with their own at their first add.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2b5dfe22cdb7be8ef5d32296f77687ee32e9182e",
      "tree": "77face9a91165566882a3c17de536a80bceca04e",
      "parents": [
        "f90822763913e10a02478c235b34a5ea9f36856e"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Mon Oct 19 03:41:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 09:41:17 2026 +0200"
      },
      "message": "KAFKA-20999: [1/N] Add RackAwareStandbyPicker for rack-aware standby placement (#23790)\n\nFirst part of rack-aware standby placement for streams groups. It adds\nRackAwareStandbyPicker, which the sticky assignor and balanced assignor\nwill use to place standbys by rack.aware.assignment.tags. Nothing calls\nit yet; the next PR wires it into StickyTaskAssignor.\n\nA process meets a tag key when it has a value for it that no holder of\nthe task has yet. For the next standby of a task, pick() chooses the\nconditions: every tag key with an unused value if a process with room\nmeets them all; otherwise, the tag keys in configured order, each kept\nonly if a process with room still meets it together with those kept so\nfar. It returns the conditions together with the least-loaded process\nwith room that meets them, or null once no process with room can make\nthe task more diverse.\n\nThe processes sit in a tree with one level per tag key, so a pick does\nnot scan every combination of tag values. Each node keeps the\nleast-loaded process with room below it, and its children are ordered by\nit. The caller reports load and room changes with updated() and\nupdatedAll(), which repair only the affected paths.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "f90822763913e10a02478c235b34a5ea9f36856e",
      "tree": "11019959907781d596b0409c901a87f19d87574e",
      "parents": [
        "cc8baadc9f0363f2bdfe68a2f1cd8dbe4372d282"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Mon Oct 19 00:56:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 06:56:45 2026 +0800"
      },
      "message": "KAFKA-21257 Document tokenless OAUTHBEARER login for validate-only brokers (#23818)\n\nRef : https://issues.apache.org/jira/browse/KAFKA-21257\n\nA broker that only validates OAUTHBEARER tokens still runs a JAAS login\nat startup. With no login callback handler configured, the default\nOAuthBearerUnsecuredLoginCallbackHandler handles that login.\n\nSince KAFKA-21143, it creates no token unless an unsecuredLogin* option\nis set, so ssl.* options for JWKS TLS trust are fine. Some users rely on\nthis, but authentication-using-sasl.md never described it.\n\nThis PR adds a \"Tokenless login for validate-only brokers\" section\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "cc8baadc9f0363f2bdfe68a2f1cd8dbe4372d282",
      "tree": "89ed3c8dc7f5f12e9b65664f5c4de11a5aa1d2db",
      "parents": [
        "65566690ca1ddb584388c1026e2ff6673e9c6f19"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Sun Oct 18 23:10:49 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 18 22:10:49 2026 +0800"
      },
      "message": "MINOR: Fix login callback config cleanup in SaslAuthenticatorTest (#23746)\n\nSaslAuthenticatorTest#testServerLoginCallbackOverride puts a\nlistener-prefixed sasl.login.callback.handler.class to check that it is\nrejected without a mechanism prefix, but then removes the\n\"plain.\"-prefixed  key instead. That key had already been removed by the\nprevious step, so  the listener-prefixed key stays in the config for the\nrest of the test.\n\nThis does not change what the test verifies. After the listener prefix\nis  stripped, the server looks up the handler only with the mechanism\nprefix,  so the leftover key is ignored and the final step still checks\nthe  listener and mechanism prefixed override.\n\nThis removes the listener-prefixed key instead, and replaces the three\ntry/fail/catch blocks in this test with assertThrows, keeping the\nexpected  exception type and the failure messages. It also converts the\ntry/fail/catch  block in testMissingUsernameSaslPlain to assertThrows.\n\nReviewers: liuliu \u003cliuliugit@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "65566690ca1ddb584388c1026e2ff6673e9c6f19",
      "tree": "6e84dc380897d3dc9fa4518854672c60b3f79701",
      "parents": [
        "59046aecc31bd1bed83a434c0db61aea95fd644a"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Fri Oct 16 17:33:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 17:33:10 2026 -0400"
      },
      "message": "MINOR: Don\u0027t block on position() when advancing standby restored offsets (#23841)\n\nFollow-up to KAFKA-14302 (#23298). `maybeAdvanceStandbyRestoredOffset`\ncalled the blocking `restoreConsumer.position()`, which can wait up to\n`default.api.timeout.ms` while the position is unresolved. It runs on\nevery restore loop for every standby changelog, including paused ones\nwhile actives restore, so a single standby could stall the state-updater\nthread. Both calls now use `position(partition, Duration.ZERO)`, and a\ntimeout is logged at debug and retried on the next loop.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "59046aecc31bd1bed83a434c0db61aea95fd644a",
      "tree": "a2e72e3315744539ad73a877c9bd753e1a090beb",
      "parents": [
        "b35ed0ec911fb6a5a4a31e8481cd81ed5e040bf6"
      ],
      "author": {
        "name": "Omnia Ibrahim",
        "email": "o.g.h.ibrahim@gmail.com",
        "time": "Fri Oct 16 18:14:47 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 01:14:47 2026 +0800"
      },
      "message": "KAFKA-21289 Fix release.py stage-docs for Hugo kafka-site (#23833)\n\nChanges\n\n- swaps the sentinel check to `hugo.yaml` instead of `owered-by.html`\n- splits the extraction: markdown goes to `content/en/\u003cversion\u003e`,\njavadoc goes to `static/\u003cversion\u003e`\n- the site-docs tar bundles images in alongside the markdown, so those\nget pulled out of `content/en/\u003cversion\u003e/images` and moved into\n`static/\u003cversion\u003e/images` right after extraction — otherwise they’d sit\nin the wrong place. NOTE: I hardcoded `images` as the one directory that\nneeds pulling out of `content/\u003cversion\u003e` — based on what’s actually in\nthe tar now and what the existing slots look like. Any future doc change\nbundling some other asset directory into the tar won’t be caught by\nthis.\n\n- fixed a small pre-existing bug while I was in there: the sentinel\nfailure message was missing an `f` prefix, so it was printing\n`{kafka_site_repo_path}` literally instead of the actual path\n\nTesting\n- Ran stage-docs locally twice against `4.4.0`, staged into a real\nHugo-based kafka-site clone. `content/en/44` and `static/44` come out\nmatching exactly what the `4.0`, `4.3.0`, and `4.3.1` slots already look\nlike — same top-level structure. `4.4.0` docs are published as part of\n[kafka-site#925](https://github.com/apache/kafka-site/pull/925 )\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b35ed0ec911fb6a5a4a31e8481cd81ed5e040bf6",
      "tree": "309bf18f91b8564066942e0e1c38f355e235d1bb",
      "parents": [
        "f6f4cc09335ac8f51cb0d88d8fbe62d0bd303e8f"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Fri Oct 16 19:12:10 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 01:12:10 2026 +0800"
      },
      "message": "KAFKA-21214: [6/N] Add the balance step of the uniform2 assignor (#23735)\n\nuniform2 decides how many partitions of every topic each member gets,\nits quotas, in three steps. The first two give every extra partition to\na distinct subscriber of its topic, but they can leave a member with an\nassignment much larger than another subscriber of one of its topics.\n\nThis patch adds the balance step, `BalanceExtraPartitions`, which the\nassignor runs after the other two steps in a later patch. The step\napplies a single rule until it no longer applies. The member with the\nlargest assignment, among those with an extra partition that can move,\ngives one to the smallest member that can take it, which is a subscriber\nof the topic, with no extra partition of the topic and at least two\npartitions smaller. Every move lowers the sum of the squares of the\nassignment sizes, so the step ends, and it ends exactly when no extra\npartition can move to a subscriber of its topic at least two partitions\nsmaller.\n\nChanges:\n- The givers wait in a heap, the largest first, and a giver without a\n  receiver is parked until a move may give it one. The step ends once\n  the largest giver is less than two partitions above the smallest\n  member.\n- The giver gives the extra partition whose move revokes the fewest\n  partitions. On equal assignment sizes, a giver with a free extra\n  partition gives first, and a receiver owning more than the minimum\n  quota of a topic with extra partitions receives first, since only\n  such a receiver can keep one more of its partitions.\n- To find receivers quickly, each giver counts its extra partitions per\n  cohort, for the topics that the cohort subscribes to. The counts are\n  kept for every member when they fit, and otherwise for one member at\n  a time. A constructor forces either way, and a test checks that both\n  give the same quotas on random groups.\n- When all assignment sizes are within one of each other, nothing can\n  move, and the step returns without building any state.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "f6f4cc09335ac8f51cb0d88d8fbe62d0bd303e8f",
      "tree": "d5a8f75c6ec933ae5160d51c7169ecd56dab1b00",
      "parents": [
        "34f859e2ceac6d75a488508939c41687db585651"
      ],
      "author": {
        "name": "Kuan-Po Tseng",
        "email": "brandboat@gmail.com",
        "time": "Sat Oct 17 00:55:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 00:55:37 2026 +0800"
      },
      "message": "KAFKA-21153 Add physical log deletion tests to DeleteTopicTest (#23827)\n\nAdd dedicated physical log deletion coverage to `DeleteTopicTest`,\ncovering both normal cleanup and cleanup of pending `-delete`\ndirectories after a broker restart. This complements the existing\ncoverage in `ProducerSendWhileDeletionTest#verifyTopicDeletion`.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "34f859e2ceac6d75a488508939c41687db585651",
      "tree": "4c2a4cefacf6a4ebd1aef6698680b5e060ee21ef",
      "parents": [
        "e09cc6332101a976c738d38041e945402bc941e1"
      ],
      "author": {
        "name": "KhyatiVaghamshi",
        "email": "khyati220@gmail.com",
        "time": "Fri Oct 16 05:40:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:40:53 2026 +0200"
      },
      "message": "KAFKA-21268: Replace temp file handler with JUnit 5 @TempDir in server, shell, and storage tests (#23810)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, liuliu \u003cliuliugit@gmail.com\u003e\nCo-authored-by: khyativ \u003ckvaghamshi@salesforce.com\u003e"
    },
    {
      "commit": "e09cc6332101a976c738d38041e945402bc941e1",
      "tree": "0e9311fd8d878cdc93e20c29afae22256b7b148b",
      "parents": [
        "f7a6dfe076929c3b761bfb9fbb97f786ff9503e8"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Fri Oct 16 00:58:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 08:58:07 2026 +0100"
      },
      "message": "KAFKA-20684 [8/N]: Migrate clients tests to RebalanceListener (#23108)\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "f7a6dfe076929c3b761bfb9fbb97f786ff9503e8",
      "tree": "67c40b58204d07952b04ff6901df593b9a987ae7",
      "parents": [
        "b2f85364e44abfea2bb1937d894b36edae80b968"
      ],
      "author": {
        "name": "Andy Huang",
        "email": "ky052632@gmail.com",
        "time": "Fri Oct 16 07:16:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 07:16:28 2026 +0800"
      },
      "message": "MINOR: Migrate PlaintextConsumerAssignorsTest to Java (#23708)\n\nMigrates `PlaintextConsumerAssignorsTest` from Scala in `core` to Java\nin `clients-integration-tests` using `ClusterTestExtensions`, as part of\nKAFKA-19042.\n\nPreserves all nine assignor scenarios and reuses the existing\n`ConsumerAssignmentPoller` and `ClientsTestUtils` helpers. The group\nassignment checks now fail fast when a poller thread hits an exception,\ninstead of waiting for the timeout. Pollers and consumers are closed\nafter each test. Removes the original Scala test.\n\nReviewers: Chia-Ping Tsai\n\u003c[chia7712@gmail.com](mailto:chia7712@gmail.com)\u003e"
    },
    {
      "commit": "b2f85364e44abfea2bb1937d894b36edae80b968",
      "tree": "eebf590dc06bfb0382bb0dd3167ea6fec60ab603",
      "parents": [
        "dfd3dcab0756a8574105db4c159ed19d500bcef7"
      ],
      "author": {
        "name": "Ramu",
        "email": "kramu.k7@gmail.com",
        "time": "Fri Oct 16 03:18:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 17:48:27 2026 -0400"
      },
      "message": "KAFKA-14302: Advance restored offsets after changelog catch-up (#23298)\n\n## What is the bug?\n\nWhen restoring an empty changelog with a non-zero end offset,\nProcessorStateManager does not update the restored offset because no\nrecords are applied.\n\nAs a result, changelogOffsets() can report 0 even though restoration has\ncompleted at a higher offset. This can cause Kafka Streams to\nincorrectly report recovery lag for the task.\n\n## What does this change do?\n\nThe fix advances the restored offset once changelog restoration has\nactually reached its known boundary.\n\nThe implementation preserves the existing offset semantics and ensures\nthat the restored offset does not move backwards.\n\n## Testing\n\nAdded regression coverage for:\n\n* An empty changelog with a high end offset.\n* Task lag calculation after changelog restoration.\n* Active and standby restore scenarios.\n\nExisting relevant Streams tests also pass.\n\nReviewers: Alan Lau (github:alanlau28), Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "dfd3dcab0756a8574105db4c159ed19d500bcef7",
      "tree": "c973110b66eabab0e3e504d39b83e232bdb28e8a",
      "parents": [
        "383388b6700c9ca7d5dea2e50f425698853eef6f"
      ],
      "author": {
        "name": "Bill Bejeck",
        "email": "bbejeck@apache.org",
        "time": "Thu Oct 15 16:37:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 16:37:14 2026 -0400"
      },
      "message": "KAFKA-21253: Always clear record collector offsets in closeDirty (#23791)\n\n`RecordCollectorImpl.closeDirty()` aborts the open transaction before\ncalling `close()`, which clears the collector\u0027s changelog offsets. If\nthe abort throws, `close()` is skipped and the offsets are kept. This\nhappens with an `IllegalStateException` after a timed-out\n`commitTransaction()`. The revived task reuses the collector, so if it\nis closed clean while its wiped store is still restoring, those stale\noffsets are checkpointed. The next restore then skips the missing\nrecords.\n\nThis change moves `close()` into a `finally` block so the offsets are\nalways cleared. It also logs the abort failure at ERROR before\nrethrowing. The caller still swallows the exception, and before this\nchange it was only logged at DEBUG, without the exception.\n\n`CommitTimeoutDirtyCloseIntegrationTest` uses the fault proxy to\nreproduce this. A delayed EndTxn leaves a commit pending, so the abort\nfails. A later `ILLEGAL_GENERATION` on `TxnOffsetCommit` migrates the\nthread, and the restoring task is closed clean.\n\nThe associated integration test replicates the issue and without the fix\nin this PR it fails.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "383388b6700c9ca7d5dea2e50f425698853eef6f",
      "tree": "b4471e455bd9e950251bd596e51b6ee5097d6c87",
      "parents": [
        "3d1e3f5547ea34b0777b50ab046de36046c91746"
      ],
      "author": {
        "name": "Pranav Siby",
        "email": "psiby@confluent.io",
        "time": "Fri Oct 16 01:27:23 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:57:23 2026 +0800"
      },
      "message": "KAFKA-15976 Follow-up fixes for initial offsets on connector creation (#23783)\n\nFollow-up to #23268, addressing the review comments left after it was\nmerged:\n\n- Leave `initial_offsets` out of the request when it is null, so a\nleader or extension that doesn\u0027t know the field doesn\u0027t reject it.\n- Re-read the connector configs before checking whether the connector\nexists, like the offsets endpoints do.\n- If another request creates the connector while the offsets are being\nwritten, don\u0027t wipe them, since they now belong to that connector.\n- Keep a single `CreateConnectorRequest` constructor.\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "3d1e3f5547ea34b0777b50ab046de36046c91746",
      "tree": "d7baae51ab263fbe12aff0b2dac346371ecc353e",
      "parents": [
        "2f1f34df2fd3bf6e153ffc43a14fe67dfc3fb12f"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 15 13:29:52 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:29:52 2026 +0200"
      },
      "message": "KAFKA-21214: [5/N] Move the steps of the uniform2 assignor to a subpackage (#23823)\n\nThe steps of the uniform2 assignor and the data classes they work on\nshare one package, so only their names tell them apart. This patch moves\nthe steps to the `steps` subpackage. Java has no sub-package visibility,\nso the data classes and their members that are not private become\npublic.\n\nChanges:\n- Move `KeepStickyExtraPartitions` and `AssignRemainingExtraPartitions`,\n  and their tests, to `uniform2.steps`. The two classes, their\n  constructors and `run` become public.\n- Make `IndexedGroup`, `IndexedGroup.Builder`, `CurrentAssignment` and\n  `Quotas` public, with all their members that are not private.\n- Make the test fixture `QuotasFixture` public, with all its members\n  that are not private.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "2f1f34df2fd3bf6e153ffc43a14fe67dfc3fb12f",
      "tree": "50d8081e7f94f2a73a26d6651ce0da8e1f2d7edb",
      "parents": [
        "4abb5a26e44a46dac70f7c1b567bf5841e30d1fa"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Thu Oct 15 10:36:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:36:28 2026 +0200"
      },
      "message": "KAFKA-21111 [2/N]: Grant tasks at once to members that cannot be warmed up (#23784)\n\nThis is the second change of the series that makes the warm-up task\nrefiner (KAFKA-20665) compatible with clients that speak version 0 of\nthe streams group heartbeat (see KAFKA-21111), on top of #23761.\n\nA warm-up task can only complete a migration if the coordinator observes\nthe target owner restoring it, which a member that heartbeats with\nversion 0 never allows, as it does not report task offsets. When the\ntarget assignment moves a stateful task to such a member, the refiner no\nlonger stages the migration. It lets the target assignment through for\nthat task, so the current owner revokes it and the target owner takes it\nover, as it would without a refiner.\n\nThe check sits after the readiness check, so that a move between two\nmembers of one process still happens inside the instance, and before the\nanalysis of the incumbent and of the copies, so that a caught-up copy on\nanother process is not promoted as a temporary owner. That detour would\nonly postpone the same cold grant and add a second hand-over. The\nversion of the current owner is irrelevant: a member that processes a\ntask is hot by definition, and keeps it while a target owner that can be\nwarmed up restores it. If the target owner already holds a standby task\nof the task, the client recycles it into the active task, so the grant\nis warm in the common case, even though the coordinator cannot see that.\n\nThe refiner is not the default yet, so this change is not live. The\ntests cover the grant, the missing detour through a caught-up copy, and\na current owner of version 0 that keeps its task.\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "4abb5a26e44a46dac70f7c1b567bf5841e30d1fa",
      "tree": "6bb74afc00755fc0c6bccd22df8c47e4a60f7d38",
      "parents": [
        "292ad36280a55f4405033eb212451ea95513c6c1"
      ],
      "author": {
        "name": "Kuan-Po Tseng",
        "email": "brandboat@gmail.com",
        "time": "Thu Oct 15 15:58:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:58:34 2026 +0800"
      },
      "message": "KAFKA-21153: Remove the wait file cleanup logic in ClusterInstance#waitTopicDeletion (#23800)\n\nClusterInstance#waitTopicDeletion waits for asynchronous physical file\ncleanup, forcing tests to shorten `log.initial.task.delay.ms` and\n`log.segment.delete.delay.ms` to avoid timeouts. This wait is\nunnecessary for tests that only require logical topic deletion. Physical\ncleanup should be verified by dedicated tests, allowing other tests to\nuse the default configuration.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Ken Huang\n \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "292ad36280a55f4405033eb212451ea95513c6c1",
      "tree": "e23d7b7ce1587e956c991750c915c6e31753048b",
      "parents": [
        "8c012276cf118c88a99665a36112e09181459a90"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Thu Oct 15 09:46:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 09:46:26 2026 +0200"
      },
      "message": "KAFKA-21214: [3/N] Add the quotas and the first two steps of the uniform2 assignor (#23733)\n\nuniform2 decides how many partitions of every topic each member gets,\nits quotas, in three steps, and then places the partitions. A topic with\nP partitions and N subscribers has a minimum quota of P / N partitions,\nand its P % N extra partitions go to as many distinct subscribers.\n\nThis patch adds the quotas and their first two steps:\n- `Quotas` holds the minimum quota and the extra partitions of every\n  topic, the members getting the extra partitions, and the assignment\n  sizes of the members. The steps give the extra partitions and move\n  them.\n- `KeepStickyExtraPartitions`: a member owning more than the minimum\n  quota of a topic keeps one of its extra partitions, the members with\n  the smallest assignments first when the owners outnumber the extra\n  partitions.\n- `AssignRemainingExtraPartitions` gives the extra partitions that\n  nobody kept, one at a time, to subscribers without one of the topic,\n  among the ones with the smallest assignments: the topics with the\n  fewest subscribers first, and round robin within a cohort. It returns\n  without allocating anything when the owners kept them all.\n- `IntPair` packs two ints in a long, so that pairs sort in a `long[]`\n  or a `LongHeap` without allocating.\n- A step is created with what it works on and run once; the assignor\n  runs the steps in order in a later patch.\n- `QuotasFixture` holds the indexed group, the current assignment and\n  the quotas of a group for the tests of the steps.\n\nThe balance step comes in a later patch.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "8c012276cf118c88a99665a36112e09181459a90",
      "tree": "143d7cf4b90e978df68f0ca4ecd1b4a227fee706",
      "parents": [
        "e2c58a0163c89d00cebc877fbdd81d4267be774f"
      ],
      "author": {
        "name": "SunMin Lee",
        "email": "sunmin4142@gmail.com",
        "time": "Thu Oct 15 16:43:33 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:43:33 2026 +0800"
      },
      "message": "MINOR: Replace try/fail/catch with assertThrows in remaining Streams tests (#23636)\n\nReplace the remaining straightforward try/fail/catch exception\nassertions in the Streams tests with `assertThrows`, following #23277\nand #23389.\n\nIn #23389, streams.internals, streams.state.internals,\nstreams.processor.internals, and streams.integration were left unchanged\nbecause they overlapped with in-flight Hamcrest removal work.\nThe referenced PRs (#23307, #23386, and #23387) have since been merged,\nand KAFKA-21028 has been resolved. This PR covers the remaining\nstraightforward assertions in streams.state.internals,\nstreams.processor.internals, and streams.integration, along with those\nin streams.kstream.internals, streams.processor, and streams/test-utils.\n\nWhere the catch block checked the exception message, the `assertThrows`\nreturn value is used to keep that check. Descriptive `fail()` messages\nare kept, and generic ones are replaced with messages that name the\nrejected operation. Unused `fail` imports are removed.\n\nIn `FineGrainedAutoResetIntegrationTest`, only `builder.build()` is\nwrapped, because the overlapping source is rejected when the topology\nis built, not when `stream()` is called. In\n\n`TimeOrderedKeyValueBufferTest#shouldNotRestoreUnrecognizedVersionRecord`,\nthe `finally` block that cleans up the buffer is kept.\n\nLeft unchanged:\n- `GlobalStateTaskTest`: `fail()` is conditional on a test parameter,\n  so it is not a direct try/fail/catch.\n- `KafkaStreamsTest#shouldThrowTopologyExceptionOnEmptyTopology`: same\n  reason as in #23389 (the `fail()` sits inside try-with-resources).\n- `TimeOrderedKeyValueBufferTest` still imports `fail` for the\n  `default` branch of a switch in a callback.\n\nTesting:\n\n```sh\n./gradlew :streams:checkstyleTest :streams:spotlessCheck \\\n    :streams:test-utils:checkstyleTest :streams:integration-tests:checkstyleTest\n./gradlew :streams:test \\\n    --tests org.apache.kafka.streams.state.internals.CompositeReadOnlyWindowStoreTest \\\n    --tests org.apache.kafka.streams.state.internals.CompositeReadOnlySessionStoreTest \\\n    --tests org.apache.kafka.streams.state.internals.MaybeTest \\\n    --tests org.apache.kafka.streams.state.internals.TimeOrderedKeyValueBufferTest \\\n    --tests org.apache.kafka.streams.processor.internals.ProcessorContextImplTest \\\n    --tests org.apache.kafka.streams.processor.UsePartitionTimeOnInvalidTimestampTest \\\n    --tests org.apache.kafka.streams.kstream.internals.KStreamPeekTest \\\n    --tests org.apache.kafka.streams.kstream.internals.KTableTransformValuesTest\n./gradlew :streams:test-utils:test --tests org.apache.kafka.streams.MockProcessorContextTest\n./gradlew :streams:integration-tests:test \\\n    --tests org.apache.kafka.streams.integration.FineGrainedAutoResetIntegrationTest\n```\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "e2c58a0163c89d00cebc877fbdd81d4267be774f",
      "tree": "d6bc1ca43f99fa5e2c31799054357f11ed853ca0",
      "parents": [
        "e58847b4d46869704e87b071eb2b8b96cffe93a3"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Thu Oct 15 03:23:20 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:23:20 2026 +0900"
      },
      "message": "KAFKA-21223: Add topic-level configs (#23782)\n\nThis patch adds topic-level configurations for the Cluster Mirroring\nfeature (KIP-1279) and related unit tests. Note that these properties\nare temporarily defined as internal to avoid exposing to users.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Luke Chen\n\u003cshowuon@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "e58847b4d46869704e87b071eb2b8b96cffe93a3",
      "tree": "4f511f20c3ccf8b4ccd9abf7d537be5269252807",
      "parents": [
        "ca08bdc233e04c0786834771585c1f90d4eb4f2b"
      ],
      "author": {
        "name": "Yen-Ting Li",
        "email": "ytli.tw@gmail.com",
        "time": "Thu Oct 15 04:17:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 04:17:52 2026 +0800"
      },
      "message": "MINOR: Prevent swallowing exceptions in MetricsDuringTopicCreationDeletionTest (#23704)\n\n`createAndDeleteTopics()` wrapped `createTopic()` and `deleteTopic()` in\n`catch (Exception ignored)`. The original Scala test tolerated failures\nbecause `deleteTopic` did not wait for deletion to complete.\n`ClusterInstance.deleteTopic` now does, so the catch is no longer needed\nand only hides `InterruptedException`.\n\nThis PR removes the try/catch and lets exceptions propagate.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "ca08bdc233e04c0786834771585c1f90d4eb4f2b",
      "tree": "23e1a53822709c7f3fb7d78152c87f30bb3c3fd6",
      "parents": [
        "27801d794b4bcb3fad6d2cff3a3d2137ec779174"
      ],
      "author": {
        "name": "hysu",
        "email": "dame3902@gmail.com",
        "time": "Wed Oct 14 12:57:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 03:57:13 2026 +0800"
      },
      "message": "MINOR: Limit ConsoleConsumerTest to KRaft mode only (#23690)\n\nFollow-up to #23684. The `@ClusterTest` methods in `ConsoleConsumerTest`\ndo not depend on the controller deployment mode, so running them in both\n`KRAFT` and `CO_KRAFT` is redundant. This patch restricts the class to\n`Type.KRAFT` via `@ClusterTestDefaults`.\n\nReviewers: Andy Huang \u003cky052632@gmail.com\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "27801d794b4bcb3fad6d2cff3a3d2137ec779174",
      "tree": "38779ca861f7a9106e2d020a9b41039625955d18",
      "parents": [
        "b7665039a5b8dfa157fe1ea588fa8c7291b89a5d"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Wed Oct 14 21:40:02 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 03:40:02 2026 +0800"
      },
      "message": "KAFKA-21222 Add broker-level configs (part 2) (#23797)\n\nFollow-up to #23729: move DynamicClusterMirrorConfig to the server\nmodule as Java code, taking a Supplier\u003cAbstractKafkaConfig\u003e instead of\nKafkaBroker, and drop the redundant check on\nmirror.metadata.refresh.interval.ms already enforced by ConfigDef.\n\nReviewers: Gaurav Narula \u003cgaurav_narula2@apple.com\u003e, Luke Chen\n\u003cshowuon@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b7665039a5b8dfa157fe1ea588fa8c7291b89a5d",
      "tree": "7cbaf862f13afe1c37ef998cb6aaa8b9c15bac3c",
      "parents": [
        "b9b0c909c6f01a2b50ff3a2478903be11312e35a"
      ],
      "author": {
        "name": "gabriellafu",
        "email": "100360154+gabriellefu@users.noreply.github.com",
        "time": "Wed Oct 14 14:25:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 02:25:13 2026 +0800"
      },
      "message": "MINOR: update upgrade.md on rack config (#23817)\n\nAdding rack config into 4.4, document it in upgrade.me\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b9b0c909c6f01a2b50ff3a2478903be11312e35a",
      "tree": "6b84953fbaa740ba73628a72c879c165a6ced674",
      "parents": [
        "abc2906503edc3509faf63e83ce424bc51c3432b"
      ],
      "author": {
        "name": "Sushant Mahajan",
        "email": "smahajan@confluent.io",
        "time": "Wed Oct 14 20:02:39 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 20:02:39 2026 +0530"
      },
      "message": "MINOR: Add optional acknowledgeType to ShareConsumeBenchSpec (#23802)\n\nAdd an optional \"acknowledgeType\" property (ACCEPT, REJECT or RELEASE)\nto the Trogdor ShareConsumeBenchSpec. When set, the share consumers use\nexplicit acknowledgement mode and acknowledge every polled record with\nthat type. RENEW is not supported. When absent, behaviour is unchanged\n(implicit acknowledgement), so existing specs and callers keep working.\n\nThe worker fails fast if acknowledgeType is combined with\nshare.acknowledgement.mode\u003dimplicit in the client configs. Also add an\nacknowledge_type argument to the ducktape ShareConsumeBenchWorkloadSpec.\nCo-Authored-By: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "abc2906503edc3509faf63e83ce424bc51c3432b",
      "tree": "a2b4f1f219e4c2da6f82f5b44b743cc88e4b9483",
      "parents": [
        "515a8c50c88e03a4a84f3b1175140802997bd830"
      ],
      "author": {
        "name": "Lucy Liu",
        "email": "lucliu@confluent.io",
        "time": "Wed Oct 14 05:15:19 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 18:15:19 2026 +0800"
      },
      "message": "MINOR: Address 4.4 documentation gaps for Streams and OAuth (#23809)\n\n## What\n  * Add KIP-1321 (headers-aware StreamPartitioner) to the 4.4.0 Streams\nupgrade guide.\n  * Add KIP-892 (transactional state stores) to the 4.4.0 Streams\nupgrade guide.\n  * List the streams rack-aware assignment tag configs in the rebalance\nprotocol page.\n  * Add expected audience/issuer to the broker OAUTHBEARER example,\nwhich otherwise fails to start since 4.4.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "515a8c50c88e03a4a84f3b1175140802997bd830",
      "tree": "311e4cba324ca94c305b0bfb15890953943c94bd",
      "parents": [
        "54026bcf81cc09a5780d4a02a604aeca6bd24b35"
      ],
      "author": {
        "name": "Alan Lau",
        "email": "72107214+alanlau28@users.noreply.github.com",
        "time": "Wed Oct 14 05:52:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 10:52:00 2026 +0100"
      },
      "message": "KAFKA-20924: Use Request Header v3 for GetTelemetrySubscriptions and PushTelemetry v1 (#23651)\n\nJira: https://issues.apache.org/jira/browse/KAFKA-20924\n\nKIP-1313:\n\nhttps://cwiki.apache.org/confluence/spaces/KAFKA/pages/406624038/KIP-1313+Client+instance+ID+in+all+request+headers\n\nFollows #23544. This PR introduces v1 of GetTelemetrySubscriptions and\nPushTelemetry, which move the client instance ID from the request body\ninto the v3 request header, and makes client telemetry use the client\ninstance ID that each client generates at construction.\n\nReviewers: Andrew Schofield \u003caschofield@confluent.io\u003e"
    },
    {
      "commit": "54026bcf81cc09a5780d4a02a604aeca6bd24b35",
      "tree": "f44558acd25e537b9f517ff9e5a8ba58745c51d8",
      "parents": [
        "0e7f9c73071799f02fa8c38ebe3513eba7b69c53"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Wed Oct 14 11:49:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 11:49:19 2026 +0200"
      },
      "message": "KAFKA-21214: [4/N] Build IndexedGroup with IndexedGroup.Builder (#23801)\n\nThe `IndexedGroup` constructor reads the subscriptions with\n`SubscriptionReader` and `CohortsBySubscription`, then renumbers their\ntopic indices and cohort subscriptions in place, after taking them\nthrough a field access and the `subscriptions()` getter. The helpers\nhand over structures that are invalid afterwards, without their API\nshowing it.\n\nThis patch moves the read phase into `IndexedGroup.Builder`, which owns\nall its state and renumbers it in place in `build()`, and makes\n`IndexedGroup` an immutable holder of the finished data. The operations\nand the results do not change.\n\nChanges:\n- Add `IndexedGroup.Builder`, which merges `SubscriptionReader` and\n  `CohortsBySubscription` and computes the members of every cohort,\n  the subscriber counts and the cohorts of every topic. `build()` can\n  be called once.\n- `IndexedGroup` takes the finished data in its constructor and keeps\n  its accessors.\n- `IndexedGroupTest` tests the cohorts with the same hash through a\n  group spec, and tests that a second `build()` throws.\n- The tests build their groups with `IndexedGroup.Builder`.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "0e7f9c73071799f02fa8c38ebe3513eba7b69c53",
      "tree": "a0aad3745d08ef533c8e7ee5b1ceb1d20511c35a",
      "parents": [
        "eabf51855401498637395adc892c40c49b25cc87"
      ],
      "author": {
        "name": "Gaurav Narula",
        "email": "gaurav_narula2@apple.com",
        "time": "Wed Oct 14 10:20:52 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:20:52 2026 +0800"
      },
      "message": "KAFKA-21265 Handle raw string values when describing topic configs (#23785)\n\nInternal and explicitly set topic configs are passed to\ncreateTopicConfigEntry as raw strings rather than parsed values.\nConfigDef.convertToString then throws ClassCastException for non-string\ntypes such as LIST, so DescribeConfigs fails for any topic with such a\nconfig set.\n\nThis adds the same guard that createBrokerConfigEntry already has: use\nthe value directly when it is already a String. Covered by a unit test\nin KafkaApisTest and an integration test in DescribeConfigsTest.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Federico Valeri\n \u003cfedevaleri@gmail.com\u003e, liuliu \u003cliuliugit@gmail.com\u003e"
    },
    {
      "commit": "eabf51855401498637395adc892c40c49b25cc87",
      "tree": "528c73c4a38130b440e6f064440b6148777cf9c9",
      "parents": [
        "03e66064307d921ae62a80332ae7bfca2d361c54"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Oct 14 11:19:25 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:19:25 2026 +0800"
      },
      "message": "KAFKA-21274: Remove unused javax jaxb-api and activation dependencies (#23808)\n\n`javax.activation:activation` and `javax.xml.bind:jaxb-api` are declared\nin a few places in build.gradle with the comment\n\n    Jersey dependency that was available in the JDK before Java 9\n\nThis is a stale comment as Jersey is 3.1.x uses the jakarta namespace\nand already resolves (transitively)\n`com.sun.activation:jakarta.activation` and\n`jakarta.xml.bind:jakarta.xml.bind-api`.\n\nIn Kafka 4.0 the project was migrated to Jakarta with\n[KIP-1032](https://cwiki.apache.org/confluence/spaces/KAFKA/pages/298781371/KIP-1032+Upgrade+to+Jakarta+and+JavaEE+10+in+Kafka+4.0)\nand [KAFKA-16437](https://issues.apache.org/jira/browse/KAFKA-16437) so\nthe two remaining javax dependencies should be safe to remove. Verified\nwith :trogdor:test, :connect:mirror:test (including\nthe MirrorMaker integration tests) and the :connect:runtime REST tests.\n\nNext to the benefit of handling less dependencies we can remove 3 jars\nfrom the released artifact and shave off around ~247 KB in size.\n\n    jaxb-api-2.3.1.jar\n    activation-1.1.1.jar\n    javax.activation-api-1.2.0.jar\n\nNote that in theory there can be a few connector which relied on having\njaxb and activation on the classpath from Kafka. However\n[KIP-1032](https://cwiki.apache.org/confluence/spaces/KAFKA/pages/298781371/KIP-1032+Upgrade+to+Jakarta+and+JavaEE+10+in+Kafka+4.0)\nalready calls out this scenario\n\nUsers that use the Connect framework will need to upgrade their custom\nconnectors to use the new jakarta namespace (if they rely on it) or else\nwill need to use an isolated classloader.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "03e66064307d921ae62a80332ae7bfca2d361c54",
      "tree": "ea4b874a7b8d94195fcc55770c969f428d4de3f0",
      "parents": [
        "4d4cc7c414b0a23ee08806d62a464c84eae7250b"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Tue Oct 13 19:50:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 19:50:51 2026 +0200"
      },
      "message": "MINOR: Document thread-safety of PartitionAssignor (#23795)\n\nThe `PartitionAssignor` interface does not document how it is called.\nThe group coordinator uses a single instance of each configured assignor\nfor all the groups, so `assign()` may be called concurrently from\nseveral threads.\n\nThis patch documents that implementations must be thread-safe.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "4d4cc7c414b0a23ee08806d62a464c84eae7250b",
      "tree": "ba2243e9d99213dd614c6f3df68790e091024f1d",
      "parents": [
        "43c014d5dfdeab0086932393dcc245c63554cfcc"
      ],
      "author": {
        "name": "Peter Huang",
        "email": "132851695+peterzdhuang@users.noreply.github.com",
        "time": "Tue Oct 13 10:17:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 13:17:02 2026 -0400"
      },
      "message": "KAFKA-19979: Improve Kafka Streams config files (#22831)\n\nAdds a config/streams.properties template with sections and comments,\nsimilar to the other properties files shipped with Kafka. Same idea as\nKAFKA-19574, which did this for the producer and consumer configs.\n\nBased on #21308 by @mshijin-ksolves, which stalled after review, and\npicks up @ezhou413\u0027s review comments from there. Changes from that PR:\n\n- Commented out `default.key.serde` / `default.value.serde` (they have\nno\n  default) and listed valid values instead\n- Removed the `\u003c\u003e` around `bootstrap.servers`\n- Noted that `commit.interval.ms` defaults to 100 under\n`exactly_once_v2`\n  (otherwise 30000)\n- Used `statestore.cache.max.bytes` instead of the deprecated\n  `cache.max.bytes.buffering`\n- Listed the valid `topology.optimization` values\n- Fixed the serde class name to `Serdes$StringSerde`\n\nAlso adds a test that validates the file against StreamsConfig so it\ncan\u0027t drift out of sync.\n\nReviewers: Evan Zhou \u003cezhou@confluent.io\u003e, Bill Bejeck\n \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "43c014d5dfdeab0086932393dcc245c63554cfcc",
      "tree": "797a0fe976926a2bc865e629a2f9635a3a4495fe",
      "parents": [
        "5f684cca20c4a9c096bfa7497a254eed50bc7d5d"
      ],
      "author": {
        "name": "Kuan-Po Tseng",
        "email": "brandboat@gmail.com",
        "time": "Tue Oct 13 23:50:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 16:50:22 2026 +0100"
      },
      "message": "KAFKA-19804: Improve heartbeat request manager initial HB interval (#23687)\n\nFixes a busy loop during consumer startup by initializing the heartbeat\ninterval to `request.timeout.ms` instead of 0.  The first heartbeat is\nstill sent immediately when the member transitions to the JOINING state.\nWhile that request is in flight, subsequent polls now use a positive\ntimeout until the broker returns the actual heartbeat interval.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "5f684cca20c4a9c096bfa7497a254eed50bc7d5d",
      "tree": "8506f3304be212f884a520ee01184321c8b44d0a",
      "parents": [
        "3a2eecc5c483ac7b0f8365cd891a597a9a52012b"
      ],
      "author": {
        "name": "ChickenchickenLove",
        "email": "ojt90902@naver.com",
        "time": "Tue Oct 13 23:52:51 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 16:52:51 2026 +0200"
      },
      "message": "KAFKA-21255: Return Streams assignments when all owned task sets are reported. (#23768)\n\nFixes KAFKA-21255.\n\nReturn the current assignment in StreamsGroupHeartbeat responses\nwhenever the request includes all three owned task sets(active, standby,\nand warmup) including empty sets. This allows clients to recover a\nmissed assignment after heartbeat response loss, even when processing\nthe retry does not change the coordinator’s assignment.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "3a2eecc5c483ac7b0f8365cd891a597a9a52012b",
      "tree": "46bab95394055cd84a527b743752646edea914df",
      "parents": [
        "24ce9e6f3375473f5ea730fdb6ff0f57d88da1a9"
      ],
      "author": {
        "name": "Ayoub",
        "email": "61551920+Ayoubhm07@users.noreply.github.com",
        "time": "Tue Oct 13 10:33:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 17:33:25 2026 +0800"
      },
      "message": "MINOR: Remove duplicate test dependency declarations (#23786)\n\n`build.gradle` declares three `testImplementation` dependencies twice\ninside the same `dependencies` block:\n\n| project | declaration | lines |\n|---|---|---|\n| `core` | `libs.apachedsCoreApi` | 1221 and 1230 |\n| `connect:runtime` | `project(\u0027:server-common\u0027)` | 3842 and 3847 |\n| `connect:runtime` | `project(\u0027:server\u0027)` | 3840 and 3848 |\n\nGradle resolves a configuration as a set, so the second declaration of\neach is a no-op. I verified that by\ncomparing the resolved graph before and after on both configurations of\nboth projects:\n\n```\n./gradlew :connect:runtime:dependencies --configuration testCompileClasspath\n./gradlew :connect:runtime:dependencies --configuration testRuntimeClasspath\n./gradlew :core:dependencies --configuration testCompileClasspath\n./gradlew :core:dependencies --configuration testRuntimeClasspath\n```\n\nThe four reports are byte-identical before and after, at 241, 418, 498\nand 760 lines, and the resolved module\nsets match exactly at 73, 104, 125 and 171 modules.\n\nIn each pair I removed the later declaration rather than the earlier\none, which matters more than it looks.\nDropping `core` line 1221 instead of 1230 moves `apachedsCoreApi` behind\n`libs.apacheda` in declaration\norder, and the `:core:dependencies` report then lists\n`org.apache.directory.api:api-all` before\n`org.apache.directory.server:apacheds-core-api` where it used to come\nafter. Removing the later line keeps\nevery declaration position, and therefore the classpath order, exactly\nas it is today.\n\n`:core:testClasses` and `:connect:runtime:testClasses` compile,\n`:core:check` and `:connect:runtime:check`\nwith `-x test` pass, which covers checkstyle, spotbugs and spotless for\nboth modules, and `rat` passes at the\nroot. As a spot check on the `connect:runtime` side I also ran\n`WorkerTest`: 140 tests, no failures.\n\nSame cleanup as #23745 and #22868.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "24ce9e6f3375473f5ea730fdb6ff0f57d88da1a9",
      "tree": "40f07c7bc4fb7428301f872f195967b6b862dd11",
      "parents": [
        "0661cd0bb4531c742586c2955183822b54c838ce"
      ],
      "author": {
        "name": "Gavin Wang",
        "email": "z2552wan@uwaterloo.ca",
        "time": "Tue Oct 13 05:29:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 11:29:13 2026 +0200"
      },
      "message": "KAFKA-21194 [1/N]: Place active tasks with the Sainte-Laguë method in the balanced assignor (#23755)\n\nThe balanced task assignor placed stateful active tasks round-robin over\nthe processes and then ran a fix-up loop that moves tasks between\nprocesses while a move reduces the skew of the per-member load. Every\npass of that loop tests all pairs of processes, so it costs O(P^2) per\npass even when nothing moves.\n\nThis deals the active tasks with the Sainte-Laguë divisor method\ninstead: in sorted task order, each task goes to the process with the\nsmallest (2n + 1) / c, where n is the number of tasks the process holds\nso far and c its number of members, ties going to the smaller process\nID. Stateless tasks continue the same sequence after the stateful ones,\ninstead of going to the process with the lowest active load. The\nsequence is periodic, so one period is computed up front and each task\nis then a lookup.\n\n- With equal member counts the deal is round-robin, so the placement is\n  unchanged.\n- With unequal member counts the per-member loads of any two processes\n  still differ by at most one, and no move of the old fix-up loop would\n  change the placement. Each subtopology is now spread over the\n  processes nearly in proportion to their member counts, where the loop\n  could leave most of a subtopology on one process.\n\nStandby placement is unchanged.\n\nTesting: the existing `BalancedTaskAssignorTest` cases pass, and a new\ncase checks that each subtopology is split two to one between a process\nwith two members and a process with one.\n\nBenchmark (JMH, full assignment of 1000 members, 100 subtopologies of\n100 partitions with every second one stateful, 3 forks, ms per\nassignment; before is trunk):\n\n| processes | standbys | before | after | speed-up | sticky |\n|---|---|---|---|---|---| | 1000 x 1 member | 0 | 9.06 | 1.65 | 5.5x |\n2.96 | | 1000 x 1 member | 1 | 17.09 | 10.19 | 1.7x | 4.70 | | 20 x 50\nmembers | 0 | 2.34 | 1.74 | 1.3x | 2.83 | | 20 x 50 members | 1 | 5.05 |\n4.34 | 1.2x | 5.14 | | 400 of 1-4 members | 0 | 17.29 | 1.68 | 10.3x |\n3.30 | | 400 of 1-4 members | 1 | 20.92 | 4.36 | 4.8x | 4.68 |\n\nWith standbys most of the remaining time is the unchanged standby\nplacement, which still runs the fix-up loop over all pairs of processes.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "0661cd0bb4531c742586c2955183822b54c838ce",
      "tree": "2f5c43f8a637a6c8a235f345a3019a6ad5cdc61f",
      "parents": [
        "4a8164b85466fe6cd3a2009017bd0e677f874f9e"
      ],
      "author": {
        "name": "ChickenchickenLove",
        "email": "ojt90902@naver.com",
        "time": "Tue Oct 13 18:02:24 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 11:02:24 2026 +0200"
      },
      "message": "KAFKA-21212: Fix rack ID removal on Streams static member rejoin. (#23705)\n\nFixes KAFKA-21212\n\nWhen a Streams static member restarted after removing `client.rack`, the\ncoordinator retained the previous rack ID. During static member\nreplacement, the coordinator copies the previous member’s metadata, then\napplies the incoming updates. Because `maybeUpdateRackId` treats null as\nunchanged, the joining request could not clear the copied rack ID. This\nleft stale rack information in group descriptions and custom assignor\ninputs.\n\nThis change distinguishes joining requests from regular heartbeats,\nfollowing the existing handling of `userEndpoint`. Joining requests now\napply the rack ID directly, including null to clear the previous value.\nRegular heartbeats continue to preserve the existing rack ID when the\nfield is omitted. Clearing a previously configured rack ID also allows\nthe existing metadata change detection to bump the group epoch and\ntrigger assignment recomputation.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "4a8164b85466fe6cd3a2009017bd0e677f874f9e",
      "tree": "a2401e9478c1a013ebc366b12f3f49ee2f69549b",
      "parents": [
        "394688481c7f8be008cf745c8d39f8d272e5c5ec"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Tue Oct 13 10:17:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 10:17:24 2026 +0200"
      },
      "message": "KAFKA-21111 [1/N]: Tell the refiner which members may be given a warm-up task (#23761)\n\nThis is the first change of a series that makes the warm-up task refiner\n(KAFKA-20665) compatible with clients that speak version 0 of the\nstreams group heartbeat (4.2 and 4.3), and with a coordinator failover\nduring which the coordinator does not know the version of any member. A\nwarm-up task is only useful if the coordinator can observe how far its\nholder has restored it, which a member reports through the task offsets\nof a version 1 heartbeat. A version 0 member never does, so it could\nnever be promoted from warm-up to active.\n\nThis change only provides the information, and nothing uses it yet. The\ncoordinator records the version of every member\u0027s last heartbeat as\ntransient state of the streams group, with the same lifecycle as the\nreported task offsets: written in the heartbeat path, dropped when the\nmember is removed, and not known again after a coordinator failover\nuntil the member heartbeats. It is deliberately not persisted, so that\nit can never outlive the client that sent it. The refiner is handed an\nimmutable view of it, and decides itself which versions it can warm up.\nA member that is missing from the map, because the coordinator has not\nheard from the member since it loaded the group, has an unknown version.\nThe refiner ignores the new input for now; the following changes of this\nseries use it.\n\nSee https://issues.apache.org/jira/browse/KAFKA-21111. The tests cover\nthe group state and the versions reaching the refiner through the\nheartbeat path.\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "394688481c7f8be008cf745c8d39f8d272e5c5ec",
      "tree": "4f6e247c1e54cbf56621f22afe095d7a609a0be0",
      "parents": [
        "e4e8654b37d9e1ba6231852a4e192ed101561152"
      ],
      "author": {
        "name": "David Jacot",
        "email": "dajac@apache.org",
        "time": "Tue Oct 13 09:59:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:59:40 2026 +0200"
      },
      "message": "KAFKA-21214: [2/N] Add the indexed group of the uniform2 assignor (#23732)\n\nThe uniform assignor balances the total number of partitions per member\nbut not the partitions of each topic: with homogeneous subscriptions, a\nmember can get all the partitions of a topic while the others get none\nof them. uniform2, the next version of the uniform assignor, spreads\nevery topic over its subscribers. It reads the group, decides how many\npartitions of every topic each member gets, its quotas, in three steps,\nand then places the partitions. This stack adds it one step at a time,\nand the assignor itself last.\n\nThis patch adds the indexed group that every step reads:\n- `IndexedGroup` numbers the members in member id order and the topics\n  in topic id order, so that the assignment is deterministic. It drops\n  the topics that do not exist, and groups the members with the same\n  subscription into cohorts.\n- `CurrentAssignment` reads the owner of every partition. What the\n  members hold of topics they do not subscribe to, or which no longer\n  exist, is stale and dropped.\n- `GroupSpecFixture` and `TopicsFixture` build the inputs of the tests.\n\nReviewers: Sean Quah \u003csquah@confluent.io\u003e"
    },
    {
      "commit": "e4e8654b37d9e1ba6231852a4e192ed101561152",
      "tree": "fad0472e309380c592c4df741d46bfa45403c43a",
      "parents": [
        "65a04de1067d8f7f51d85bf6a9d867f3e6749c81"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Tue Oct 13 09:18:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 09:18:54 2026 +0800"
      },
      "message": "KAFKA-21264: Javadoc output language depends on the build machine\u0027s system locale (#23789)\n\nJavadoc currently inherits the JVM default locale, which can result in\ngenerated HTML using a different `lang` attribute depending on the build\nenvironment. Set the Javadoc locale explicitly to English so that\ngenerated pages consistently use `\u003chtml lang\u003d\"en\"\u003e`.\n\nTested with `./gradlew aggregatedJavadoc --no-daemon --console\u003dplain`;\nthe build completed successfully and the generated Javadoc pages use\n`\u003chtml lang\u003d\"en\"\u003e`.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "65a04de1067d8f7f51d85bf6a9d867f3e6749c81",
      "tree": "7273c7abfab947273857b2eb874e4cae7571b9f1",
      "parents": [
        "740c90e8ab4772785508d09321a009f0416cf70a"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Tue Oct 13 00:17:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 06:17:15 2026 +0800"
      },
      "message": "MINOR: Remove unused jmhCoreBenchmarks and spotbugs library entries  (#23793)\n\nThe two declarations are not referenced anywhere.\n\nPlease note that only the lib entries can be removed,\n`versions.spotbugs` and `libs.jmhCore` are still used other places.\n\nNo LICENSE-binary change, verified with\n`committer-tools/verify_license.py `\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "740c90e8ab4772785508d09321a009f0416cf70a",
      "tree": "1ef5960ec1bae810692c9331e8042fcd2785c0fc",
      "parents": [
        "c7cc6d439515d4fb10e91477afc027eef67e182b"
      ],
      "author": {
        "name": "majialong",
        "email": "majialoong@gmail.com",
        "time": "Tue Oct 13 06:04:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 06:04:07 2026 +0800"
      },
      "message": "KAFKA-21019 Add consumer and share group protocol test cases to Docker sanity tests (#23427)\n\nAdd Docker sanity test flows for the consumer group protocol (KIP-848)\nand share groups (KIP-932). The share group flow sets\nshare.auto.offset.reset\u003dearliest before producing, since the default is\nlatest.\n\nAlso fix broker_metrics_flow, which asserted metrics_before_message\ntwice instead of metrics_after_message.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "c7cc6d439515d4fb10e91477afc027eef67e182b",
      "tree": "1a51f909809ee2957cb29b1538559a2a5c1fff98",
      "parents": [
        "91dcfac9321ef89fcbc94cf73cd4541670692f28"
      ],
      "author": {
        "name": "Christo Lolov",
        "email": "lolovc@amazon.com",
        "time": "Mon Oct 12 21:24:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 04:24:33 2026 +0800"
      },
      "message": "KAFKA-15853: [3/N] Move DynamicReplicationConfig to Java (#23661)\n\n`DynamicReplicationConfig` is a no-op, so this removes it and moves its\nconfig set into `DynamicBrokerConfig#DYNAMIC_REPLICATION_CONFIGS`.\n`follower.fetch.last.tiered.offset.enable` stays in\n`ALL_DYNAMIC_CONFIGS`, so dynamic update behavior is unchanged.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ming-Yen Chung\n \u003cmingyen066@gmail.com\u003e"
    },
    {
      "commit": "91dcfac9321ef89fcbc94cf73cd4541670692f28",
      "tree": "bf0f59b0046bcc0280843c6b084426a34c55b73e",
      "parents": [
        "a2141d8c00a3f3370593b8f49df824c368938bdd"
      ],
      "author": {
        "name": "Russole Chen",
        "email": "54737788+Russole@users.noreply.github.com",
        "time": "Tue Oct 13 04:05:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 04:05:32 2026 +0800"
      },
      "message": "KAFKA-21235 The docs of sleepSecsOpt should state it is in seconds (#23787)\n\nUpdate `--sleep` option documentation to correctly state that the value\nis in seconds.\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "a2141d8c00a3f3370593b8f49df824c368938bdd",
      "tree": "f8bff987cab39797b2b0194a30cc475421878a07",
      "parents": [
        "bbfcdcbf87a3baa10e847241a0b1dd4eb4c2906c"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Mon Oct 12 12:40:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 11:40:53 2026 +0100"
      },
      "message": "KAFKA-20278 : Refactor - Remaining HeadersStoreUpgradeIntegrationTest cleanups, [3/3] (#23738)\n\nResolves\n[KAFKA-20278](https://issues.apache.org/jira/browse/KAFKA-20278) (final\npart, continues #21754 and #22901)\n\nAddress the below from the jira.\n\n4 Repeated error handling\n5 Test parameterization\n6 Downgrade test similarity\n7 Magic numbers and constants\n8 Processor classes duplication\n10 Setup/teardown pattern\n\nReviewers: Alieh Saeedi \u003casaeedi@confluent.io\u003e, TengYao Chi\n\u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "bbfcdcbf87a3baa10e847241a0b1dd4eb4c2906c",
      "tree": "c86ba9920cd35aea7669ac8a7347e9fa49a07b19",
      "parents": [
        "f3295655931e6d2b255f20886ccb697a93a6bbe9"
      ],
      "author": {
        "name": "Aditya Kousik",
        "email": "akousik@apple.com",
        "time": "Mon Oct 12 01:02:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 16:02:04 2026 +0800"
      },
      "message": "KAFKA-20684 [4/N]: Migrate Connect to RebalanceListener (#23105)\n\nWorkerSinkTask\u0027s HandleRebalance becomes a RebalanceListener, registered\nvia setRebalanceListener. Tests capture the listener from\nsetRebalanceListener rather than from subscribe. Callback bodies keep\nusing the enclosing consumer field.\n\nReviewers: Murali Basani \u003cmuralidhar.basani@aiven.io\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "f3295655931e6d2b255f20886ccb697a93a6bbe9",
      "tree": "6135ad1801281048f68300da54a74b228ca73317",
      "parents": [
        "cd69d2ebd04d8f15e42b89666711802a0fc0620a"
      ],
      "author": {
        "name": "Federico Valeri",
        "email": "fedevaleri@gmail.com",
        "time": "Mon Oct 12 05:21:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 12 12:21:36 2026 +0900"
      },
      "message": "KAFKA-21222: Add broker-level configs for Cluster Mirroring (#23729)\n\nThis is the first PR to implement the Cluster Mirroring feature\n(KIP-1279). It introduces the broker-level configuration properties and\nquota infrastructure needed to support cross-cluster replication.\n\nAll new broker-level properties are defined as internal to avoid\nsurfacing them to users before the early access release.\n\nReviewers: Luke Chen \u003cshowuon@gmail.com\u003e, Ken Huang \u003cs7133700@gmail.com\u003e\n\n---------\n\nSigned-off-by: Federico Valeri \u003cfedevaleri@gmail.com\u003e"
    },
    {
      "commit": "cd69d2ebd04d8f15e42b89666711802a0fc0620a",
      "tree": "e764aecd5735fdf0500b42530b247557c94b55da",
      "parents": [
        "a0ad4573bc57d6bc7641fb84484934114632fa26"
      ],
      "author": {
        "name": "rishi-rana",
        "email": "rishi-rana@hotmail.com",
        "time": "Sun Oct 11 06:11:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 21:11:58 2026 +0800"
      },
      "message": "KAFKA-14333 Document PolicyViolationException in Admin#deleteRecords javadoc (#23716)\n\nAdmin#deleteRecords can fail with PolicyViolationException when the\ntopic\u0027s  cleanup.policy does not permit record deletion (e.g. compact\nwithout delete).  This PR documents it in the javadoc, following the\nexisting convention in  Admin.java.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e\n\nCo-authored-by: Claude Sonnet 5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "a0ad4573bc57d6bc7641fb84484934114632fa26",
      "tree": "cf794f8a043f12b186efff45bbdfcbf826244ddb",
      "parents": [
        "b0a2ca395ad8109f7cbfa804e81fcfd4fc192c0d"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Sun Oct 11 14:52:49 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 20:52:49 2026 +0800"
      },
      "message": "MINOR: Add SASL and SSL section in docker docs (#23751)\n\nThe native image section of the Docker getting-started page did not\nmention SASL or SSL.\n\nAdded a short “SASL and SSL” note to the native image section. It states\nthat the native image supports SASL since 4.4.0 (KAFKA-19584) and links\nto the Docker Compose examples in docker/examples/README.md, which work\nwith both the JVM and native images.\n\nAlso updated the image tags from 4.3.0 to 4.4.0.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "b0a2ca395ad8109f7cbfa804e81fcfd4fc192c0d",
      "tree": "2cf69454d4a6e6a7caebc442dfaa98e2608d9887",
      "parents": [
        "32397d97aa50025ee47082b60bbf66694c0e9a16"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Sun Oct 11 11:13:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 17:13:58 2026 +0800"
      },
      "message": "KAFKA-21143 Server-only OAUTHBEARER listener with private JWKS CA triggers token login and fails broker startup (#23557)\n\nA broker that only validates OAUTHBEARER tokens relies on the tokenless\nlogin path (KAFKA-7462), which OAuthBearerUnsecuredLoginCallbackHandler\nonly took when the JAAS module options were empty. Since the JAAS\noptions also carry the ssl.* settings for the JWKS endpoint (KIP-768),\nconfiguring JWKS TLS trust made the handler try to mint an unsecured\ntoken without a sub claim and failed broker startup.\n\nThis patch makes the handler create an unsecured token only when an\nunsecuredLogin* option is present. Otherwise it falls through to the\ntokenless login and logs the module option keys at INFO so a mistyped\noption is visible. OAuthBearerLoginModule now chains the callback\nhandler’s exception into the LoginException, and its javadoc notes that\nthe unsecured handler is for testing purposes only.\n\nThis is a workaround for the default path. KAFKA-21221 tracks a proper\ntokenless login handler.\n\nReviewers: Chia-Ping Tsai\n [chia7712@gmail.com](mailto:chia7712@gmail.com), Viktor Somogyi-Vass\n [viktorsomogyi@gmail.com](mailto:viktorsomogyi@gmail.com)"
    },
    {
      "commit": "32397d97aa50025ee47082b60bbf66694c0e9a16",
      "tree": "5519466abfabf357e7694581418167de990c3dc7",
      "parents": [
        "2e4d25ee13347c8183c926c4933e61e77da09083"
      ],
      "author": {
        "name": "Lucy Liu",
        "email": "lucliu@confluent.io",
        "time": "Sun Oct 11 03:45:05 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 16:45:05 2026 +0800"
      },
      "message": "KAFKA-21110 Document that min.insync.replicas is bounded by the replica count (#23529)\n\nSince AK 3.7.0 (#14594), the broker uses min(min.insync.replicas,\nreplica count) as the\neffective min ISR for both acks\u003dall produce requests and high watermark\nadvancement,\nregardless of whether ELR is enabled. The docs still describe the raw\nconfigured value\nas the threshold. This PR updates them to state the effective bound:\n\n- TopicConfig.java: min.insync.replicas doc, including the ELR note\n- docs/design/design.md: consumer-visibility condition\n- docs/operations/eligible-leader-replicas.md: HW advancement\ndescription\n- docs/operations/monitoring.md: UnderMinIsrPartitionCount /\nAtMinIsrPartitionCount\n- NotEnoughReplicasException / NotEnoughReplicasAfterAppendException\njavadocs\n\nReviewers: rishi-rana rishi-rana@hotmail.com, Chia-Ping Tsai\nchia7712@gmail.com"
    },
    {
      "commit": "2e4d25ee13347c8183c926c4933e61e77da09083",
      "tree": "0ae62816d17e1a296436d2fde885dda9ad763e51",
      "parents": [
        "3de09ca09784900318b56091d46d3803c4d5adc9"
      ],
      "author": {
        "name": "Maros Orsak",
        "email": "maros.orsak159@gmail.com",
        "time": "Sun Oct 11 10:24:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 11 16:24:23 2026 +0800"
      },
      "message": "MINOR: Allow overriding the base image of the JVM Docker image (#23560)\n\nMakes the jvm image\u0027s base image overridable (`--base-image`, default\nunchanged), so it can be built on another JDK version or an own Alpine\nJRE image without forking the Dockerfile. The build fails fast with a\nclear message when the base image has no `java` on PATH.\n\nChecked by building on the default base (JDK 25) and on\ntemurin:21-jre-alpine, and that a base without a JRE (alpine:3) fails\nat the check. The generated Docker Official Image source differs from\ntrunk only by that check line.\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, YANG-SYUAN CHOU\n\u003cdino2895un@gmail.com\u003e, Federico Valeri \u003cfedevaleri@gmail.com\u003e, Luke\nChen \u003cshowuon@gmail.com\u003e, liuliu \u003cliuliugit@gmail.com\u003e"
    },
    {
      "commit": "3de09ca09784900318b56091d46d3803c4d5adc9",
      "tree": "a5f345764d430ed4b5676e99e855b1b49d9c816b",
      "parents": [
        "3b9335d2081fd116699847dc9b66294f9546bde6"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Sat Oct 10 00:04:31 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 00:04:31 2026 +0100"
      },
      "message": "MINOR: Add PR description guidance to AGENTS.md (#23739)\n\nAdd a coding convention to AGENTS.md stating that the PR description\nbecomes the squash-merged commit message. Agents tend to write PR\ndescriptions aimed at reviewers, listing the tests and checks they ran.\nOnce merged, these notes stay in the commit history, where they are\nnoise to future readers.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Ken Huang \u003cs7133700@gmail.com\u003e, Chia-Ping Tsai\n\u003cchia7712@gmail.com\u003e, TengYao Chi \u003cfrankvicky@apache.org\u003e, Eric Chang\n\u003ce850506@gmail.com\u003e, Ming-Yen Chung \u003cmingyen066@gmail.com\u003e"
    },
    {
      "commit": "3b9335d2081fd116699847dc9b66294f9546bde6",
      "tree": "aaebd5d07332f7bd9a713f2fd6316f6552c52325",
      "parents": [
        "b37898c76896c0e7f018a6b3bee057c33bcb5dc6"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Fri Oct 09 17:39:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 17:39:07 2026 +0200"
      },
      "message": "MINOR: Add warm-up tests for coordinator failover, owner departure and multi-threaded members (#23675)\n\nThis adds three warm-up task lifecycle tests for situations that only\narise with real clients and brokers, using the harness from #23620. The\nfirst fails the group coordinator over while a warm-up task is in\nflight. The intermediate assignment and the reported offsets are held in\nmemory only, so the new coordinator derives the intermediate assignment\nagain from the persisted assignments, and the warm-up task has to\nsurvive that without being closed and restored again, and be promoted\nwith nothing left to restore. The second has the active owner leave\nwhile the warm-up task is still behind, so the task is handed to the\nwarm-up task\u0027s member right away, and the active task has to continue\nrestoring from exactly where the warm-up task stopped rather than from\nthe start. The third runs a member with two stream threads that each\nwarm up and take over a task, and then removes one thread, after which\nthe remaining thread restores the moved task from scratch, which is the\ncurrent behaviour for in-memory stores until KAFKA-21090.\n\nThe multi-threaded test tracks when each task\u0027s store is opened and\nclosed and on which thread, and checks that a process never holds a task\non two threads at once. The published thread metadata cannot be used for\nthis, since a thread only refreshes it when it starts running again, so\na shutting-down thread keeps listing tasks it has already closed, and a\nthread that finished restoring a task since it last started running does\nnot list it yet.\n\nThe cluster runs three brokers with replicated internal topics so that\nthe coordinator can fail over. The failover test picks an application ID\nwhose coordinator is not on the broker that also runs the controller, so\nthat restarting it does not take the metadata quorum down.\nEmbeddedKafkaCluster gains a way to restart a broker and to tell which\nnodes run the controller.\n\nThe tests passed repeated local runs, and the owner-leaves test fails\nwhen the reconciler routes a warm-up promotion through revocation\ninstead of promoting the warm-up task in place.\n\nReviewers: Bill Bejeck \u003cbbejeck@apache.org\u003e"
    },
    {
      "commit": "b37898c76896c0e7f018a6b3bee057c33bcb5dc6",
      "tree": "32aef66f62ff535112bb64022db306a18ec1570e",
      "parents": [
        "eb8e9112d85f4b67949ed25812cc314bf378bb99"
      ],
      "author": {
        "name": "Pranav Siby",
        "email": "psiby@confluent.io",
        "time": "Fri Oct 09 20:25:40 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 16:55:40 2026 +0200"
      },
      "message": "KAFKA-15976: Allow specifying initial offsets while creating connectors - KIP-995 (#23268)\n\nImplements KIP-995: https://cwiki.apache.org/confluence/display/KAFKA/KIP-995%3A+Allow+users+to+specify+initial+offsets+while+creating+connectors\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, ashwinpankaj \u003capankaj@confluent.io\u003e\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "eb8e9112d85f4b67949ed25812cc314bf378bb99",
      "tree": "1b4324e20009d055ca6c59667c2bc52b0bb5a038",
      "parents": [
        "5a52d8d6d9004bb58e02b3e3958cfa7a06cc07b3"
      ],
      "author": {
        "name": "Murali Basani",
        "email": "muralidhar.basani@aiven.io",
        "time": "Fri Oct 09 16:14:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 22:14:15 2026 +0800"
      },
      "message": "KAFKA-21158: Document retention impact of future timestamps allowed by message.timestamp.after.max.ms (#23596)\n\nRef : https://issues.apache.org/jira/browse/KAFKA-21158\n\nFollow-up to KAFKA-20609 (#22873), based on review feedback:\nhttps://github.com/apache/kafka/pull/22873#discussion_r4097159048\n\nTime-based retention is measured from a segment\u0027s largest record\ntimestamp, so a segment holding a record with a future timestamp can\u0027t\nbe deleted by time until that timestamp plus the retention time has\npassed.\n\nThis applies whether or not tiered storage is used.   Using\n`message.timestamp.after.max.ms` limits how far in the future a\ntimestamp can be.\n\nChanges :\n- Document this in the `message.timestamp.after.max.ms` and\n`log.message.timestamp.after.max.ms` config docs.\n- Log a WARN when the effective value is above the default (1h). Nothing\nis rejected and retention behavior is unchanged.\n\nWarnings are fired in 4 places.\n- Topic created with its own message.timestamp.after.max.ms in broker\n- Topic config altered in broker\n- Broker startup in LogManager\n- Broker config changed in runtime in\nLogManager.reconfigureDefaultLogConfig\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Ken Huang\n\u003cs7133700@gmail.com\u003e"
    },
    {
      "commit": "5a52d8d6d9004bb58e02b3e3958cfa7a06cc07b3",
      "tree": "0e0e5a896f3b90a69ce7ffa6d608a86ddf379287",
      "parents": [
        "dca38163e3732755f8d916e17ee4bbaeb6cba9f1"
      ],
      "author": {
        "name": "Alieh Saeedi",
        "email": "107070585+aliehsaeedii@users.noreply.github.com",
        "time": "Fri Oct 09 14:58:57 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 13:58:57 2026 +0100"
      },
      "message": "MINOR: Clean up Streams header adapter tests after KAFKA-20224 (#23727)\n\nFollow-up to #21830 addressing the remaining review comments:\n\n- `TimestampedToHeadersStoreAdapterTest`: use the 11-byte\n`TIMESTAMPED_VALUE` in `shouldHandleKeyQuery` and\n`shouldCollectExecutionInfoForKeyQuery` instead of `\"test-value\"`.\n- `TimestampedToHeadersWindowStoreAdapterTest`: give `TIMESTAMPED_VALUE`\na real 8-byte timestamp prefix.\n- `MappingKeyValueIteratorAdapterTest`: drop\n`timestampedToHeadersShouldConvertValueForSessionKeys`, which duplicates\n`timestampedToHeadersShouldConvertValueOnNext`.\n\nTest-only change.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e\n\nCo-authored-by: Claude Sonnet 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "dca38163e3732755f8d916e17ee4bbaeb6cba9f1",
      "tree": "4d199310c5795f0e5e00fe1349a948b3630e7ecb",
      "parents": [
        "4151a8184774464ae49f029baa9dad51c9c780d5"
      ],
      "author": {
        "name": "KhyatiVaghamshi",
        "email": "khyati220@gmail.com",
        "time": "Fri Oct 09 02:41:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 11:41:33 2026 +0200"
      },
      "message": "KAFKA-21119: Replace temp file handler with JUnit 5 @TempDir in generator, tools, and test-common (#23381)\n\n\nReviewers: ashwinpankaj \u003capankaj@confluent.io\u003e, Mickael Maison \u003cmickael.maison@gmail.com\u003e, Chia-Ping Tsai \u003cchia7712@gmail.com\u003e\nCo-authored-by: khyativ \u003ckvaghamshi@salesforce.com\u003e"
    },
    {
      "commit": "4151a8184774464ae49f029baa9dad51c9c780d5",
      "tree": "fb5c7ac29acc31a75d8f64cd3b51735ee1c4494b",
      "parents": [
        "3c1b3f2db34b2191c00bd97d3de92c4945668ab6"
      ],
      "author": {
        "name": "Gavin Wang",
        "email": "z2552wan@uwaterloo.ca",
        "time": "Fri Oct 09 04:45:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 10:45:39 2026 +0200"
      },
      "message": "KAFKA-21026: Add JMH benchmark for the streams assignment refiner (#23616)\n\nThe streams group coordinator refines the task assignor\u0027s target\nassignment into an intermediate assignment that holds stateful task\nmigrations back behind warm-up tasks (KAFKA-20665). The refinement runs\non the heartbeat path: for a stable group, `streamsGroupHeartbeat`\nderives it for the whole group on every heartbeat, so its cost scales\nwith each group\u0027s heartbeat rate. This adds a JMH benchmark for it.\n\n`AssignmentRefinerBenchmark` measures one `AssignmentRefiner#refine`\ncall followed by the `preservesActiveTaskCount` check the coordinator\napplies to the result, for `NoOpAssignmentRefiner` (the broker default)\nand `AssignmentRefinerImpl`. It calls the public `refine`, so it needs\nno change as the refiner evolves. The group is set up as a refinement\nstep finds it: the target assignment comes from the sticky assignor, a\nfraction of the stateful active tasks still runs on a member of another\nprocess, the warm-up budget is already spent on migrations under way,\nand the members report restore progress according to a lag picture (all\ncaught up, all lagging, not reported, mixed, or destinations that are\nthemselves restoring an active task). The parameters cover member count,\nmembers per process, subtopology and partition count, standby replicas,\nthe warm-up budget, the migrating fraction and the lag picture. The\ndefault grid is trimmed to values that bracket the behaviour; the rest\nare reachable with `-p`.\n\n`StreamsAssignorBenchmarkUtils` gains the two fixture builders this\nneeds: `divergeAssignment`, which derives the members\u0027 current\nassignment from the target, and `createMemberTaskOffsets`, which builds\nthe offsets and end offsets the members report in their heartbeats.\n\nTesting: `./gradlew :jmh-benchmarks:compileJava checkstyleMain\nspotbugsMain` passes. A probe over the fixtures confirmed that no\nprocess ever holds two copies of a task, that the active task count is\npreserved, and that each lag picture drives a different refiner decision\n(grant, keep, plant, park). A run against trunk with the refiner wired\nin (288 refiner rows, 5 warm-up and 5 measured iterations of 1 s) shows\nthat a stable group with nothing to move is the dominant cost: about\n4.2-4.8 ms and 5 MB per call at 5,000 stateful tasks with one standby,\n58-111 times the no-op refiner, largely independent of member count.\nMoving half of the stateful tasks adds 50-100% on top, and the warm-up\nbudget (2 vs. 100) makes no measurable difference.\n\nReviewers: Lucas Brutschy \u003clbrutschy@confluent.io\u003e"
    },
    {
      "commit": "3c1b3f2db34b2191c00bd97d3de92c4945668ab6",
      "tree": "6711512d2c008e5afc2b4afd0f9f67a703637c4b",
      "parents": [
        "9dfd65db3d5bb3297f29a4a5dea4207658511cd9"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Fri Oct 09 09:21:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 09:21:15 2026 +0200"
      },
      "message": "MINOR: Add broker integration tests for classic JoinGroup topology cleanup (#23747)\n\nConverting an empty streams group to a classic group requires the broker\nto delete the group\u0027s stored topology description from the plugin first.\nThis path was only unit-tested against mocks; no test sent a real\nclassic JoinGroupRequest to a running broker, and the failed-join and\nperiodic-cleanup halves were never chained together.\n\nThis adds three single-broker integration tests to\nStreamsGroupTopologyDescriptionRequestTest. The first joins a classic\nmember to an empty streams group with a stored topology and checks that\nthe broker calls plugin.deleteTopology and converts the group. The\nsecond makes deleteTopology fail and checks that the join is rejected\nwith the retriable REBALANCE_IN_PROGRESS while the group stays a streams\ngroup. The third chains the failure with the periodic cleanup cycle:\nafter the plugin recovers, the cycle clears the stored topology without\nany client involvement, and a later classic join converts the group.\n\nFailingTopologyDescriptionPlugin gains a per-group counter of\ndeleteTopology invocations, so the tests can assert that the broker\nactually reached the plugin.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e"
    },
    {
      "commit": "9dfd65db3d5bb3297f29a4a5dea4207658511cd9",
      "tree": "049acb87bba9b4ae28e242053847482da1b49647",
      "parents": [
        "c553733515e35e636a1a5b3e1d45f773a1d64f02"
      ],
      "author": {
        "name": "Ritika Reddy",
        "email": "98577846+rreddy-22@users.noreply.github.com",
        "time": "Thu Oct 08 13:44:55 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 13:44:55 2026 -0700"
      },
      "message": "KAFKA-21181: Return NOT_COORDINATOR from a stale transaction coordinator cache (#23630)\n\nAfter a broker loses leadership of a __transaction_state partition, its\nTransactionStateManager keeps the partition\u0027s cache entry until\nTransactionCoordinator.onResignation runs, which happens after the\nreplica has already become a follower. Answers decided purely from that\ncache are never fenced, so a TV2 EndTxn(COMMIT) that lands in this\nwindow can get a fatal INVALID_TXN_STATE instead of NOT_COORDINATOR.\n\nOnly use a cache entry while the local replica still leads the partition\nat the entry\u0027s coordinator epoch, and return NOT_COORDINATOR otherwise\nso the client rediscovers the new coordinato\n\nReviewers: Justine Olshan \u003cjolshan@confluent.io\u003e, Artem Livshits\n \u003calivshits@confluent.io\u003e\n\n---------\n\nCo-authored-by: Claude Opus 5.5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "c553733515e35e636a1a5b3e1d45f773a1d64f02",
      "tree": "1ae1d13f9ea9dd5e28e555d7d161d3bb73cb1c69",
      "parents": [
        "5e318af10c044cfd202883798451020f08cd17bf"
      ],
      "author": {
        "name": "Lucas Brutschy",
        "email": "lbrutschy@confluent.io",
        "time": "Thu Oct 08 12:00:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 12:00:45 2026 +0200"
      },
      "message": "MINOR: Add broker integration tests for topology-description plugin failure surfacing (#23670)\n\nStreamsGroupTopologyDescriptionRequestTest only ever exercises\nInMemoryTopologyDescriptionPlugin, which never fails, so the permanent\nand transient failure classification for the\nStreamsGroupTopologyDescriptionUpdate RPC, and the DeleteGroups\nplugin-failure path, were proven only against mocks in\nGroupCoordinatorServiceTopologyDescriptionTest, never against a real\nbroker/RPC round trip.\n\nThis adds FailingTopologyDescriptionPlugin, a configurable test double\nwhose setTopology and deleteTopology calls can be told to fail on\ndemand, and three new cluster tests built on it. A permanent setTopology\nfailure surfaces STREAMS_TOPOLOGY_DESCRIPTION_UPDATE_FAILED with the\nplugin\u0027s message and stops the broker from re-soliciting a push at that\nepoch. A transient failure returns the same error code but arms the\nheartbeat back-off instead of ratcheting the epoch. A DeleteGroups\nplugin failure returns GROUP_DELETION_FAILED without tombstoning the\ngroup, and a retried delete succeeds once the plugin recovers.\n\nReviewers: TengYao Chi \u003cfrankvicky@apache.org\u003e, Andy Huang\n \u003c165141963+andyhuangdev@users.noreply.github.com\u003e"
    },
    {
      "commit": "5e318af10c044cfd202883798451020f08cd17bf",
      "tree": "d8f02ec76e72a653f94230261fc0c742624f5ae7",
      "parents": [
        "0e3533b0e0655bde57c62c4ac6ce8e06c47485bb"
      ],
      "author": {
        "name": "KhyatiVaghamshi",
        "email": "khyati220@gmail.com",
        "time": "Thu Oct 08 00:43:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 09:43:04 2026 +0200"
      },
      "message": "KAFKA-21118: Replace temp file handler with JUnit 5 @TempDir in connect tests (#23280)\n\n\nReviewers: Uros (github:uros-b), Mickael Maison \u003cmickael.maison@gmail.com\u003e\nCo-authored-by: kvaghamshi \u003ckvaghamshi@salesforce.com\u003e"
    },
    {
      "commit": "0e3533b0e0655bde57c62c4ac6ce8e06c47485bb",
      "tree": "44a0d1dbce9c4c2585351b1bbae55f2074c85aac",
      "parents": [
        "bf8a0273f812cbd9913fe4928bab8947c2e79cc1"
      ],
      "author": {
        "name": "Edmond Abraham",
        "email": "54119952+gitedmond@users.noreply.github.com",
        "time": "Thu Oct 08 03:00:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 15:00:33 2026 +0800"
      },
      "message": "MINOR: Remove redundant tools test-common-util dependency (#23745)\n\nRemove the explicit testImplementation dependency on\n:test-common:test-common-util from :tools.\n\nThe only compile-time use was the @Flaky annotation, which #23531\nremoved. The module is still on the test runtime classpath via\nruntimeTestLibs, so the JUnit filters keep working.\n\nFollow-up to the cleanup discussed in #23466.\n\nGenerated-by: OpenAI Codex (GPT-6)\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "bf8a0273f812cbd9913fe4928bab8947c2e79cc1",
      "tree": "e28e1b6f06e57c37f17a9e7841b3553e09c4de93",
      "parents": [
        "ad038ef39c5ecdf39d805919a593264bae238846"
      ],
      "author": {
        "name": "Sean Quah",
        "email": "squah@confluent.io",
        "time": "Thu Oct 08 07:51:11 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 14:51:11 2026 +0800"
      },
      "message": "MINOR: Fix BackgroundConsumerSet.start() returning before all consumers have joined (#23702)\n\nBackgroundConsumerSet.start() waits on a latch sized to the number of\nconsumers, but each consumer thread counted the latch down on every poll\nwith a non-empty assignment. One consumer could release the latch before\nthe others had joined. Count down once per consumer instead.\n\nAlso signal readiness from the first onPartitionsAssigned callback\ninstead of polling for a non-empty assignment, so that a consumer\nwithout partitions does not block start(). testDescribeGroups asserts on\nmember assignments, so it now waits for the group to become STABLE after\nstart() returns.\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "ad038ef39c5ecdf39d805919a593264bae238846",
      "tree": "b569aa3900e10df59c29379f6f85afce2f437f8b",
      "parents": [
        "b234a3a667055d867319c99fd8eca72200c780a8"
      ],
      "author": {
        "name": "Chang-Chi Hsu",
        "email": "jim0987795064@gmail.com",
        "time": "Thu Oct 08 14:04:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 14:04:04 2026 +0800"
      },
      "message": "KAFKA-21038 Replace LogManagerBuilder with direct LogManager constructor calls (#23385)\n\nReplace `LogManagerBuilder` with direct `LogManager` constructor calls\nin the jmh benchmarks, and remove `LogManagerBuilder` from the core\nmodule. The builder was only used by five benchmarks, and the\nconstructor is good enough for them, so there is no need to keep the\nbuilder or move it to the jmh module.\n\nAll five benchmarks still run after the change:\n\n```\nBenchmark                                       (numPartitions)\n(numTopics)   Mode  Cnt   Score   Error   Units\nCheckpointBench.measureCheckpointHighWatermarks                3\n100  thrpt       35.205          ops/ms\nCheckpointBench.measureCheckpointHighWatermarks                3\n1000  thrpt        2.733          ops/ms\nCheckpointBench.measureCheckpointHighWatermarks                3\n2000  thrpt        1.222          ops/ms\nCheckpointBench.measureCheckpointLogStartOffsets               3\n100  thrpt       49.275          ops/ms\nCheckpointBench.measureCheckpointLogStartOffsets               3\n1000  thrpt        3.848          ops/ms\nCheckpointBench.measureCheckpointLogStartOffsets               3\n2000  thrpt        1.889          ops/ms\n```\n\n```\nBenchmark                           (numPartitions)  (useTopicIds)  Mode\nCnt  Score   Error  Units\nPartitionCreationBench.makeFollower              20          false  avgt\n1.469          ms/op\nPartitionCreationBench.makeFollower              20           true  avgt\n1.573          ms/op\n```\n\n```\nBenchmark                                  (partitionCount)  Mode  Cnt\nScore   Error  Units\nReplicaFetcherThreadBenchmark.testFetcher               100  avgt\n3030.759          ns/op\nReplicaFetcherThreadBenchmark.testFetcher               500  avgt\n14744.964          ns/op\nReplicaFetcherThreadBenchmark.testFetcher              1000  avgt\n32157.757          ns/op\nReplicaFetcherThreadBenchmark.testFetcher              5000  avgt\n248103.628          ns/op\n```\n\n```\nBenchmark                                       Mode  Cnt    Score\nError  Units\nPartitionMakeFollowerBenchmark.testMakeFollower  avgt       834.300\nns/op\n```\n\n```\nBenchmark                                                          Mode\nCnt     Score   Error  Units\nUpdateFollowerFetchStateBenchmark.updateFollowerFetchStateBench\navgt       4628.136          ns/op\nUpdateFollowerFetchStateBenchmark.updateFollowerFetchStateBenchNoChange\navgt       4558.835          ns/op\n```\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e, Mickael Maison\n \u003cmickael.maison@gmail.com\u003e"
    },
    {
      "commit": "b234a3a667055d867319c99fd8eca72200c780a8",
      "tree": "2fee28f036482de8bc370ee38907a6c1d2d2fa60",
      "parents": [
        "2142c21a5ba651fde909acdb1c049029a89355ec"
      ],
      "author": {
        "name": "Ken Huang",
        "email": "s7133700@gmail.com",
        "time": "Thu Oct 08 02:35:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 02:35:36 2026 +0800"
      },
      "message": "KAFKA-18477 Remove usage of OffsetForLeaderEpochRequest in AbstractFetcherThread (#23318)\n\nSince the 4.0 baseline `MetadataVersion` is 3.0, all brokers support\ntruncation on fetch (`Fetch` v12+ with `LastFetchedEpoch` and\n`DivergingEpoch`). Fetcher threads can therefore skip the separate\n`OffsetsForLeaderEpochRequest` and detect divergence directly from fetch\nresponses.\n\nReviewers: Jun Rao \u003cjunrao@gmail.com\u003e, Chia-Ping Tsai\n \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "2142c21a5ba651fde909acdb1c049029a89355ec",
      "tree": "2bce63c6f416a01cddc022439f28f6cd54d1f5be",
      "parents": [
        "2f4b948248c0fce266ff638913a1d9eb3bd671ec"
      ],
      "author": {
        "name": "Gergely Harmadas",
        "email": "54865262+harmadasg@users.noreply.github.com",
        "time": "Wed Oct 07 20:23:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 08 02:23:44 2026 +0800"
      },
      "message": "KAFKA-21237 Remove accidental JUnit 4 usage (#23741)\n\nCurrently [StreamsGroupDescribeRequestTest](https://github.com/apache/kafka/blob/85387e94364bdf31c6acf06086210d85a9fb0711/core/src/test/scala/unit/kafka/server/StreamsGroupDescribeRequestTest.scala#L32)\nincludes accidental JUnit 4 assert usages. Based on my findings:\n\n- Historically\n[KAFKA-7339](https://issues.apache.org/jira/browse/KAFKA-7339) had the\nJUnit 4 to JUnit 5 migration in scope.\n- [KAFKA-19153](https://issues.apache.org/jira/browse/KAFKA-19153)\npulled in a new dependency [Mock OAuth2\nServer](https://mvnrepository.com/artifact/no.nav.security/mock-oauth2-server/2.3.0)\nwhich in turn depends on JUnit 4\n- [KAFKA-19754](https://issues.apache.org/jira/browse/KAFKA-19754)\nprobably only used the JUnit 4 asserts by accident since the test\nlibrary is on the test classpath\n\nAs a fix I changed the asserts to the JUnit 5 equivalent and removed\nJUnit 4 from the test compile classpath so we can avoid similar\naccidents in the future.\n\nOther things I considered:\n\n- JUnit 4 can\u0027t be excluded from [Mock OAuth2\nServer](https://mvnrepository.com/artifact/no.nav.security/mock-oauth2-server/2.3.0)\nas it is a runtime dependency which results in NoClassDefFoundError\n- Tried updating [Mock OAuth2\nServer](https://mvnrepository.com/artifact/no.nav.security/mock-oauth2-server/2.3.0)\nto latest version but it still pulls in JUnit 4\n\nReviewers: Chia-Ping Tsai \u003cchia7712@gmail.com\u003e"
    },
    {
      "commit": "2f4b948248c0fce266ff638913a1d9eb3bd671ec",
      "tree": "e6c6d58fad994a0c79e9efb3a8750084f9de44bc",
      "parents": [
        "120f1420e384fc95365b0fc2ae107e21e3b2afe6"
      ],
      "author": {
        "name": "KhyatiVaghamshi",
        "email": "khyati220@gmail.com",
        "time": "Wed Oct 07 07:10:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 16:10:27 2026 +0200"
      },
      "message": "KAFKA-21120: Replace temp file handler with JUnit 5 @TempDir in clients and connect tests (#23388)\n\n\nReviewers: Mickael Maison \u003cmickael.maison@gmail.com\u003e, ashwinpankaj \u003capankaj@confluent.io\u003e\nCo-authored-by: khyativ \u003ckvaghamshi@salesforce.com\u003e"
    },
    {
      "commit": "120f1420e384fc95365b0fc2ae107e21e3b2afe6",
      "tree": "e1cbe493f49e1ce33bdead4be2dae551d360671c",
      "parents": [
        "baa35b526fbff6c94a4ab2face05691afb872ce9"
      ],
      "author": {
        "name": "Tamas Barnabas Egyed",
        "email": "egyed.t@cloudera.com",
        "time": "Wed Oct 07 13:25:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 07 13:25:04 2026 +0200"
      },
      "message": "KAFKA-15104: Fix flaky tests in MetadataQuorumCommandTest (#23531)\n\nUpdate KafkaClusterTestKit startup order too. #23466 is not required\nanymore since, this commit removes the flaky annotations as well.\n\nReviewed-by: Viktor Somogyi-Vass \u003cviktorsomogyi@gmail.com\u003e\n\nSigned-off-by: Tamás Barnabás Egyed \u003cegyed.t@cloudera.com\u003e"
    }
  ],
  "next": "baa35b526fbff6c94a4ab2face05691afb872ce9"
}
