)]}'
{
  "log": [
    {
      "commit": "678c8b07a90878662c2339d7701922b2cbb45ba5",
      "tree": "6e17c8b15880a6dbdbfd7d985f998529fce10204",
      "parents": [
        "af3c64f7eb7d85488900818ccf7b5c6909a266fc"
      ],
      "author": {
        "name": "Chaitanya Deepthi",
        "email": "45308220+deepthi912@users.noreply.github.com",
        "time": "Thu Oct 22 20:09:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 08:39:02 2026 +0530"
      },
      "message": "Hold the consumer semaphore while a replace reverts upsert metadata (#19817)"
    },
    {
      "commit": "af3c64f7eb7d85488900818ccf7b5c6909a266fc",
      "tree": "542425ebfbe0de760000e6394daac794a316a832",
      "parents": [
        "77ec2fbf1cf94dc8c08b7bcd293d4924ef2c3f56"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Oct 22 16:47:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 16:47:51 2026 -0700"
      },
      "message": "Make sorted ORDER BY late materialization automatic (#20003)"
    },
    {
      "commit": "77ec2fbf1cf94dc8c08b7bcd293d4924ef2c3f56",
      "tree": "361227db63eba2dd88c96ac10f6338ef68914e31",
      "parents": [
        "8f20062cd13e645a0491027f814d6be18458f62f"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 22 15:11:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 03:41:23 2026 +0530"
      },
      "message": "Fold MSE literal function calls with runtime value types (#19948)"
    },
    {
      "commit": "8f20062cd13e645a0491027f814d6be18458f62f",
      "tree": "ae09edd9bae08594e0884ee019e6d74443c772d3",
      "parents": [
        "b02a76512697ff971368d1c1e23be91d8da8bd23"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Oct 22 11:45:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:45:32 2026 -0700"
      },
      "message": "Give the dimension table tests their own temp directory (#20004)"
    },
    {
      "commit": "b02a76512697ff971368d1c1e23be91d8da8bd23",
      "tree": "61e53ea45cc86c62277dba4e95c345596fa71b13",
      "parents": [
        "91fbab84f5d5100befd5171389dccf81c36db2bf"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 22 11:38:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 23 00:08:22 2026 +0530"
      },
      "message": "Fix broker routing ignoring a shutting down server while another server is excluded (#19997)"
    },
    {
      "commit": "91fbab84f5d5100befd5171389dccf81c36db2bf",
      "tree": "ed9837fbbf6b1f03212e41acd88ccc2c5ea08300",
      "parents": [
        "24c520be6e063f0253a97902051b6853b42bf1bb"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Oct 22 11:25:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 11:25:54 2026 -0700"
      },
      "message": "Move the segment assignment partition column to SegmentAssignmentConfig (#19958)"
    },
    {
      "commit": "24c520be6e063f0253a97902051b6853b42bf1bb",
      "tree": "43504d083a8245ba7ec76fbf14edc976c4a35b74",
      "parents": [
        "310d7604fcd89f8348eeaabb9f56de8a9b74d163"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 22 09:40:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 09:40:24 2026 +0200"
      },
      "message": "Make FixedBitMVForwardIndexReader.getNumValuesMV advance the reader context (#19992)"
    },
    {
      "commit": "310d7604fcd89f8348eeaabb9f56de8a9b74d163",
      "tree": "8498ecada8f1f8112956553d8caada57cd821790",
      "parents": [
        "9fbd72ae42a892f1638b732a02d7e7946f7c9b6b"
      ],
      "author": {
        "name": "Arunkumar Saravanan",
        "email": "41850738+arunkumarucet@users.noreply.github.com",
        "time": "Thu Oct 22 11:26:29 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 22:56:29 2026 -0700"
      },
      "message": "Materialize non-order-by columns late on the sorted order-by path (#19879)"
    },
    {
      "commit": "9fbd72ae42a892f1638b732a02d7e7946f7c9b6b",
      "tree": "7f3ac54f1316df59230a3fe7b3cb082e4c988631",
      "parents": [
        "2877723da384b783df372fb203fbf9fef0aea740"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Oct 21 20:30:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 20:30:48 2026 -0700"
      },
      "message": "Run the MSE approximate aggregate rewrite after CASE-to-FILTER conversion (#19974)"
    },
    {
      "commit": "2877723da384b783df372fb203fbf9fef0aea740",
      "tree": "1e67308b6388a2832cf4408c662634657fb6b79d",
      "parents": [
        "0b053a1f3c24551f232f41149f6797bcfc8b25c3"
      ],
      "author": {
        "name": "Suvodeep Pyne",
        "email": "suvodeep-pyne@users.noreply.github.com",
        "time": "Wed Oct 21 16:17:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 16:17:49 2026 -0700"
      },
      "message": "Repair ERROR replicas on pauseless dedup and partial-upsert tables (#19909)"
    },
    {
      "commit": "0b053a1f3c24551f232f41149f6797bcfc8b25c3",
      "tree": "d44af73de1fee0b1831743352dad1495954147d1",
      "parents": [
        "d6146aad3cd906256b361dcb85e23f0309b337e8"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Wed Oct 21 15:06:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 15:06:52 2026 -0700"
      },
      "message": "Fix stale realtime Lucene searchable document counts (#19945)\n\n* Fix stale realtime Lucene searchable document counts\n\n* Use Lucene maxDoc for realtime document fences\n\n* Isolate mock query instance data directories"
    },
    {
      "commit": "d6146aad3cd906256b361dcb85e23f0309b337e8",
      "tree": "3d47cb8f605d3d7ad561b23268d391ca20c21ff5",
      "parents": [
        "30cc49731420a8ae1ae80b226d7d3db333edac4e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 21 14:47:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 14:47:48 2026 -0700"
      },
      "message": "Bump com.fasterxml.jackson:jackson-bom from 2.22.3 to 2.22.4 (#19993)\n\nBumps [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.22.3 to 2.22.4.\n- [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.22.3...jackson-bom-2.22.4)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson:jackson-bom\n  dependency-version: 2.22.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "30cc49731420a8ae1ae80b226d7d3db333edac4e",
      "tree": "32f8c475eaaf80a24b48f271f0c0aedd8dd02063",
      "parents": [
        "e574c52eff6fc6c1544e8270f465565c8e51e03b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 21 14:17:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 14:17:27 2026 -0700"
      },
      "message": "Bump com.github.luben:zstd-jni from 1.5.7-23 to 1.5.7-24 (#19994)\n\nBumps [com.github.luben:zstd-jni](https://github.com/luben/zstd-jni) from 1.5.7-23 to 1.5.7-24.\n- [Commits](https://github.com/luben/zstd-jni/compare/v1.5.7-23...v1.5.7-24)\n\n---\nupdated-dependencies:\n- dependency-name: com.github.luben:zstd-jni\n  dependency-version: 1.5.7-24\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e574c52eff6fc6c1544e8270f465565c8e51e03b",
      "tree": "ab71a972b6344dfae53d17adfbb4c9c4516cdb40",
      "parents": [
        "beb891d2282a3ceea4fd749166c3bbce0f4339ab"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Oct 21 11:49:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 00:19:24 2026 +0530"
      },
      "message": "Push ARRAY_TO_MV filters below joins again in MSE (#19973)"
    },
    {
      "commit": "beb891d2282a3ceea4fd749166c3bbce0f4339ab",
      "tree": "f8046f9d62a725cca90b2525c0c3a81eb93beb72",
      "parents": [
        "be94fc67e474828fa5e605bfe6df70084afbc00f"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Oct 21 11:48:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 22 00:18:30 2026 +0530"
      },
      "message": "Keep partitioned workers for window and WITHIN GROUP sorts over hash exchanges (#19954)"
    },
    {
      "commit": "be94fc67e474828fa5e605bfe6df70084afbc00f",
      "tree": "02aa620fcc3744ec15ea59fad940ee10e3b0e904",
      "parents": [
        "edc48dff392553e812c516efb3ba890580e96965"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Wed Oct 21 10:08:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 22:38:32 2026 +0530"
      },
      "message": "Replace approximateFunctionApplied with approximatedResult, set when a SMART function turns approximate (#19972)"
    },
    {
      "commit": "edc48dff392553e812c516efb3ba890580e96965",
      "tree": "059f915f58627980ead6ac9b14e9623630988cd3",
      "parents": [
        "881a1f74dc660983a82080e4f78eca207c37cb17"
      ],
      "author": {
        "name": "Suvodeep Pyne",
        "email": "suvodeep-pyne@users.noreply.github.com",
        "time": "Wed Oct 21 01:25:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 21 01:25:34 2026 -0700"
      },
      "message": "Let a retried validation-manager IdealState update add the segments it created (#19739)\n\n* Let a retried validation-manager IdealState update add the segments it created\n\nRealtimeSegmentValidationManager repairs partitions inside an IdealState\nupdater: it creates the ZK metadata of the next CONSUMING segment, then adds\nthe segment to the IdealState. When the IdealState write fails, e.g. on a\nversion conflict with another writer, the updater runs again. The new\nsegment\u0027s ZK metadata is still there, so the retry finds a latest segment that\nhas ZK metadata but is not in the IdealState, and skips it because its ZK\nmetadata was updated less than max.segment.completion.time.millis ago (the\ncheck that protects segments being committed). The repair lands only on a\nlater run after that time, while the partition does not consume.\n\nTrack the segments created by the updater across its attempts, and add a\nsegment created by an earlier attempt to the IdealState right away. A segment\nis tracked as soon as its ZK metadata is created, before instances are\nassigned to it. The potential data loss is still reported when the segment\nreplaces a CONSUMING segment that is no longer CONSUMING on the retry, but\nnot for segments created for OFFLINE, ONLINE or new partitions, which have no\nprevious CONSUMING segment.\n\n* Check the retry\u0027s created segments through ZK metadata\n\ntestEnsureAllPartitionsConsumingRetryAddsSegmentsCreatedByEarlierAttempt\nasserted the contents of the internal map that tracks the segments created\nacross attempts. Check the outcome instead: after the retry, partitions 0 and\n1 have exactly the expected segment ZK metadata, so no extra segment was\ncreated, and the IdealState assertions cover the rest.\n\n* Prefer the IdealState segment among same-sequence repair candidates\n\nWhen two controllers repair a partition at the same time, e.g. during a lead controller change, both can create a new segment with the same sequence number. If the other controller adds its segment to the IdealState first, the retry of the IdealState update could pick its own new segment as the latest one, add it right away as created by an earlier attempt, and fail on the duplicate sequence number check, which aborts the whole update. The latest segment of a partition is now the one in the IdealState when several segments have the highest sequence number.\n\nAlso covers the public ensureAllPartitionsConsuming with a failed IdealState write, and the retry for a new partition."
    },
    {
      "commit": "881a1f74dc660983a82080e4f78eca207c37cb17",
      "tree": "f80fac3b6b7d4613c9a0b0df14c93d5d98c86307",
      "parents": [
        "2630b03651dcb240bd04666bb789ee10d085b049"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Oct 20 21:43:58 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 21:43:58 2026 -0700"
      },
      "message": "Honor nullableParameters for scalar functions in the single-stage engine (#19983)"
    },
    {
      "commit": "2630b03651dcb240bd04666bb789ee10d085b049",
      "tree": "af85ea4c1720f71d9b315a71f32c1dd194155c9f",
      "parents": [
        "e8647425026d9d490112b28fe22f5a7a44586a77"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Oct 20 21:42:05 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 21:42:05 2026 -0700"
      },
      "message": "Add null-ignoring variants of array union, concat and push scalar functions (#19981)"
    },
    {
      "commit": "e8647425026d9d490112b28fe22f5a7a44586a77",
      "tree": "ad0b3fac12c7ed42606f6fbd0014fa0a27ecdc9e",
      "parents": [
        "7129921070898c54299ffcd5796dc0d423aa7ffd"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Oct 20 21:38:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 21:38:56 2026 -0700"
      },
      "message": "Remove the warning on multiple PinotMetricsFactory classes (#19985)"
    },
    {
      "commit": "7129921070898c54299ffcd5796dc0d423aa7ffd",
      "tree": "7c160b5f8b33279f8382418583940ed3c34aaf70",
      "parents": [
        "3007f88d181f70561da3bf873138310682cac2d5"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Oct 20 21:38:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 21:38:27 2026 -0700"
      },
      "message": "Remove redundant snake_case scalar function aliases (#19984)"
    },
    {
      "commit": "3007f88d181f70561da3bf873138310682cac2d5",
      "tree": "7ad3b1db4346cde7bb8e5b01878ffc47a8fa457f",
      "parents": [
        "b1d6f042e3fb6f3cf614e9742b618b135cf222dd"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 20 19:46:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 19:46:57 2026 -0700"
      },
      "message": "Bump vite from 8.0.16 to 8.3.4 in /pinot-controller/src/main/resources (#19989)\n\nBumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.16 to 8.3.4.\n- [Release notes](https://github.com/vitejs/vite/releases)\n- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)\n- [Commits](https://github.com/vitejs/vite/commits/v8.3.4/packages/vite)\n\n---\nupdated-dependencies:\n- dependency-name: vite\n  dependency-version: 8.3.4\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b1d6f042e3fb6f3cf614e9742b618b135cf222dd",
      "tree": "113922df2721b9e24707e29f6b9f0c8416f0ac80",
      "parents": [
        "1f977d977f8ce92e4e95195ab2a928a1e5d907f5"
      ],
      "author": {
        "name": "Jhow",
        "email": "44998515+J-HowHuang@users.noreply.github.com",
        "time": "Wed Oct 21 09:58:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 18:58:03 2026 -0700"
      },
      "message": "Add onlyIfNeeded option in segment reload (#19861)\n\n* add onlyIfNeeded flag to segment reload\n\n* fix duplicate count in skipped and success count\n\n* reuse isReloadNeeded in needReloadSegments\n\n* inline the single segment reload check\n\n* nit: logs\n\n* docs"
    },
    {
      "commit": "1f977d977f8ce92e4e95195ab2a928a1e5d907f5",
      "tree": "ba95938fe70b845892c539a60088751375b0f84a",
      "parents": [
        "8170af55d3229c8a39b02b162d50f796b15a6686"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 20 18:15:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 18:15:18 2026 -0700"
      },
      "message": "Bump org.ow2.asm:asm from 9.11 to 9.11.1 (#19971)\n\nBumps org.ow2.asm:asm from 9.11 to 9.11.1.\n\n---\nupdated-dependencies:\n- dependency-name: org.ow2.asm:asm\n  dependency-version: 9.11.1\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8170af55d3229c8a39b02b162d50f796b15a6686",
      "tree": "1e5ffe5e0759fc5933578aaa073864990964bdc3",
      "parents": [
        "89b84bad2e2fcefcb7dac4ec0bbdb148fdb0e023"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Oct 20 17:45:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 17:45:19 2026 -0700"
      },
      "message": "Bump follow-redirects in /pinot-controller/src/main/resources (#19979)\n\nBumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.16.0 to 1.16.1.\n- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)\n- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.16.0...v1.16.1)\n\n---\nupdated-dependencies:\n- dependency-name: follow-redirects\n  dependency-version: 1.16.1\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "89b84bad2e2fcefcb7dac4ec0bbdb148fdb0e023",
      "tree": "2bcfff0f26bc531452f8ca60d36a619cdc12021a",
      "parents": [
        "0d02adb733bd846ea717804592b0239394e5924b"
      ],
      "author": {
        "name": "Suvodeep Pyne",
        "email": "suvodeep-pyne@users.noreply.github.com",
        "time": "Tue Oct 20 16:28:33 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 16:28:33 2026 -0700"
      },
      "message": "Resume a pauseless commit start after its IdealState update fails (#19740)\n\n* Resume a pauseless commit start after its IdealState update fails\n\nThe pauseless commit start moves the committing segment to COMMITTING in ZK\n(step 1), creates the next segment\u0027s ZK metadata (step 2), then updates the\nIdealState (step 3). When step 3 fails, e.g. after losing every retry to\nIdealState version conflicts, the segment stays COMMITTING, and every retry\nof the commit failed with \"should be IN_PROGRESS, found: COMMITTING\" until\nRealtimeSegmentValidationManager repaired the partition after\nmax.segment.completion.time.millis. The same happened when the controller\nstopped between step 1 and step 3.\n\nA commit start for a segment that is already COMMITTING with the same end\noffset now resumes the earlier attempt from step 2, until the max segment\ncompletion time, after which the validation manager still owns the repair.\nSteps 2 and 3 are made idempotent so that the attempts of a commit start,\nincluding attempts on different controllers around a lead change, converge:\n- A resumed attempt uses the new segment created by an earlier attempt, if\n  any. The new segment is named after its creation time with minute\n  granularity, and is created between step 1 and the max segment completion\n  time, so the resumed attempt probes the names of the minutes in between.\n  Otherwise it creates the new segment with the current time, as the first\n  attempt does, so the segment is never named after an older time.\n- New segment ZK metadata is created atomically only if absent and is never\n  overwritten, since the segment might be consuming or committed already.\n- The IdealState updater skips an update that is already applied (all\n  replicas of the committing segment ONLINE and the new segment present).\n  Previously a retry after a write that succeeded but was reported as failed\n  failed every remaining attempt, and every update batched with it, on\n  \"Failed to find instance in CONSUMING state\".\n- When step 3 fails, the controller re-reads the IdealState and proceeds if\n  the update was applied. Otherwise it keeps the new segment\u0027s ZK metadata for\n  the next attempt, or for the validation manager, which adds such a segment\n  to the IdealState. It removes the metadata only when the new segment is not\n  in the IdealState and the committing segment is no longer CONSUMING, the\n  only state in which no attempt can add the segment anymore.\n\nAttempts on two controllers, or a kept new segment and a validation repair\nthat started before it was created, can still create two new segments with\nthe same sequence number. When several segments of a partition have the\nhighest sequence number, the validation manager now takes the one in the\nIdealState as the latest segment, instead of whichever is listed first, which\ncould make it fail every run with \"Segment ... is a duplicate of existing\nsegment ...\".\n\nNo ZK metadata is rolled back, so the IdealState version check of step 3\nremains the only fence against a concurrent repair by the validation manager.\n\n* Remove a commit start test that duplicates another one\n\ntestCommitStartFailureKeepsNewSegmentAddedConcurrently exercised the same\nbranch as testCommitStartSucceedsWhenFailedIdealStateUpdateWasApplied: after\na failed IdealState update, the controller re-reads the IdealState, finds the\ncompletion applied and proceeds. The failure handler does not depend on\nwhether the attempt was resumed.\n\n* Document assumptions of the commit start resume\n\nNote that probing for the new segment of an earlier attempt relies on the committing segment ZK metadata not being rewritten while it stays COMMITTING, and which segment is the latest one when several segments with the highest sequence number are missing from the IdealState."
    },
    {
      "commit": "0d02adb733bd846ea717804592b0239394e5924b",
      "tree": "a43f600125bc1102a108fed352fdb50b2b1b70a8",
      "parents": [
        "88c3262d10ac94bb70aceded8771595d288b77ca"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Tue Oct 20 16:26:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 16:26:53 2026 -0700"
      },
      "message": "Exercise JDBC invalid decimal parsing on a valid row (#19935)"
    },
    {
      "commit": "88c3262d10ac94bb70aceded8771595d288b77ca",
      "tree": "c891487b2f5ea7855dfe6eba827227dc74b56336",
      "parents": [
        "607576c7a8b6ea19dd7eda2e5614701738d1db1c"
      ],
      "author": {
        "name": "RAGHVENDRA KUMAR YADAV",
        "email": "raghavmnnit@gmail.com",
        "time": "Tue Oct 20 15:33:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 15:33:51 2026 -0700"
      },
      "message": "Support chained, forward-index-disabled, and disabled-source derived columns (#19581)\n\n* Support chained, forward-index-disabled, and disabled-source derived columns\n\nBaseDefaultColumnHandler carried three TODOs that limited derived columns built\nat segment load. All three are lifted here.\n\nChained derived columns. updateDefaultColumns iterated an unordered map and\nresolved arguments against the segment metadata loaded before the run, so a\ncolumn created during the run was invisible. Columns are now visited in\ndependency order (topological over the ADD actions), and the metadata written\nfor each created column is recorded and consulted before the segment metadata.\nThis also fixes a derived column reading a plain default column added in the\nsame reload, which failed the same way. A dependency cycle cannot be satisfied\nin any order: those columns are emitted last and take the default-value path,\nwith the cycle logged rather than failing the segment load.\n\nSource column with the forward index disabled. Previously an unconditional\nUnsupportedOperationException. The forward index is now regenerated from the\ndictionary and inverted index for the duration of the run and dropped\nafterwards, mirroring the temporary-forward-index pattern BaseIndexHandler\nalready uses. When regeneration is not possible the column falls back to its\ndefault value, or still fails when errorOnColumnBuildFailure is set.\n\nForward-index-disabled derived column. Previously skipped with a warning. It is\nnow built with a forward index and a dictionary; ForwardIndexHandler runs next,\nqueues DISABLE_FORWARD_INDEX and deletes the forward index in its post-update\ncleanup, once the inverted index has been built from it.\n\nV3DefaultColumnHandler decided whether to transfer a forward or an inverted\nindex into the v3 file from the config. A forward-index-disabled multi-value\ndefault column writes an inverted index but a derived one writes a forward\nindex, so the decision now follows the file that exists on disk.\n\nDefaultColumnHandlerFactory gains a SegmentDirectory overload, needed by\nInvertedIndexAndDictionaryBasedForwardIndexCreator; the existing signature is\nkept and delegates with null.\n\nThe transform configs are indexed by column and the parsed expressions cached,\nso each is parsed once per segment load rather than once for ordering and again\nfor deriving. Reading back a created column\u0027s metadata is restricted to columns\na transform function actually reads, so a schema evolution adding many plain\ndefault columns does not re-parse metadata it will never consult. A table with\nno derived columns takes the same path as before: no expression is parsed and\nthe action map is returned unchanged.\n\n* Address review: chained value fidelity, metadata refresh, update ordering, cycle fallback\n\nFive correctness findings from the review of the previous commit.\n\nChained derived columns now evaluate on the expression results rather than on\nwhat the intermediate column stored. Ingestion evaluates a whole chain before\nconverting anything to its stored type, so with a \u003d 1, INT b \u003d divide(a, 2) and\nDOUBLE c \u003d plus(b, 1) it stores b \u003d 0 and c \u003d 1.5. Reading b back from its index\ngave c \u003d 1.0 instead. The values a derived column produces are kept, before\nconversion, for the columns another transform function reads, and dropped at the\nend of the run.\n\nAn argument\u0027s metadata is re-read after its forward index is regenerated. The\nrebuild rewrites the properties the reader works from -- the encoding flips when\na raw index is restored, and TOTAL_NUMBER_OF_ENTRIES shrinks when a disabled\nmulti-value source held duplicates within a row -- so the copy taken beforehand\ncomputed the wrong offsets, the same reason BaseIndexHandler returns refreshed\nmetadata from createForwardIndexIfNeeded.\n\nDependency ordering covers UPDATE actions, not just ADD. A source whose default\nvalue is changing is only correct once its own action has run; reading it earlier\nwrote the pre-update value into the chain permanently, and no later reload put it\nright.\n\nRegenerating the forward index of a source created in the same run no longer\ndereferences null. Such a column exists only in the metadata properties just\nflushed, not in the segment directory\u0027s metadata, so the creator takes it as an\nargument; InvertedIndexAndDictionaryBasedForwardIndexCreator gains the overload.\n\nEvery member of a dependency cycle now takes its default value. Returning on\nre-entry left the enclosing calls free to emit the other members, so whichever\none ran second read the first and derived a value from a default instead of\ntaking the documented fallback.\n\nFive regression tests, each failing without the matching fix: the chain compared\nagainst a segment built through ingestion, the encoding flip during regeneration,\nthe updated source ahead of a two-link chain, a derived column reading a\nforward-index-disabled multi-value column added in the same reload, and the cycle\nasserted on actual default values rather than cardinality.\n\n* Address review: null intermediates, refreshed source metadata, full cycle detection\n\n- Hand the raw expression results to the rest of the chain, captured before\n  nulls are replaced with the column\u0027s default, so a chain over a null\n  intermediate stores what ingestion stores.\n- Cache the metadata refreshed after a forward index is regenerated for every\n  source, not just ones created in the same run, so a second read of the same\n  source works from it.\n- Identify dependency cycles as strongly connected components, so every member\n  of overlapping cycles falls back to its own default value.\n\n* Fall back explicitly for a derived column reading a cycle member\n\nA column reading a member of a transform dependency cycle relied on the\nmember\u0027s metadata being absent to take the default-value path. When the\ncycle members already exist and are only being updated, their metadata is\npresent, so the dependent -- ordered before the postponed cycle -- read\ntheir pre-update values and kept them for good.\n\nTreat a cyclic argument as an explicit fallback when resolving a derived\ncolumn\u0027s arguments."
    },
    {
      "commit": "607576c7a8b6ea19dd7eda2e5614701738d1db1c",
      "tree": "fd658325d5b4eea9b934ec61848f7c363909d6b1",
      "parents": [
        "14124f316266b45f06f1b024eb812850209aceba"
      ],
      "author": {
        "name": "Kartik Khare",
        "email": "kharekartik@gmail.com",
        "time": "Tue Oct 20 12:51:05 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 12:51:05 2026 +0530"
      },
      "message": "Fix endless range index rebuild for MV columns with rangeIndexVersion 2 (#19936)\n\nThe BitSliced (v2) creator only builds for single-value columns, so MV columns\nalways get a v1 index. RangeIndexHandler compared the on-disk version against the\nraw configured version, so needUpdateIndices stayed true and every reload rebuilt\nthe v1 index. Compare against the version the creator actually builds instead.\n\nCo-authored-by: Kartik Khare \u003ckharekartik@Kartiks-MacBook-Pro.local\u003e"
    },
    {
      "commit": "14124f316266b45f06f1b024eb812850209aceba",
      "tree": "fe4883ba57b9173b8f5511eb0bce1a6d1adbe677",
      "parents": [
        "1ea404bda572091ed4dbd187a053b2f8f3fd3c40"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 18:50:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 18:50:40 2026 -0700"
      },
      "message": "Use fast LZ4 for .tar.lz4 archives (#19946)\n\n* Speed up LZ4 archive creation and buffer extraction\n\nLZ4 archives with many short matches caused slow creation and tiny extraction writes.\nUse the existing frame encoder and buffer normal extraction; a 157 MB archive reproduces the bottleneck.\n\n* Add named LZ4 implementations through Commons Compress\n\nRegister fast, high-compression, and legacy encoders with the compressor factory. Keep tar dispatch generic and preserve existing LZ4 defaults.\n\n* Isolate mock server directories across parallel query tests\n\nCI runs QueryRunnerTest and QueryTerminatedBeforeStageStartsTest in separate forks with the same server and table names. Give each factory a UUID namespace so one setup cannot delete another test’s segment directory.\n\n* Use fast LZ4 for .tar.lz4 archives\n\nKeep gzip as the generic archive default and retain the Commons encoder as lz4-framed. Remove the redundant lz4-default alias and simplify the provider to fast and HC encoders."
    },
    {
      "commit": "1ea404bda572091ed4dbd187a053b2f8f3fd3c40",
      "tree": "04025e6eb0d6a112801aeef37277d9b11c49138e",
      "parents": [
        "ad850480ef2ea656a8c921b625578017b7d5e9ab"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 17:38:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 17:38:47 2026 -0700"
      },
      "message": "Remove unused upsert compact merge executor test scaffolding (#19931)\n\n* Remove unused upsert compact merge executor test scaffolding\n\n* Initialize upsert executor test fixture once per class"
    },
    {
      "commit": "ad850480ef2ea656a8c921b625578017b7d5e9ab",
      "tree": "9e26e19142aeb18df7d04035a7206660a1432fb6",
      "parents": [
        "34fee4dcf526b6994f37484f53c432bbdfef9d92"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Mon Oct 19 15:11:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 20 03:41:52 2026 +0530"
      },
      "message": "Revert \"Map DECIMAL(p, 0) to a type that holds all its values in the multi-stage engine (#19790)\" (#19949)\n\nThis reverts commit dc7837cb617645ff48aa8146c71c0f23b6ef83e4."
    },
    {
      "commit": "34fee4dcf526b6994f37484f53c432bbdfef9d92",
      "tree": "8e3c4c1e9950407397c49b5c042001155b628e6a",
      "parents": [
        "2dc0baa9a8b220716c8fab8a02cc9395e92beb6c"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 14:31:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 14:31:26 2026 -0700"
      },
      "message": "Remove unused InMemoryColumnReader test fixture (#19929)"
    },
    {
      "commit": "2dc0baa9a8b220716c8fab8a02cc9395e92beb6c",
      "tree": "00813244ee47c60e9635fd22532d1f54a110ffd8",
      "parents": [
        "16ef89030be3d4e079ca9641c090c8c2d5c9e657"
      ],
      "author": {
        "name": "RAGHVENDRA KUMAR YADAV",
        "email": "raghavmnnit@gmail.com",
        "time": "Mon Oct 19 14:30:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 14:30:06 2026 -0700"
      },
      "message": "Defer a new segment only while its replicas are still coming up (#19901)\n\n* Defer a new segment only while its replicas are still coming up\n\nThe broker\u0027s partition info leaves a newly created segment out of its partition\nuntil the segment is online on every server that already holds the partition,\nso that a segment whose replicas are still loading does not shrink the\npartition\u0027s fully replicated servers. The same test also excludes a segment that\nis already online on every server it is assigned to, just on different servers\nthan the rest of its partition. That segment never covers them, so it stays out\nfor the whole new-segment window, and a partition-hinted multi-stage query\nsilently skips its rows: two partitioned tables without partition-aware\nplacement returned 23 of 60 rows for a colocated join, with no error. Once the\nsegment stops being new the same query fails with a clear error instead.\n\nTrack the replica count the ideal state assigns, and defer a new segment only\nwhile fewer replicas are online. A fully online segment is counted like any\nother, so a partition that no server holds whole is reported at once.\n\n* Judge a new segment\u0027s readiness by its assigned servers, not their count\n\nThe ideal state and external view are updated independently, so during a\nreassignment the external view can still list a server the ideal state has\ndropped. Comparing replica counts then admits a segment while an assigned replica\nis still down. Track the assigned server list and require every assigned server\nto be online. Also rename the change flag, which now covers assignment changes,\nand note why an empty assignment keeps deferring."
    },
    {
      "commit": "16ef89030be3d4e079ca9641c090c8c2d5c9e657",
      "tree": "979a42dfed58c6f87e36f6c1cb2cf4459e0b7d2a",
      "parents": [
        "ec462d40c2783904ed4aadcf580fb07f3fe0a352"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 14:25:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 14:25:51 2026 -0700"
      },
      "message": "Remove unused Prometheus test resource helper (#19932)"
    },
    {
      "commit": "ec462d40c2783904ed4aadcf580fb07f3fe0a352",
      "tree": "baeef6f06365f8f5ac236a6ac8f5308526ca86cc",
      "parents": [
        "179993a61b12d64300d333fdd72cf7529d7aa2e8"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 14:05:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 14:05:31 2026 -0700"
      },
      "message": "Mark deprecated table config properties with @Deprecated(since, forRemoval \u003d true) (#18411)\n\nRecord on 16 deprecated table config getters the release that first\ndeprecated the property and that it is scheduled for removal, adding\n@Deprecated where it was missing (tableIndexConfig.jsonIndexColumns,\ntableIndexConfig.streamConfigs, routing.routingTableBuilderName and\nreplicaGroupPartitionConfig.minimizeDataMovement). Each getter also gets\na @deprecated Javadoc tag naming its replacement."
    },
    {
      "commit": "179993a61b12d64300d333fdd72cf7529d7aa2e8",
      "tree": "a7fa3f4470605b907e4ae03565d5583bd84955af",
      "parents": [
        "d234d4e2ad897842db0b1c56409d98523a094913"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 11:24:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:24:36 2026 -0700"
      },
      "message": "Assert NTILE operand validation in window test (#19934)"
    },
    {
      "commit": "d234d4e2ad897842db0b1c56409d98523a094913",
      "tree": "146efd241c3677f4325b937669b6d77bf414529c",
      "parents": [
        "30db5d9d0edee18c525b24468c732eb9ddaa4792"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 11:23:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:23:19 2026 -0700"
      },
      "message": "Restore grouped aggregation optimizer coverage (#19933)"
    },
    {
      "commit": "30db5d9d0edee18c525b24468c732eb9ddaa4792",
      "tree": "619faabb316ded47ce91842aa67aace020f702dc",
      "parents": [
        "4755685d37085613cd9661250716025e429e281f"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 11:17:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:17:11 2026 -0700"
      },
      "message": "Remove tests for the deleted native JSON statement optimizer (#19927)"
    },
    {
      "commit": "4755685d37085613cd9661250716025e429e281f",
      "tree": "dfe4287511ce0b464fe82f2aba98bb3f38337c8b",
      "parents": [
        "4fcbe279ffd8cfccb608c74614aa08e7e5d73f6a"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Mon Oct 19 11:15:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:15:31 2026 -0700"
      },
      "message": "Remove empty BlocksTest scaffolding (#19928)"
    },
    {
      "commit": "4fcbe279ffd8cfccb608c74614aa08e7e5d73f6a",
      "tree": "e35fdc044c54a7cf95d95bf5421737fd91d5f2d7",
      "parents": [
        "591dd8f2ca659f1d4a9bb4203060165f0e863199"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 10:53:54 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 10:53:54 2026 -0700"
      },
      "message": "Bump com.uber:h3 from 4.5.0 to 4.5.1 (#19939)"
    },
    {
      "commit": "591dd8f2ca659f1d4a9bb4203060165f0e863199",
      "tree": "3faab6ff2d3b77265014b4b591c632ae5d3b3b45",
      "parents": [
        "84c12d9af35b670b7adbe4367dafd38f3b6a9c4c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 10:53:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 10:53:17 2026 -0700"
      },
      "message": "Bump wire.version from 6.4.5 to 7.1.0 (#19938)"
    },
    {
      "commit": "84c12d9af35b670b7adbe4367dafd38f3b6a9c4c",
      "tree": "afcd5aca9e4ef15859aa54832284dc633e12ad38",
      "parents": [
        "9ddbe5e3e54d034c4fd4dc587dbd2aaaf480ce0a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 08:45:40 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 08:45:40 2026 -0700"
      },
      "message": "Bump prometheus.metrics.version from 1.9.0 to 1.10.0 (#19940)\n\nBumps `prometheus.metrics.version` from 1.9.0 to 1.10.0.\n\nUpdates `io.prometheus:prometheus-metrics-exporter-httpserver` from 1.9.0 to 1.10.0\n\nUpdates `io.prometheus:prometheus-metrics-core` from 1.9.0 to 1.10.0\n\nUpdates `io.prometheus:prometheus-metrics-model` from 1.9.0 to 1.10.0\n\n---\nupdated-dependencies:\n- dependency-name: io.prometheus:prometheus-metrics-exporter-httpserver\n  dependency-version: 1.10.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n- dependency-name: io.prometheus:prometheus-metrics-core\n  dependency-version: 1.10.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n- dependency-name: io.prometheus:prometheus-metrics-model\n  dependency-version: 1.10.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9ddbe5e3e54d034c4fd4dc587dbd2aaaf480ce0a",
      "tree": "6bc9da39c2a7c243295f99fcc70e3777c5ad4de6",
      "parents": [
        "d02cfda3af7e456211045e35ebaa5effa1ac146a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 08:45:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 08:45:23 2026 -0700"
      },
      "message": "Bump io.grpc:grpc-bom from 1.84.2 to 1.85.0 (#19941)\n\nBumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.84.2 to 1.85.0.\n- [Release notes](https://github.com/grpc/grpc-java/releases)\n- [Commits](https://github.com/grpc/grpc-java/compare/v1.84.2...v1.85.0)\n\n---\nupdated-dependencies:\n- dependency-name: io.grpc:grpc-bom\n  dependency-version: 1.85.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d02cfda3af7e456211045e35ebaa5effa1ac146a",
      "tree": "eae2fdd705c982bd6af1a59eb1ff0f18553bd3bf",
      "parents": [
        "b1db12d9c3ffe4337933d93b8bd75e0aac8ede73"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 08:45:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 08:45:07 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.55.15 to 2.56.0 (#19942)\n\nBumps software.amazon.awssdk:bom from 2.55.15 to 2.56.0.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.56.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b1db12d9c3ffe4337933d93b8bd75e0aac8ede73",
      "tree": "e5c43dcccb735c9a8e348fa2babb2b6e50e83097",
      "parents": [
        "4480f3b523d2e2f90183b3208ea4c4df31412928"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Oct 19 08:15:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 08:15:21 2026 -0700"
      },
      "message": "Bump org.jooq:joou-java-6 from 0.9.5 to 0.9.6 (#19937)\n\nBumps [org.jooq:joou-java-6](https://github.com/jOOQ/jOOU) from 0.9.5 to 0.9.6.\n- [Release notes](https://github.com/jOOQ/jOOU/releases)\n- [Commits](https://github.com/jOOQ/jOOU/compare/version-0.9.5...version-0.9.6)\n\n---\nupdated-dependencies:\n- dependency-name: org.jooq:joou-java-6\n  dependency-version: 0.9.6\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4480f3b523d2e2f90183b3208ea4c4df31412928",
      "tree": "f902898271265d85f185810b200bc5e3353d651a",
      "parents": [
        "9de9e01155450a2a416ba8a6b0fcfc60b0bb8782"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Mon Oct 19 16:30:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 16:30:53 2026 +0200"
      },
      "message": "Build v1 DataTable sections in heap pages to avoid humongous response allocations (#19906)"
    },
    {
      "commit": "9de9e01155450a2a416ba8a6b0fcfc60b0bb8782",
      "tree": "08d0decbe0380664e9e7ce6e5f50080dc28e3943",
      "parents": [
        "dc7837cb617645ff48aa8146c71c0f23b6ef83e4"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Sat Oct 17 14:59:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 14:59:11 2026 -0700"
      },
      "message": "Upgrade Wire schema and runtime to 6.4.5 (#19921)"
    },
    {
      "commit": "dc7837cb617645ff48aa8146c71c0f23b6ef83e4",
      "tree": "bcec6d61206d3a2dc2015ce8e45e758c1e708f5d",
      "parents": [
        "2584cd4a2ec449f2539818af4b1893b520959ecf"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Fri Oct 16 22:26:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 17 10:56:30 2026 +0530"
      },
      "message": "Map DECIMAL(p, 0) to a type that holds all its values in the multi-stage engine (#19790)"
    },
    {
      "commit": "2584cd4a2ec449f2539818af4b1893b520959ecf",
      "tree": "38f5baf512a21680a2c8be6a75ad42fd39c0c5b3",
      "parents": [
        "b2be58c03d8fe257ba9dfe5f842f88f161bb1e27"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 20:46:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 20:46:18 2026 -0700"
      },
      "message": "Add missing Kafka and Scala binary notices (#19920)"
    },
    {
      "commit": "b2be58c03d8fe257ba9dfe5f842f88f161bb1e27",
      "tree": "2ce2290bedba001106fa648c1dfaddd9c8f81a21",
      "parents": [
        "9c132dff17b404c415d2051b5d7530a8f92fb1f9"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 20:46:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 20:46:07 2026 -0700"
      },
      "message": "Bump Pinot development version to 1.7.0-SNAPSHOT (#19919)"
    },
    {
      "commit": "9c132dff17b404c415d2051b5d7530a8f92fb1f9",
      "tree": "1617015fcc9c5a40d9fc8da497337fd2a9755f28",
      "parents": [
        "afe11555643a89e8e852dc832dae8a9084392780"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 20:45:50 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 20:45:50 2026 -0700"
      },
      "message": "Make release source archives build without Git (#19918)"
    },
    {
      "commit": "afe11555643a89e8e852dc832dae8a9084392780",
      "tree": "d456674d504fdb4922d60a3fcd28df13e6c341b8",
      "parents": [
        "a45ebf01379257591c27c900c3525612a3c49b92"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 20:45:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 20:45:31 2026 -0700"
      },
      "message": "Configure standalone Pinot BOM for Apache releases (#19917)"
    },
    {
      "commit": "a45ebf01379257591c27c900c3525612a3c49b92",
      "tree": "43515cfedc7e155261eda8e6d125be912898cff7",
      "parents": [
        "4b71d907c5439dc22587a676ad8152ab5acfd754"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 17:31:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 17:31:14 2026 -0700"
      },
      "message": "Rebuild incompatible Lucene indexes during segment loading (#19900)\n\n* Rebuild incompatible Lucene indexes during segment loading\n\nKeep Lucene 9.12 and rebuild newer text/HNSW indexes from retained forward values, restarting interrupted builds safely.\nReproduce by loading a Lucene 10-generated segment on 9.12; loading fails before this change.\n\n* Report failed Lucene recovery marker cleanup\n\nFail loading when the vector build marker cannot be removed, and clarify corruption and I/O behavior.\nReproduce by denying marker deletion after a rebuild; silent cleanup makes later loads retry recovery.\n\n* Preserve new default columns during Lucene rollback recovery\n\nReproduce: add a default STRING column while loading a Lucene 10 shared text index on 9.12.\nCheck retained sources early, then all sources before replacement; keep the lifecycle in the handler."
    },
    {
      "commit": "4b71d907c5439dc22587a676ad8152ab5acfd754",
      "tree": "af2d979d94307d0b1b6b11ef96efdfe42f610bc1",
      "parents": [
        "ae34ff9c5a7f994e876f6dd269a78f4110939ef0"
      ],
      "author": {
        "name": "Deepak kumar",
        "email": "deepakkumar@meta.com",
        "time": "Fri Oct 16 17:15:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 17:15:10 2026 -0700"
      },
      "message": "Reuse the group key flyweight in MultiKeysGroupIdGenerator (#19834)"
    },
    {
      "commit": "ae34ff9c5a7f994e876f6dd269a78f4110939ef0",
      "tree": "66bfbc65b2c34269c3fbae3a52de1f026bb1a8e5",
      "parents": [
        "55afab92fe165cf222c9074084bf570a0d6ad290"
      ],
      "author": {
        "name": "Arunkumar Saravanan",
        "email": "41850738+arunkumarucet@users.noreply.github.com",
        "time": "Sat Oct 17 03:08:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:38:21 2026 -0700"
      },
      "message": "Cache parsed Lucene queries across segment readers (#19865)"
    },
    {
      "commit": "55afab92fe165cf222c9074084bf570a0d6ad290",
      "tree": "90f8dcda6ff46d6eb8b65e2263aad28d2b134469",
      "parents": [
        "0d624f598f236994c784737dfa6d29f609f21e85"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 14:32:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 14:32:42 2026 -0700"
      },
      "message": "Use managed Guava and Jackson instead of embedded vulnerable copies (#19890)\n\n* Use managed Guava instead of embedded Hadoop and Curator copies\n\n* Remove stale Guava module metadata embedded by Hadoop\n\n* Use managed Guava instead of the embedded Iceberg copy\n\n* Use managed Guava for Pulsar and JDBC embedded copies\n\n* Use managed Jackson instead of embedded dependency copies"
    },
    {
      "commit": "0d624f598f236994c784737dfa6d29f609f21e85",
      "tree": "8dae7d010ee738ae2df597e91dba925caa62ec53",
      "parents": [
        "fe6511365d0e067b15edf96e13b529c57fd14d30"
      ],
      "author": {
        "name": "Suvodeep Pyne",
        "email": "suvodeep-pyne@users.noreply.github.com",
        "time": "Fri Oct 16 13:07:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 13:07:53 2026 -0700"
      },
      "message": "Clone IdealState without a serialization round trip (#19738)"
    },
    {
      "commit": "fe6511365d0e067b15edf96e13b529c57fd14d30",
      "tree": "a657795a27e6a13cf370621920611d6ec2912112",
      "parents": [
        "c5eeb91e388ab5cc697a8262881ccbd3b668e076"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Fri Oct 16 12:22:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 12:22:12 2026 -0700"
      },
      "message": "Simplify re-ingestion tracking and skip obsolete queued jobs (#19893)"
    },
    {
      "commit": "c5eeb91e388ab5cc697a8262881ccbd3b668e076",
      "tree": "3af3d277b7be6216374273495b4fe2abdd5d54e5",
      "parents": [
        "a46d4e047b4abe422fd71317bd428d9387049374"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Fri Oct 16 11:40:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 11:40:22 2026 -0700"
      },
      "message": "Let OBJECT codecs serialize payloads into caller buffers (#19836)\n\n* Let OBJECT codecs serialize payloads into caller buffers\n\nRoaring, UltraLogLog, and primitive-list codecs now own direct writes alongside their existing byte-array API. Call getSerializedSize before buffer serialization; unsupported codecs keep the legacy fallback, and all 198 combined tests pass.\n\n* Centralize OBJECT byte-array allocation\n\nKeep typed forwarding calls so legacy serializers retain their allocation behavior while sharing the default implementation.\n\n* Clarify caller-buffer serialization contracts\n\nDocument sufficient remaining capacity, codec override requirements and the intended caller. Cover excess buffer space in the existing serialization tests."
    },
    {
      "commit": "a46d4e047b4abe422fd71317bd428d9387049374",
      "tree": "9e0e4380d31e1e29b55372c83ad8110fcff8f3ec",
      "parents": [
        "1ecbd5c99db783075b04aa365f5a302fa11b3691"
      ],
      "author": {
        "name": "Dylan Dreyer",
        "email": "dyldreyer04@gmail.com",
        "time": "Fri Oct 16 09:36:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 22:06:29 2026 +0530"
      },
      "message": "Redact credentials from captured audit payloads (#19555)"
    },
    {
      "commit": "1ecbd5c99db783075b04aa365f5a302fa11b3691",
      "tree": "06d1bc5619e4ffecee75d9fc4681661d15958e3b",
      "parents": [
        "b38d073146aefe1e72f2966608503a453bd6bf4e"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Fri Oct 16 09:28:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 21:58:14 2026 +0530"
      },
      "message": "Fail op chains of terminated MSE queries instead of dropping them (#19854)"
    },
    {
      "commit": "b38d073146aefe1e72f2966608503a453bd6bf4e",
      "tree": "50dab70fa90f4afc94ebce835807edfcc0dd4f5b",
      "parents": [
        "ba3ddac25469ebf16fe56656b979979666e3866a"
      ],
      "author": {
        "name": "Akshay Upadhyay",
        "email": "75607973+AkshayUpadhyay2411@users.noreply.github.com",
        "time": "Fri Oct 16 21:43:51 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 09:13:51 2026 -0700"
      },
      "message": "Fix duplicate upsert rows after restart when a snapshot is missed with metadataTTL (#19832)"
    },
    {
      "commit": "ba3ddac25469ebf16fe56656b979979666e3866a",
      "tree": "0b0aea13256605db0791308679014d28585f878f",
      "parents": [
        "cf462e0254b1a06b9ea99c554dfbd7ae8ced235e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 16 08:08:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 08:08:35 2026 -0700"
      },
      "message": "Bump software.amazon.awssdk:bom from 2.55.14 to 2.55.15 (#19902)\n\nBumps software.amazon.awssdk:bom from 2.55.14 to 2.55.15.\n\n---\nupdated-dependencies:\n- dependency-name: software.amazon.awssdk:bom\n  dependency-version: 2.55.15\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "cf462e0254b1a06b9ea99c554dfbd7ae8ced235e",
      "tree": "16ab129655aa13f090cecf6389c1d82bec8f57e3",
      "parents": [
        "b543d4d6b8979393433ea9c576ecdab9f9ada437"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 16 05:39:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 05:39:02 2026 -0700"
      },
      "message": "Bump com.azure:azure-sdk-bom from 1.3.7 to 1.3.9 (#19903)\n\nBumps [com.azure:azure-sdk-bom](https://github.com/azure/azure-sdk-for-java) from 1.3.7 to 1.3.9.\n- [Release notes](https://github.com/azure/azure-sdk-for-java/releases)\n- [Commits](https://github.com/azure/azure-sdk-for-java/compare/azure-identity_1.3.7...azure-digitaltwins-core_1.3.9)\n\n---\nupdated-dependencies:\n- dependency-name: com.azure:azure-sdk-bom\n  dependency-version: 1.3.9\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b543d4d6b8979393433ea9c576ecdab9f9ada437",
      "tree": "fe8c6771067f958b2ec1bd0f79f1b4f041ed89a5",
      "parents": [
        "65175a46323ce56ca62171827630435feda7e40e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Oct 16 05:38:52 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 05:38:52 2026 -0700"
      },
      "message": "Bump org.webjars:swagger-ui from 5.33.1 to 5.33.2 (#19904)\n\nBumps [org.webjars:swagger-ui](https://github.com/swagger-api/swagger-ui) from 5.33.1 to 5.33.2.\n- [Release notes](https://github.com/swagger-api/swagger-ui/releases)\n- [Commits](https://github.com/swagger-api/swagger-ui/compare/v5.33.1...v5.33.2)\n\n---\nupdated-dependencies:\n- dependency-name: org.webjars:swagger-ui\n  dependency-version: 5.33.2\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "65175a46323ce56ca62171827630435feda7e40e",
      "tree": "183456c66363ff1ccf85c2977b59df86d5ddcd97",
      "parents": [
        "faa74c301783366f53fd1f29fc173c7310e4863d"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Fri Oct 16 13:55:08 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 13:55:08 2026 +0200"
      },
      "message": "Document candidate list sharing invariants and test them for upsert tables (#19878)\n\nFollow-up to #19785, part of #19782."
    },
    {
      "commit": "faa74c301783366f53fd1f29fc173c7310e4863d",
      "tree": "10c1d9c6ad8e1db903ad8f71a1f86ba7fb6bae8a",
      "parents": [
        "fbc34d7e7b28e7bb2ff72a35fb178e945c0ba3ac"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Fri Oct 16 13:14:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 13:14:11 2026 +0200"
      },
      "message": "Fail fast on EXPR_MIN/EXPR_MAX queries that the servers cannot execute (#19883)\n\n- InstanceRequestHandler: when building the ServerQueryRequest fails after Thrift\n  deserialization succeeded, send an error response with the known request id instead\n  of no response. The broker no longer waits for the timeout and reports 427.\n- BaseSingleStageBrokerRequestHandler#validateRequest: reject EXPR_MIN/EXPR_MAX with\n  QUERY_VALIDATION when ExprMinMaxRewriter is not enabled, when the call has an alias,\n  is nested or is outside the select list, or when ParentAggregationResultRewriter is\n  not enabled. The message names the missing rewriter and its config key.\n- Compile failures on the server now count in QUERY_EXECUTION_EXCEPTIONS instead of\n  REQUEST_DESERIALIZATION_EXCEPTIONS."
    },
    {
      "commit": "fbc34d7e7b28e7bb2ff72a35fb178e945c0ba3ac",
      "tree": "49929c3bfdb1f5c526557ac595e7c7d7315c3665",
      "parents": [
        "8705c08339413a43bf2e13b925e06a0c5833c59c"
      ],
      "author": {
        "name": "Dylan Dreyer",
        "email": "dyldreyer04@gmail.com",
        "time": "Thu Oct 15 21:27:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 21:27:20 2026 -0700"
      },
      "message": "Mask more credential keys in Obfuscator\u0027s defaults (#19884)\n\n---------\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "8705c08339413a43bf2e13b925e06a0c5833c59c",
      "tree": "f55e1f17340c3f0f66d033ba1ea9fc6c3ae74609",
      "parents": [
        "46da5d2f908e7b06ead88d25ae60fbc2640e0f6e"
      ],
      "author": {
        "name": "Dylan Dreyer",
        "email": "dyldreyer04@gmail.com",
        "time": "Thu Oct 15 18:59:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 18:59:43 2026 -0700"
      },
      "message": "Mask credential query parameters in the controller request log (#19899)\n\nCo-authored-by: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "46da5d2f908e7b06ead88d25ae60fbc2640e0f6e",
      "tree": "3b83a2d26377999042e85bac8d60f9243b5cf86b",
      "parents": [
        "3101abc90f74f279a6e77e4c1370e203fe7b4b16"
      ],
      "author": {
        "name": "RajaVinoth96",
        "email": "60264979+RajaVinoth96@users.noreply.github.com",
        "time": "Fri Oct 16 05:49:05 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 17:19:05 2026 -0700"
      },
      "message": "Fix bytes pk for dim tables (#19501)"
    },
    {
      "commit": "3101abc90f74f279a6e77e4c1370e203fe7b4b16",
      "tree": "16b0b91265c62e51dbbfa1f77adae32c92c93223",
      "parents": [
        "51496aebf94451e09cf58cc4e4b46863ccc12585"
      ],
      "author": {
        "name": "Thota Shashank",
        "email": "thotashashank302@gmail.com",
        "time": "Fri Oct 16 03:59:57 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:29:57 2026 -0700"
      },
      "message": "Cache immutable and stable scalar calls on literal arguments in MSE (#19821)"
    },
    {
      "commit": "51496aebf94451e09cf58cc4e4b46863ccc12585",
      "tree": "20009283af075e3b858d63de4709a41d29c447b8",
      "parents": [
        "95c071c0b95d0ca2a7f725d961a4095193d1e709"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 14:55:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:25:12 2026 +0530"
      },
      "message": "Fix planning of lookup joins over an intermediate stage (#19874)"
    },
    {
      "commit": "95c071c0b95d0ca2a7f725d961a4095193d1e709",
      "tree": "6569f694e0040d3387dd118a64c049ab43930259",
      "parents": [
        "6a04f038e23955c462825bf8dc63f138c7a03e23"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 14:45:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:15:16 2026 +0530"
      },
      "message": "Fix MSE constant folding of year-month INTERVAL arithmetic (#19788)"
    },
    {
      "commit": "6a04f038e23955c462825bf8dc63f138c7a03e23",
      "tree": "fffd436a1cd925f58d2e16750daa69c34a788065",
      "parents": [
        "b8a6f6b12f0f77d14d7f9e53ac8848a8aa751822"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 14:44:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 03:14:02 2026 +0530"
      },
      "message": "Fail a test when a plan node field escapes the spool equivalence check (#19414)"
    },
    {
      "commit": "b8a6f6b12f0f77d14d7f9e53ac8848a8aa751822",
      "tree": "ab904461bc8adfc7b578b2f63f1b966d21d3970d",
      "parents": [
        "bbcc0eb18fcb4f9283ede930b76143b54ca562d1"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Thu Oct 15 13:59:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:59:18 2026 -0700"
      },
      "message": "Upgrade async-http-client to 3.0.14 to address security vulnerabilities (#19889)"
    },
    {
      "commit": "bbcc0eb18fcb4f9283ede930b76143b54ca562d1",
      "tree": "061baa0fad102e5fe806ea79bfdaf3b938a3ad66",
      "parents": [
        "88902bcf57172a018662a94f141336adfee3644c"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Thu Oct 15 13:51:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:51:35 2026 -0700"
      },
      "message": "Restore full multi-node offline integration coverage (#19856)"
    },
    {
      "commit": "88902bcf57172a018662a94f141336adfee3644c",
      "tree": "9026beff0a30ebd7a65a2d9d324027f3f04d2c95",
      "parents": [
        "236401b2dc0f64cf5ce700920769751479691511"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 13:50:36 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 02:20:36 2026 +0530"
      },
      "message": "Compare numbers of different types by value in isDistinctFrom (#19791)"
    },
    {
      "commit": "236401b2dc0f64cf5ce700920769751479691511",
      "tree": "08970ad4cba24e0badd1d05579c88bde2af53c69",
      "parents": [
        "49ce7be17983a16154fc639e45821256413e736d"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 13:09:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 01:39:11 2026 +0530"
      },
      "message": "Add totalMemAllocatedBytes to multi-stage query responses (#19816)"
    },
    {
      "commit": "49ce7be17983a16154fc639e45821256413e736d",
      "tree": "1943ecaec0f1cab936646bee9034f23eb81ced0c",
      "parents": [
        "c15ceadb2d1e56712686e8124178f7831cb83ac4"
      ],
      "author": {
        "name": "Yash Mayya",
        "email": "yash.mayya@gmail.com",
        "time": "Thu Oct 15 12:00:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 16 00:30:45 2026 +0530"
      },
      "message": "Support IN_SUBQUERY in the multi-stage engine and run IdSet subqueries first (#19804)"
    },
    {
      "commit": "c15ceadb2d1e56712686e8124178f7831cb83ac4",
      "tree": "59ecc425c2486229c76c787c83f47a199278610f",
      "parents": [
        "7a07c617c95870a3ea6a66a31684f2d07b2eef35"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 15:56:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:56:17 2026 +0200"
      },
      "message": "Merge and serialize large intermediate results without full-size copies (#19806)\n\n* Merge and serialize large intermediate results without full-size copies\n\nExact PERCENTILE keeps every value in a DoubleArrayList. For large groups the\nlist, its serialized byte array and its deserialized copy are each G1 humongous\nobjects. Two of those copies exist only to move bytes between buffers.\n\nMerge: add AggregationFunction#mergeSerializedIntermediateResult and\nAggregationFunctionUtils#mergeSerialized. The default deserializes and calls\nmerge(). PercentileAggregationFunction overrides it to read the doubles from\nthe CustomObject buffer straight into the merged list, with the same growth\nas addAll(). MultistageAggregationExecutor and MultistageGroupByExecutor merge\nOBJECT columns of serialized blocks through it, instead of deserializing the\nwhole column into an Object[] first. Row heap blocks and the\nleafReturnFinalResult path are unchanged.\n\nSerialize: SerializedIntermediateResult gains getSize() and\nwriteTo(DataOutput), backed by the byte array by default. DataBlockBuilder and\nBaseDataTableBuilder write through them. PercentileAggregationFunction returns\na subclass that writes the count and the doubles straight into the\ndestination stream, so the builders no longer need the full-size byte array.\ngetBytes() still materializes it for other callers. The wire format is\nunchanged.\n\nMeasured on a list of 2^20 doubles (8 MB payload), as thread-allocated bytes:\nbuilding a data block drops from 16.9 MB to 8.5 MB (the paged output only),\nand merging into a list with room drops from 8.4 MB to about 0.\n\n* Write and read primitive arrays in bulk for intermediate results\n\nPinotOutputStream gains writeInts, writeLongs and writeDoubles for array\nranges. The default encodes chunks of at most 8 KB through big-endian typed\nByteBuffer views and writes each chunk with write(byte[], int, int).\nPagedPinotOutputStream overrides them to put the values straight into the\ncurrent page through the same views. A value that does not fit in the rest of\na page is written with writeInt/writeLong and split across the two pages:\npage offsets depend on everything written before, so this happens with any\npage size. The new PrimitiveArrayOutput helper picks the bulk path for a\nPinotOutputStream and the chunked path for any other DataOutput, such as the\nDataOutputStream behind data tables.\n\nDoubles are written as raw bits, the same bytes as ByteBuffer.putDouble and\nDOUBLE_ARRAY_LIST_SER_DE. DataOutput.writeDouble canonicalizes NaN, so the\nprevious per-value writeTo of PERCENTILE differed from the serializer for NaN\npayloads.\n\nPERCENTILE writeTo uses the bulk writes. Its mergeSerializedIntermediateResult\nreads the doubles with one DoubleBuffer.get into the merged list.\nINT/LONG/FLOAT/DOUBLE_ARRAY_LIST_SER_DE.deserialize(ByteBuffer) read with one\ntyped-view get instead of a getX() loop, and advance the position exactly as\nthe loop did. They now reject a count larger than the remaining bytes before\nallocating the array.\n\nJMH on JDK 25 (Apple M4 Pro, 3 forks x 5 iterations, 2^20 values):\n- Write doubles to PagedPinotOutputStream: 699 ops/s per value, 2,293 ops/s\n  bulk (3.3x). For ints: 385 vs 4,468 ops/s (11.6x).\n- Write doubles to DataOutputStream: 214 ops/s per value, 2,140 ops/s chunked\n  (10x).\n- Deserialize doubles from a heap buffer: 1,935 ops/s per value, 6,416 ops/s\n  bulk (3.3x). For ints: 1,924 vs 12,821 ops/s (6.7x).\nAllocation per operation is unchanged apart from the 8 KB chunk scratch.\n\n* Read and write short primitive lists one value at a time\n\nThe bulk paths for primitive list intermediate results copy through\nbig-endian typed views (asDoubleBuffer().get/put and the like). On a\nlittle-endian CPU, that copy swaps the bytes in Unsafe.copySwapMemory0,\na native call with a fixed cost of about 10-40 ns. A single-value\nByteBuffer access compiles to an inlined byte swap, so lists of a few\nvalues got 2-9x slower than the per-value loop they replaced. GROUP BY\nqueries with many groups produce many such lists.\n\nPrimitiveArrayOutput.MIN_BULK_VALUES (64) is the cutoff for the typed-view\npaths:\n- the IntArrayList, LongArrayList, FloatArrayList and DoubleArrayList\n  deserializers in ObjectSerDeUtils read shorter lists one value at a\n  time into the array they wrap;\n- PercentileAggregationFunction.mergeSerializedIntermediateResult reads\n  shorter lists one value at a time into the merged list;\n- PagedPinotOutputStream.writeInts/writeLongs/writeDoubles write one value\n  at a time when fewer values go to the current page.\n\nThe chunked writes to a plain DataOutput have a lower cutoff,\nMIN_CHUNKED_VALUES (16), because the scratch buffer costs more than the\nswap.\n\nThe tests cover lengths on both sides of each cutoff. The list\ndeserialize, array output and new PERCENTILE merge benchmarks run sizes\nfrom 1 value up.\n\n* Write short percentile lists in one call and snapshot kept serialized results\n\n- SerializedDoubleArrayList.writeTo writes lists shorter than PrimitiveArrayOutput.MIN_BULK_VALUES as one\n  getBytes() array, like master. A write per value is a synchronized call on a DataOutputStream, which made\n  data table writes of short lists 2-4.5x slower.\n- PagedPinotOutputStream.writeInts/writeLongs/writeDoubles put the values that fit in the current page with\n  absolute puts and update the page offset and the written size once, instead of one writeLong call per value.\n  A value that straddles two pages still goes through writeInt/writeLong.\n- GroupByUtils.serializeChunk takes a byte-array snapshot of each serialized result. The derive tasks read it\n  later, so a result that serializes the live intermediate result on demand would serialize it once per\n  grouping set. The SerializedIntermediateResult javadoc now says that a caller that keeps the object must take\n  a snapshot.\n\n* Write one-chunk percentile lists in one call only off PinotOutputStream\n\nSerializedDoubleArrayList.writeTo wrote getBytes() for every list below\nMIN_BULK_VALUES, so on the MSE path a short list never reached the\nper-value puts of PagedPinotOutputStream. On the SSE data table path,\nlists from 64 values up went through the chunked path, which saves no\nmemory while the list fits in one chunk and was slower than master.\nwriteTo now writes getBytes() only when the output is not a\nPinotOutputStream and the list fits in one PrimitiveArrayOutput.CHUNK_SIZE\nchunk. A PinotOutputStream gets the values straight into its pages at\nany size.\n\nmergeSerializedIntermediateResult never caps the target capacity below\nthe new size: the growth by half is capped at Integer.MAX_VALUE - 8, and\nthe new size, computed with Math.addExact, is the lower bound.\n\nSerializedIntermediateResult.getSize throws an IllegalStateException\nnaming the class when an on-demand subclass does not override it,\ninstead of a bare NullPointerException.\n\nPercentileIntermediateResultSerDeTest covers 1023, 1024 and 5000 values\nand also writes each list to a PagedPinotOutputStream with small pages.\n\n---------\n\nCo-authored-by: Gonzalo Ortiz \u003c1913993+gortiz@users.noreply.github.com\u003e"
    },
    {
      "commit": "7a07c617c95870a3ea6a66a31684f2d07b2eef35",
      "tree": "c04899c54263d1063db81039fd81755a51e1fef1",
      "parents": [
        "bc39c3c654464b02e9a1daa3092f12c00d0d98c2"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 15 06:08:44 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 06:08:44 2026 -0700"
      },
      "message": "Bump org.jline:jline from 4.4.7 to 4.4.8 (#19881)\n\nBumps [org.jline:jline](https://github.com/jline/jline3) from 4.4.7 to 4.4.8.\n- [Release notes](https://github.com/jline/jline3/releases)\n- [Commits](https://github.com/jline/jline3/compare/4.4.7...4.4.8)\n\n---\nupdated-dependencies:\n- dependency-name: org.jline:jline\n  dependency-version: 4.4.8\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "bc39c3c654464b02e9a1daa3092f12c00d0d98c2",
      "tree": "c9df6d17072070955431b810cc9bab400603957e",
      "parents": [
        "19fdcc0b9da15c9ea35217b1f6807d9edb226b23"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Oct 15 06:08:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 06:08:12 2026 -0700"
      },
      "message": "Bump org.codehaus.mojo:versions-maven-plugin from 2.22.0 to 2.23.0 (#19882)\n\nBumps [org.codehaus.mojo:versions-maven-plugin](https://github.com/mojohaus/versions) from 2.22.0 to 2.23.0.\n- [Release notes](https://github.com/mojohaus/versions/releases)\n- [Changelog](https://github.com/mojohaus/versions/blob/master/ReleaseNotes.md)\n- [Commits](https://github.com/mojohaus/versions/compare/2.22.0...2.23.0)\n\n---\nupdated-dependencies:\n- dependency-name: org.codehaus.mojo:versions-maven-plugin\n  dependency-version: 2.23.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "19fdcc0b9da15c9ea35217b1f6807d9edb226b23",
      "tree": "46821f699af0b08de12d09c1fd232b7358536e47",
      "parents": [
        "9c5bd72a456c832c5084050e675f423326890397"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 15:05:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 15:05:32 2026 +0200"
      },
      "message": "Support generateArray in the multi-stage engine (#19552)"
    },
    {
      "commit": "9c5bd72a456c832c5084050e675f423326890397",
      "tree": "5d55f023f2546121b3372a6d3aa60e6942ba086f",
      "parents": [
        "823229d0c314e6805cee2ea0836d28843e6da3b4"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 12:21:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 12:21:11 2026 +0200"
      },
      "message": "Return promptly from SSE combine operators when the query is terminated (#19867)\n\n* Return promptly from SSE combine operators when the query is terminated\n\nWhen a single-stage query is terminated (for example, killed by the\nresource accountant), the combine operator kept waiting until the query\ndeadline and kept the merged results (such as the IndexedTable) reachable.\nKilling the most expensive query did not free its memory.\n\nTwo facts caused the wait:\n- The main query thread is not registered for cancellation, so\n  QueryExecutionContext.terminate() does not wake it. The waits on\n  _operatorLatch.await() and _blockingQueue.poll() did not check the\n  terminate exception.\n- A worker task cancelled while still queued never runs, so its finally\n  block in BaseCombineOperator.startProcess() never counts down the latch\n  or offers a block.\n\nAdd pollResultsBlock() and awaitLatch() to BaseCombineOperator. They wait\nin 100 ms slices and throw the TerminationException as soon as\nQueryThreadContext.getTerminateException() is set. The existing exception\nhandling turns it into the termination error block. Use them in every\ncombine operator that waits for worker results, including the streaming\nones. The timeout behavior at the deadline does not change.\n\nAdd CombineTerminationTest, which saturates the worker pool, terminates\nthe query, and checks that the combine operator returns\nQUERY_CANCELLATION promptly.\n\n* Make CombineTerminationTest terminate only after the combine thread waits\n\nWait until the combine thread is in TIMED_WAITING before calling\nterminate(), so that the wait loop in pollResultsBlock()/awaitLatch()\nmust observe the termination. Before, terminate() could run while the\nmain thread was still in startProcess(), and the termination check\nbefore the wait was enough to pass. Without the fix, all seven cases\nnow fail, including the streaming one.\n\n---------\n\nCo-authored-by: Gonzalo Ortiz \u003c1913993+gortiz@users.noreply.github.com\u003e"
    },
    {
      "commit": "823229d0c314e6805cee2ea0836d28843e6da3b4",
      "tree": "4f5b1969b0215378c9068fa7dc45bd275c1ebbfd",
      "parents": [
        "c6f3f791f5fe4c7de10c074b2509870bec33cd86"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 12:11:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 12:11:54 2026 +0200"
      },
      "message": "Add a compact reader for table ideal states and external views in the broker (#19786)\n\nPart of #19782."
    },
    {
      "commit": "c6f3f791f5fe4c7de10c074b2509870bec33cd86",
      "tree": "40d8695502a74b53c79d84168535f361920c4e98",
      "parents": [
        "ba49142265f93e4eef17c42c6dc262ab9c9e9f5b"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 11:44:21 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 11:44:21 2026 +0200"
      },
      "message": "Check HardLimitExecutor limit only once, on submit (#19864)\n\n* Check HardLimitExecutor limit only once, on submit\n\nHardLimitExecutor.decorate checked the limit twice: synchronously on submit\nand again inside the wrapper right before the task ran. The second check\ncould reject a task that had passed the first one when another task started\nin between. The wrapper then threw before the task ran. For\nOpChainSchedulerService this meant the ListenableFutureTask never ran, its\ncompletion callback never fired, the opchain was never closed, the\nper-request active counter never reached zero, and the downstream receiver\nwaited until the query timed out. The exception was captured by the\nFutureTask that AbstractExecutorService.submit creates and nobody read it, so\nnothing was logged.\n\nKeep the synchronous check as the only rejection point. The wrapper now only\nincrements and decrements the running counter. The counter can exceed the\nlimit by the number of tasks accepted but not yet started, which is\nnegligible on a cached pool.\n\nAdd a regression test in pinot-spi with a deferred executor that controls\nwhen each task starts, and one in pinot-query-runtime that drives\nOpChainSchedulerService through the same race and asserts both opchains run,\nclose, and release the request.\n\n* Clarify HardLimitExecutor overshoot bound for fixed thread pools\n\nThe HardLimitExecutor Javadoc claimed the counter overshoot is negligible\non a cached pool. That holds only when accepted tasks start promptly. On a\nfixed pool, accepted tasks wait in the queue, so the overshoot can be as\nlarge as the queue backlog. Reword the Javadoc to state this bound.\n\n---------\n\nCo-authored-by: Gonzalo Ortiz \u003c1913993+gortiz@users.noreply.github.com\u003e"
    },
    {
      "commit": "ba49142265f93e4eef17c42c6dc262ab9c9e9f5b",
      "tree": "9b10a8a89b5ce5b0291788c36700206957fa8a13",
      "parents": [
        "129fa937f34492c07b734dcd51d9a9b57f718e44"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 10:20:09 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:20:09 2026 +0200"
      },
      "message": "Share instance selector candidate lists between segments with equal assignments (#19785)\n\nPart of #19782."
    },
    {
      "commit": "129fa937f34492c07b734dcd51d9a9b57f718e44",
      "tree": "551fa114a75e05c8b034bd063f1013a56a02c927",
      "parents": [
        "ebbc9f46c056e82fd7be74c798e401a17dda5240"
      ],
      "author": {
        "name": "Gonzalo Ortiz Jaureguizar",
        "email": "gortiz@users.noreply.github.com",
        "time": "Thu Oct 15 10:20:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 10:20:03 2026 +0200"
      },
      "message": "Make broker routing components update incrementally on assignment changes (#19783)\n\nPart of #19782."
    },
    {
      "commit": "ebbc9f46c056e82fd7be74c798e401a17dda5240",
      "tree": "af3e212e8ade70dfa3638c9e3cf4b0c43a7aeaec",
      "parents": [
        "bf956b3c204680f98982fb7e70733d19594411a5"
      ],
      "author": {
        "name": "Suvodeep Pyne",
        "email": "suvodeep-pyne@users.noreply.github.com",
        "time": "Thu Oct 15 00:39:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 15 13:09:24 2026 +0530"
      },
      "message": "Make pauseless re-ingestion consumption timeout configurable (#19737)\n\n* Make pauseless re-ingestion consumption timeout configurable\n\nThe server\u0027s ReingestionResource waited a hard-coded 30 minutes for\nre-ingestion consumption to reach the segment end offset. A segment that\ncannot be consumed within that window (e.g. ~140M rows at ~49k rows/s)\ncan never be repaired, because every retry restarts from the start offset.\n\nAdd pinot.server.reingestion.consumption.timeoutMs (default 30 minutes,\nunchanged). It is resolved when each re-ingestion request is accepted:\nthe Helix cluster config (picked up live, no restart needed) takes\nprecedence over the server config, which takes precedence over the\ndefault. Non-numeric or non-positive values are ignored with a warning.\n\nBind the server\u0027s cluster config change handler into the admin API as a\nPinotClusterConfigProvider so the resource can read live cluster configs,\nand saturate the wait deadline so a large timeout cannot overflow.\n\n* Check re-ingestion completion at the deadline before timing out\n\nwaitForCondition slept a fixed check interval (5s) and only re-checked\nthe condition while the deadline had not passed. With a timeout shorter\nthan the interval, or completion within the last interval, consumption\nthat had finished was still reported as a timeout and the segment was\nnever built or uploaded.\n\nCap each sleep at the remaining time and check the condition once more\nat the deadline before timing out.\n\n* Apply re-ingestion timeout through a cluster config listener and make ReingestionResource a singleton\n\nAddresses review feedback on the configurable re-ingestion consumption timeout:\n- Resolve the timeout in ReingestionConsumptionTimeout, a PinotClusterConfigChangeListener registered in\n  BaseServerStarter and bound into the admin API, instead of reading the raw cluster config map and the server config\n  on every request. Values are validated, and invalid ones warned about, once per config change. The timeout is read\n  when a job starts consuming.\n- Make ReingestionResource a singleton. It was created per request, so duplicate requests were never rejected, the jobs\n  listing was always empty, MAX_PARALLEL_REINGESTIONS never applied and every request leaked a thread pool.\n- Report an interrupted wait as an interrupt. The interrupt flag is not restored, so that closing the segment writer\n  afterward still waits for its consumer thread before destroying the segment.\n- Drop the always-zero grace period from waitForCondition and take a BooleanSupplier.\n- Document that only the exact key is applied without a restart, the fallback for a removed or invalid cluster config,\n  and why the cluster config takes precedence.\n- Split the tests into plain unit tests for the timeout and the wait loop, and endpoint tests for the dependency\n  injection and the singleton behavior.\n\n* Stop re-ingestion jobs on shutdown, list queued jobs and clarify wait messages\n\nAddresses the second round of review feedback:\n- Shut down the re-ingestion executor when the admin API stops (@PreDestroy), interrupting running jobs and logging\n  dropped queued ones. Its threads are now daemon threads, and a submit rejected during shutdown returns 503 and\n  clears the in-progress tracking.\n- Make StatelessRealtimeSegmentWriter.stopConsumption() wait for the consumer thread even when the caller is\n  interrupted, so that close() never destroys the mutable segment while the consumer thread is still indexing.\n- Track a re-ingestion job before submitting it, so that GET /reingestSegment/jobs also lists jobs waiting for a\n  re-ingestion thread.\n- Name the segment being consumed in the wait messages, and include the timeout in the timeout message.\n- Log the previous and new timeout on a cluster config change, and only when it changes.\n- Widen the timeout of the wait test that checks completion at the deadline to 4s, so that a pause on a loaded host\n  cannot make it fail spuriously.\n- Move the endpoint tests to the resources package, give each test its own segment names, and add tests for the\n  queued job listing and the shutdown.\n\n* Stop re-ingestion consumption at the next batch even if the stream ignores interrupts\n\nstopConsumption() now waits for the consumer thread uninterruptibly, but the consumer loop only ended on an\ninterrupt if the stream plugin threw on it. With a plugin that swallows the interrupt or retries internally, the\nconsumer kept consuming to the end offset, so close() and the re-ingestion shutdown could block until then.\n\nstopConsumption() now also sets a stop flag that the consumer loop checks before each fetch, so consumption ends at\nthe next batch (bounded by the fetch timeout) regardless of how the plugin handles interrupts. A stopped consumption\nis not successful and records a cause naming the stop; getConsumptionException() is marked @Nullable.\n\nAdds the first StatelessRealtimeSegmentWriter unit test: it stops consumption from a stream that never reaches the end\noffset and ignores interrupts, which hung before this change."
    },
    {
      "commit": "bf956b3c204680f98982fb7e70733d19594411a5",
      "tree": "9aa3a10c52421506a72235032d59f36e2a2a25e5",
      "parents": [
        "d30197594d6e2638f1cfcd69ef6bcd17942142cb"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Wed Oct 14 17:59:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:59:00 2026 -0700"
      },
      "message": "Collect remote access stats per execution and add direct remote access stats (#19859)"
    },
    {
      "commit": "d30197594d6e2638f1cfcd69ef6bcd17942142cb",
      "tree": "e2427f2a31e280c7557f64198cc292ba11e1f7c1",
      "parents": [
        "76e8f2d4aa6694de4a3dc27919c31a266f935d05"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Wed Oct 14 17:58:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:58:01 2026 -0700"
      },
      "message": "Support SQL DELETE statements as DML with a pluggable executor (#19664)\n\n* Support SQL DELETE statements as DML with a pluggable executor\n\nA Calcite SqlDelete fell through to the DQL branch of CalciteSqlParser, so a DELETE was compiled as a query and failed\nwith a confusing cast error in the query engines. Parse it as DML, validate and authorize it on the broker and the\ncontroller, and hand it to a pluggable SQL executor. Pinot does not delete rows itself: the default executor answers\nthat DELETE is not supported, and deployments that can delete rows, e.g. by purging them from the segments with a\nminion task, plug in their own.\n\nParsing:\n- CalciteSqlParser classifies every Calcite DML kind as DML. The SQL executor answers the other kinds the grammar\n  parses (UPDATE, MERGE, CALL) with a clear \"Unsupported DML SqlKind\" error, instead of the query engines failing to\n  compile them. EXPLAIN of a DML statement is rejected at parse time.\n- New DeleteStatement, returned by DataManipulationStatementParser for DELETE:\n  - The table name is [database.]table. More or empty name parts, a table alias, table hints and EXTEND are rejected.\n  - The WHERE clause is serialized back into Pinot SQL and must compile into the same expression as the statement, so\n    that the executor gets a predicate that selects the same rows. Identifiers named like SQL functions without\n    arguments (user, pi, current_date), which Calcite unparses as keywords, are quoted to keep their name.\n  - A DELETE without a WHERE clause, with a subquery, or with a function that reads another table (lookUp,\n    IN_SUBQUERY, inPartitionedSubquery) is rejected.\n  - Every option but the database reaches the executor as written, so that an option it relies on (e.g. a dry run)\n    cannot be reclassified as a query option and silently dropped. Another spelling of `database` is rejected.\n  - resolveTableName qualifies the table with the database of the request (the database header, else the database\n    option; conflicts fail with QUERY_VALIDATION) and resolves it to its defined case with the table cache. It rejects\n    logical tables, whose physical tables are not authorized.\n- DataManipulationStatementParser.parse reports failures as SQL_PARSING QueryExceptions.\n- A DML statement fails instead of silently dropping its options when the request sets sqlOptionsMode\u003dIGNORE or the\n  broker ignores the legacy OPTION(...) syntax, since its options configure it.\n\nAuthorization, before the executor runs:\n- Broker, POST /query/sql and /query:\n  - The first-step access control runs before the table is looked up.\n  - Then table access, the Query and DeleteRows actions, and no row-level security filter on the table.\n  - Last, the new AccessControl.authorizeDeleteRows, which denies by default: the fine-grained checks allow every\n    action by default, so they cannot tell an access control written before DELETE existed from one that allows it.\n  - AllowAllAccessControlFactory allows it. Config-file basic auth allows principals that have the table, under its\n    raw name too, and an explicitly granted DELETE permission. ZooKeeper basic auth denies it.\n  - A denied DELETE gets HTTP 403, like a denied query.\n- Controller, POST /sql: the READ and DELETE access types and the Query and new DeleteRows (Actions.Table.DELETE_ROWS)\n  actions on the raw table name, checked before the response streams. A denied DELETE gets ACCESS_DENIED.\n- GET endpoints reject DML: the controller GET /sql now does too, as the broker GET /query/sql already did, since a\n  GET must not modify data.\n- BrokerRequestHandlerDelegate rejects a statement that is not DQL, for the gRPC endpoint and custom containers.\n- BrokerAdminApiApplication binds the broker TableCache for the query endpoint.\n\nExecution:\n- SqlQueryExecutor.executeStatement executes a parsed statement and refuses an unresolved DELETE.\n- executeDMLStatement refuses any DELETE with ACCESS_DENIED, since it cannot authorize the caller.\n- The new protected executeDelete answers \"not supported\" by default; executors that implement row deletion override\n  it.\n- The new protected getControllerBaseUrl exposes the controller the executor sends DML to.\n- BaseBrokerStarter and BaseControllerStarter create the executor with a new protected createSqlQueryExecutor().\n\n* Honor table RLS when deleting typed tables\n\nA DELETE against a typed table could miss filters configured on its raw name. Check both names before execution and keep denial before filter lookup.\n\n* Simplify SQL DELETE handling\n\nKeep INSERT behavior, the broker constructor, and focused authorization coverage. Reproduce the previous issue by sending DELETE through a direct handler or using the old constructor.\n\n* Address review comments on SQL DELETE\n\nAuthorization:\n- ZooKeeper basic auth on the broker grants DELETE to users with the explicit DELETE permission, like the\n  file-based basic auth; file-based basic auth only applies excludeTables, not the tables inclusion list, to the\n  raw name, so a principal whose tables list a typed name can delete from it.\n- The broker consults row-level security on the table name as given first, and on the raw name only for a\n  caller authorized for it, and checks the table without a table after the first step so that an access control\n  that authenticates in its table check (ZooKeeper basic auth) rejects an unauthenticated caller before the\n  table is looked up. The controller checks the caller before parsing and resolving the statement.\n- Both roles fail a DELETE on a table the table cache does not know with TABLE_DOES_NOT_EXIST, after\n  authorizing the caller, and log the executed statement.\n\nParsing and execution:\n- groovy() is rejected in a DELETE predicate; the WHERE clause error no longer re-renders a node whose\n  rendering failed (AT TIME ZONE); compileToExpression(SqlNode) normalizes PostgreSQL casts like the String\n  overload; the unreachable catch in resolveTableName is gone.\n- DeleteStatement has the new ExecutionType.EXECUTOR, dispatched by SqlQueryExecutor.executeStatement, which\n  returns a QueryException thrown by executeDelete with its error code and any other exception as\n  QUERY_EXECUTION; the controller executes before streaming the response.\n- Controller GET /sql rejects every non-DQL statement, the multi-stage engine gate only applies to queries,\n  the controller registers the query option config listener, and its SqlQueryExecutor is created once the\n  task manager and connection manager exist.\n\nTests and docs for each change; the unrelated pom and test-harness changes are dropped from this PR.\n\n* Adapt parser fixtures to the String-based parser helper\n\nRetain the cast normalization and rejection checks while using the helper introduced by the DELETE change.\n\n* Address the second review round on SQL DELETE\n\nPredicate guarantees:\n- A visitor over the parsed WHERE clause rejects what the compiled expression does not represent faithfully:\n  interval literals (quoted and unquoted), BETWEEN SYMMETRIC, LIKE ... ESCAPE, window functions, integer\n  literals outside the long range, decimal literals a double does not represent exactly and literals outside\n  the double range.\n- Function names are folded with the ROOT locale and non-ASCII names are rejected, so a dotless i cannot get\n  IN_SUBQUERY past the deny-list; EXPLAIN PLAN FOR DELETE is rejected at parse time.\n\nAuthorization and messages:\n- Logical tables are rejected after the caller is authorized, like unknown tables; every error names the\n  table as the caller wrote it, and the broker only echoes the access control\u0027s reason when it does not\n  mention the table, so a denial reads the same for an existing and a non-existing table.\n- An access control that only implements the broker-request check denies a DELETE with 403 instead of 500.\n- The database option alone is rejected for an unqualified table name, since the single-stage engine resolves\n  a query from the database header only.\n\nOptions and logging:\n- sqlOptionsMode\u003dIGNORE and the legacy OPTION(...) ignore mode fail every DML statement that carries options,\n  INSERT included; the controller applies the legacy syntax mode only, and validateMultiStageQuery reports a\n  query that does not parse instead of failing the request.\n- The DELETE log lines apply the query log\u0027s SQL redaction on the broker (with a fingerprint in literal\n  values mode), keep every caller-controlled value on a single line, log the client only when client IP\n  logging is on, and SqlQueryExecutor logs the exception of a failed executeDelete.\n\n* Address the third review round on SQL DELETE\n\nPredicate guarantees:\n- The function-call spelling of LIKE ... ESCAPE (like(col, pattern, escape, ...)) is rejected like the\n  operator form; the verified expression is kept and exposed through getPredicateExpression(); rejection\n  messages render the WHERE clause with its literals masked and never echo a numeric value.\n\nAuthorization and messages:\n- The basic-auth excludeTables list also applies to type-suffixed names on the query path, and both broker\n  basic-auth factories share one authorizeDeleteRows implementation.\n- The controller also checks the fine-grained rules keyed on the typed table name, and documents that it\n  applies no row-level security, so a deployment relying on the brokers\u0027 row-level security must not install\n  a deleting executor there.\n- The broker\u0027s cursor endpoint rejects non-DQL statements; a denial reason is only dropped when it names the\n  table as a whole word.\n\nLogging:\n- One LoggerUtils.toSingleLine serves the query log, the broker and the controller; the controller logs the\n  fingerprint of a DELETE (never its literals), the proxy-reported client and the socket address, logs DML\n  at DEBUG by kind only, and single-lines the messages it logs for failed requests.\n- SqlQueryExecutor reports a failed executeDelete through ExceptionUtils.consolidateExceptionMessages.\n\nTests and class Javadoc for each change; the cross-table and script function deny-lists point at the sites\nthat define those functions, and those sites point back.\n\n* Address the maintainer review on SQL DELETE\n\n- The controller no longer runs the cluster-wide access check before a DELETE: that overload denies every\n  table-scoped principal, so a principal allowed to delete rows from a table was denied on the controller\n  while a broker executed the statement. The first check that authenticates the caller is now the table-level\n  READ check on the resolved table, which leaks nothing since every table-dependent outcome comes after it.\n  Tests run the real controller basic auth with a table-scoped principal.\n- The IGNORE modes reject a DELETE carrying options only, as before the second review round: an INSERT keeps\n  its existing behavior, and legacy IGNORE mode is back to a single regex pass that materializes nothing on\n  the common no-suffix path.\n- BasicAuthPrincipal skips the raw-name exclusion lookup for principals without exclusions and for raw names.\n\n* Trim allocations on the DELETE paths\n\n- Legacy IGNORE mode strips the end-anchored OPTION(...) suffix with a substring and keeps only the match\n  offsets, materializing the option text solely when a DELETE is rejected.\n- The DELETE log lines are formatted (and the statement fingerprinted) only when INFO is enabled.\n- SqlQueryExecutor allocates the legacy response only in the branches that use it.\n- DeleteStatement freezes the options once at the parsing boundary and the resolved statement reuses the\n  immutable map."
    },
    {
      "commit": "76e8f2d4aa6694de4a3dc27919c31a266f935d05",
      "tree": "61e3386a2e519b1c51050999116237463a7d5f8b",
      "parents": [
        "b1da55bfdba58d62ac1c42e5f1eb07698c37a863"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 17:37:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 17:37:19 2026 -0700"
      },
      "message": "Bump org.xerial.snappy:snappy-java from 1.1.10.11 to 1.1.10.12 (#19868)\n\nBumps [org.xerial.snappy:snappy-java](https://github.com/xerial/snappy-java) from 1.1.10.11 to 1.1.10.12.\n- [Release notes](https://github.com/xerial/snappy-java/releases)\n- [Commits](https://github.com/xerial/snappy-java/compare/v1.1.10.11...v1.1.10.12)\n\n---\nupdated-dependencies:\n- dependency-name: org.xerial.snappy:snappy-java\n  dependency-version: 1.1.10.12\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b1da55bfdba58d62ac1c42e5f1eb07698c37a863",
      "tree": "2293d643c04cc669a3fe7acfadecfac586c7f614",
      "parents": [
        "33bd545a35a823b51e08c26e140536e7cf1a142e"
      ],
      "author": {
        "name": "Xiang Fu",
        "email": "xiangfu@apache.org",
        "time": "Wed Oct 14 16:35:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 16:35:47 2026 -0700"
      },
      "message": "Upgrade Reactor Netty security dependencies and preserve transport behavior (#19828)\n\n* Upgrade Reactor Netty and preserve transport lifecycle behavior\n\n* Use the supported Arrow allocator with Netty 4.2\n\n* Update Netty to 4.2.19 and clarify shutdown registration ordering\n\nUse the latest published 4.2 patch, format the TLS builder chain, and\nexplain why accepted channels are registered before checking shutdown.\nA pre-registration-only check could miss a concurrent shutdown sweep.\n\nReproduce the ordering race: initialize a channel before shutdown sets\nthe flag, then register it after the shutdown channel sweep. Keeping the\npost-registration check closes this late channel. No lifecycle change\nor new test/benchmark is needed.\n\n* Preserve shared Arrow memory limits with Netty 4.2\n\nReproduction: an Arrow response can exceed a 1 MiB direct-memory ceiling with the unsafe backend. Preserve caller limits while using the paired shared allocation factory; release partially allocated encoder vectors on failure.\n\n* Fix ZooKeeper hostname policy with JDK TLS bootstrap\n\nReproduction: ZooKeeper 3.9.6 with Netty 4.2.19 rejects a trusted mismatched peer even when zookeeper.ssl.hostnameVerification\u003dfalse. Preserve that bootstrap policy through the supported JDK supplier, retaining enabled verification and custom supplier ownership.\n\n* Consolidate ZooKeeper TLS bootstrap at client creation\n\n* Preserve ZooKeeper TLS bootstrap and cipher compatibility"
    },
    {
      "commit": "33bd545a35a823b51e08c26e140536e7cf1a142e",
      "tree": "050ad079e78fdc3ff097136f46571a42e4e7e2c9",
      "parents": [
        "f155d29de28ce1b768d994d008b67edd149d275c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 15:32:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 15:32:34 2026 -0700"
      },
      "message": "Bump immutables.version from 2.12.2 to 2.12.3 (#19870)\n\nBumps `immutables.version` from 2.12.2 to 2.12.3.\n\nUpdates `org.immutables:value-annotations` from 2.12.2 to 2.12.3\n- [Release notes](https://github.com/immutables/immutables/releases)\n- [Commits](https://github.com/immutables/immutables/compare/2.12.2...2.12.3)\n\nUpdates `org.immutables:value-processor` from 2.12.2 to 2.12.3\n- [Release notes](https://github.com/immutables/immutables/releases)\n- [Commits](https://github.com/immutables/immutables/compare/2.12.2...2.12.3)\n\n---\nupdated-dependencies:\n- dependency-name: org.immutables:value-annotations\n  dependency-version: 2.12.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n- dependency-name: org.immutables:value-processor\n  dependency-version: 2.12.3\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f155d29de28ce1b768d994d008b67edd149d275c",
      "tree": "db840203e265130d74c749203e458077dd2e226d",
      "parents": [
        "35b7293175a2b9c0bab0ec59923a11cdd17dc96b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 14 14:52:30 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 14:52:30 2026 -0700"
      },
      "message": "Bump com.github.luben:zstd-jni from 1.5.7-22 to 1.5.7-23 (#19869)\n\nBumps [com.github.luben:zstd-jni](https://github.com/luben/zstd-jni) from 1.5.7-22 to 1.5.7-23.\n- [Commits](https://github.com/luben/zstd-jni/compare/v1.5.7-22...v1.5.7-23)\n\n---\nupdated-dependencies:\n- dependency-name: com.github.luben:zstd-jni\n  dependency-version: 1.5.7-23\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "35b7293175a2b9c0bab0ec59923a11cdd17dc96b",
      "tree": "cd716a0d0a5228de03734e84a76d81e331c95aea",
      "parents": [
        "0d9d02e9e42792447c2a05a0f3089fe1844b500d"
      ],
      "author": {
        "name": "noy-solvin",
        "email": "noy@solvin.ai",
        "time": "Wed Oct 14 23:18:11 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 13:18:11 2026 -0700"
      },
      "message": "fix(core): prevent deadlock between segment refresh and reload by normalizing lock acquisition order (#19826)"
    },
    {
      "commit": "0d9d02e9e42792447c2a05a0f3089fe1844b500d",
      "tree": "2dc018964ba0a343ced65032086bcdb62e532e97",
      "parents": [
        "7896d13c19c10e02ec605fdb45c70d19f92511a7"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Wed Oct 14 13:16:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 13:16:38 2026 -0700"
      },
      "message": "Fix upsert compaction integration test race (#19857)"
    },
    {
      "commit": "7896d13c19c10e02ec605fdb45c70d19f92511a7",
      "tree": "35d2deb02fa8b9c4b9cbc9f143ef217878ceb776",
      "parents": [
        "b72a7b8ff44bad07612ef2033449eeba8b6d1b7d"
      ],
      "author": {
        "name": "RAGHVENDRA KUMAR YADAV",
        "email": "raghavmnnit@gmail.com",
        "time": "Wed Oct 14 10:36:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 14 10:36:34 2026 -0700"
      },
      "message": "Place tiered segments on the tier\u0027s assigned instance partitions (#19860)\n\nA tier whose instance partitions have been assigned and persisted gets\nthem honoured by the rebalancer, which fetches the record and lays the\ntable\u0027s segments out against it. Segment assignment did not: it always\nrecomputed a default placement over the tier\u0027s tagged instances.\n\nSo a table whose instanceAssignmentConfigMap configures a tier keeps the\nlayout it was rebalanced to only until the next segment is added. Every\nsegment added after that is placed by the default instead, against a\nrecord that says otherwise, and the layout drifts further from the\nassignment with each one. Nothing surfaces the divergence.\n\nFetch the tier\u0027s instance partitions first and fall back to the default\nplacement only when the tier has none, which is the same fetch-then-\ncompute order the non-tiered branch of the same caller already uses.\n\nCo-authored-by: Claude Opus 5 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "b72a7b8ff44bad07612ef2033449eeba8b6d1b7d",
      "tree": "abea371d6d1366fdbf096a5f473304378908f287",
      "parents": [
        "5d2ce2b76f7c12458b2f5adc8bdffe66e4563d0c"
      ],
      "author": {
        "name": "Xiaotian (Jackie) Jiang",
        "email": "17555551+Jackie-Jiang@users.noreply.github.com",
        "time": "Tue Oct 13 15:56:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 15:56:17 2026 -0700"
      },
      "message": "Fix flaky multi-cluster integration tests binding an ephemeral port (#19855)"
    }
  ],
  "next": "5d2ce2b76f7c12458b2f5adc8bdffe66e4563d0c"
}
