)]}'
{
  "log": [
    {
      "commit": "6786802fcb2d06c98e3bfbfcbfadd87d59e1cf20",
      "tree": "f06e9496f4f62b69f2cb402e247c2107833c6c6e",
      "parents": [
        "c667e360fcbe6a4a10338cf690e4792b7252d449"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 12:58:47 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Aug 14 22:36:29 2026 +0000"
      },
      "message": "KUDU-3788 download source archives by demand only\n\nPrior changelist [1] introduced fetching source archives by demand\nin pre-built mode (USE_PREBUILT_THIRDPARTY\u003d1).  Meanwhile, in legacy\n(i.e. non-pre-built mode), all of the source archives would still be\nunconditionally downloaded.  This changelist extends on-demand source\narchive fetching to the legacy mode as well.\n\nThe download-thirdparty.sh can still be used to fetch, extract, patch\nand configure the source code for all the 3rd-party components when run\nas a stand-alone script.  However, it\u0027s no longer invoked when running\nbuild-if-necessary.sh.\n\n[1] http://gerrit.cloudera.org:8080/24673 (git hash 1d9153c24)\n\nChange-Id: I51a1822070f6e37726e4efd53ba5e536c9eb8fb9\nReviewed-on: http://gerrit.cloudera.org:8080/24687\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "c667e360fcbe6a4a10338cf690e4792b7252d449",
      "tree": "5fcdf64c3f6013ddd0879dbefd8f095fb0e0605c",
      "parents": [
        "565fa2a0c8b8655dfe08c1dca95e4b4d9408fc9c"
      ],
      "author": {
        "name": "zhangyifan27",
        "email": "chinazhangyifan@163.com",
        "time": "Fri Jul 24 18:59:33 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Aug 13 23:00:02 2026 +0000"
      },
      "message": "[tools/master] make move of a leader replica recoverable\n\nMoving a replica (\u0027kudu tablet change_config move_replica\u0027 or \u0027kudu cluster\nrebalance\u0027) is client-driven: the source is marked \u0027replace\u0027 and, if it is\nthe leader, the client asks it to step down so it can be evicted (Raft can\u0027t\nevict a leader). If the client is interrupted (Ctrl+C, or an aborted/timed-out\nrebalance) after the config change but before the leader steps down, the\ntablet is left over-replicated with a stuck, un-evictable leader.\n\nAdd two recovery paths:\n\n* Master-side self-healing: once a leader marked \u0027replace\u0027 has its replacement\n  promoted to voter, ProcessTabletReport() schedules an\n  AsyncLeaderStepDownForReplacementTask to step it down so it can be evicted\n  (see ShouldStepDownLeaderForReplacement(); guarded by\n  --catalog_manager_step_down_leader_for_replacement, on by default, 3-4-3\n  only). Driven by tablet state, so it recovers an interrupted move_replica or\n  \u0027cluster rebalance\u0027 with no client involved.\n\n* CLI idempotency (move_replica): IsReplicaMoveScheduled() lets MoveReplica()\n  detect an already-scheduled move and wait for it, so re-running resumes\n  instead of failing on the over-replicated tablet.\n\nChange-Id: Ic7b28ca4e41355bd82c76d50e137f06197b402bc\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\nReviewed-on: http://gerrit.cloudera.org:8080/24630\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "565fa2a0c8b8655dfe08c1dca95e4b4d9408fc9c",
      "tree": "71258ad1814b61e293f1b75c61a04a8fb94f79db",
      "parents": [
        "cabd5fca7afdd414ab0b605bcd0acdc7bedc1832"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Wed Aug 12 14:07:55 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 12 19:42:21 2026 +0000"
      },
      "message": "remove std::move on optional\u003cMonoTime\u003e deadline\n\nMonoTime wraps a single int64_t, so std::move on the deadline\ndoes nothing beyond a plain copy. clang-tidy flags these sites\nin rebalancer_tool.cc as performance-move-const-arg; drop the\nstd::move.\n\nNo behavior change.\n\nChange-Id: I468f3cfd22de98d51c725dcecc15ed35e4cfe8ad\nReviewed-on: http://gerrit.cloudera.org:8080/24680\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "cabd5fca7afdd414ab0b605bcd0acdc7bedc1832",
      "tree": "1dfa06707af4ff8f76498c6ff20afdb8b32e40a5",
      "parents": [
        "70c51312f1186a8ae9f46647160b7730123f7601"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 15:24:24 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 12 14:32:33 2026 +0000"
      },
      "message": "KUDU-3788 fix working with zip source archives\n\n  * use \u003ccomponent\u003e_ARCHIVE variables instead of assuming the source\n    archive is always .tar.gz (so, now building rapidjson from source\n    is fixed after updates introduced with [1])\n  * use a robust incantation to call curl for fetching source archives,\n    so it no longer reports success if server returns non-success HTTP\n    codes (e.g., HTTP 404)\n  * reformat in the section of LLVM-related variables in vars.sh\n  * introduce necessary variables for libcxx and libcxxabi in vars.sh to\n    fix building libcxx and libcxxabi after updates introduced with [1]\n\nThis is a follow-up to [1].\n\n[1] http://gerrit.cloudera.org:8080/24673 (git hash 1d9153c24)\n\nChange-Id: I3cdf089c62e3d9f1b251605f75947fc98abf9812\nReviewed-on: http://gerrit.cloudera.org:8080/24677\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "70c51312f1186a8ae9f46647160b7730123f7601",
      "tree": "4ea96d0175846ca91848f37cf8c1c3219a31fe1a",
      "parents": [
        "bea38fae5e1a94f4a83acd90a398a50f4aff46f9"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Fri Jul 17 14:49:50 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 12 02:20:25 2026 +0000"
      },
      "message": "KUDU-3760 expose follower-move flag in rebalancer\n\nThe follower-move preference added for the auto-rebalancer changed the\ndefault of TwoDimensionalGreedyAlgo\u0027s constructor to prefer follower\nmoves. The CLI rebalance tool default-constructs that algorithm, so it\nstarted preferring follower moves silently, with no way to turn it off.\n\nAdd a --prefer_follower_replica_moves flag (default true, to match both\nthe auto-rebalancer\u0027s flag and the new constructor default)\nand plumb it through to the algorithm. This keeps the current behavior\nbut makes it explicit and overridable from the command line.\n\nAdds a parameterized test that runs the tool with the flag set both ways\nand checks the cluster still ends up balanced.\n\nChange-Id: I5f1b03da71b11af82f18ff9e20dcaa676b185645\nReviewed-on: http://gerrit.cloudera.org:8080/24613\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "bea38fae5e1a94f4a83acd90a398a50f4aff46f9",
      "tree": "4deb5f815b2ea032dc627ea6dcdb5d6bb46b5ceb",
      "parents": [
        "1d9153c248733781bf69132f2d094d9d3c92b2bc"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Thu Jul 16 14:26:15 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 12 02:04:57 2026 +0000"
      },
      "message": "KUDU-3789 Deflake auto_leader_rebalancer-test\n\nUnder TSAN this test suite was very flaky (about 488 of 1000 runs\nfailed at one baseline). The causes were all test-side timing\nassumptions on a cluster whose leadership keeps moving, not product\nbugs.\n\nFixed retry loops (run N rounds, then assert balanced) raced the\ncluster\u0027s ongoing leadership moves. Replaced them with a\nRunUntilLeaderBalanced() helper that retries CheckLeaderBalance() over\na TSAN-aware time budget via AssertEventually.\n\nAddTserver and RestartTserver used 59 tablets. That many raft groups\nmove leadership around through natural elections and keep the cluster\nfrom ever reaching an exactly balanced snapshot. Note that stopping\nthe replica rebalancer to remove that movement makes things worse: on\na static cluster the leader rebalancer gets stuck moving the same\nleaders back and forth and never balances, so the replica rebalancer\nis left running.\n\nPlacement-sensitive tests (MultiTableLeaderBalance,\nFilterSoftDeletedTableTest, TestMaintenanceMode) were disrupted by\nextra leader elections when TSAN CPU starvation exceeded the default\nleader failure timeout.\n\nRelaxed the ignored soft-deleted table check in\nFilterSoftDeletedTableTest to \"not fully balanced\" rather than requiring\nevery leader count to differ from 3, which natural elections could trip.\n\nRewrote TestMaintenanceMode to arrange the imbalance directly with\nMakeLeaderDistribution and assert the rebalancer never places a leader\non the maintenance-mode tserver, instead of restarting the tserver and\nracing on election timing.\n\nTest-only. No production behavior change.\n\nChange-Id: I00224fddfead0fb462e793f085d935b597792aaa\nReviewed-on: http://gerrit.cloudera.org:8080/24591\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "1d9153c248733781bf69132f2d094d9d3c92b2bc",
      "tree": "9c4927f0c3fd59a9b7ef1c1897dba2dcd23bedcf",
      "parents": [
        "12dab910780628d7c8d59e0ab03bf2fa661d310d"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Aug 07 22:16:05 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 19:50:35 2026 +0000"
      },
      "message": "KUDU-3788 do not unconditionally fetch all source archives\n\nWith this changelist, 3rd-party build no longer fetches unneeded source\narchives in pre-built mode (USE_PREBUILT_THIRDPARTY\u003d1): now the source\narchive for a component is fetched only when building the component\nfrom scratch.  For legacy non-pre-build mode, the behavior is left\nas before, i.e. all the source archives are fetched, extracted,\nand patched when running build-if-necessary.sh\n\nChange-Id: I1551fdc2e912f528a0111fcc1098bb608d3887fc\nReviewed-on: http://gerrit.cloudera.org:8080/24673\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "12dab910780628d7c8d59e0ab03bf2fa661d310d",
      "tree": "46eea3fbc35086d96ac47e6802a42856c236bbe3",
      "parents": [
        "10c369a98fdf0e66d7aa9ac3ccb50c5c035b7af0"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Sun Aug 09 21:22:35 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 17:49:21 2026 +0000"
      },
      "message": "KUDU-3788 add trace-viewer into prebuilt components\n\nThis is a follow-up to 30501ee9e33a2799d3eca6816405b4132d3e0d14.\n\nChange-Id: Icc7291be4b96366a8457ca69dc18bb2b6724cf5a\nReviewed-on: http://gerrit.cloudera.org:8080/24672\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "10c369a98fdf0e66d7aa9ac3ccb50c5c035b7af0",
      "tree": "5697b9cf6fbe5021d7897ead5bcb47e395734c48",
      "parents": [
        "5cc227930da1dc14079837121754c112a7558d72"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Aug 06 19:25:22 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 17:48:54 2026 +0000"
      },
      "message": "KUDU-3788 unify fetch_and_patch arguments\n\nThe motivation for this update is to refactor the scripts that fetch\nsource archives for all 3rd-party components.  A follow-up patch will\nupdate the logic to fetch source archives only when building the\n3rd-party components if USE_PREBUILT_THIRDPARTY\u003d1.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nChange-Id: Ia4bafb1a98ffee4839568135f66622f0ac495a95\nReviewed-on: http://gerrit.cloudera.org:8080/24668\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "5cc227930da1dc14079837121754c112a7558d72",
      "tree": "7cd63c31ef07651dcf9312c48d061d3d3bd34c09",
      "parents": [
        "4bcd631c449d3c6649730ca6e07660c8168f0d44"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Fri Aug 07 17:39:35 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 11 17:38:15 2026 +0000"
      },
      "message": "KUDU-3797: Show table-level on-disk size in human-readable format\n\nThis patch formats the table-level on-disk size with\nHumanReadableNumBytes::ToString() so it is consistent with the per-tablet\nrows. The on-disk-size limit is left as a raw value since it uses -1 to\ndenote \"unlimited\", and the row-count fields are counts rather than byte\nsizes. The client-side KuduTableStatistics::ToString() path (used when\n--show_tablets is not set) is intentionally left unchanged to preserve\nbackward compatibility.\n\nChange-Id: I13c025957afdc637a39a7fa7237ecb6d555ae719\nReviewed-on: http://gerrit.cloudera.org:8080/24669\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "4bcd631c449d3c6649730ca6e07660c8168f0d44",
      "tree": "286d0c55378d1a9207981e728e622b7434e20043",
      "parents": [
        "cb747ff0ca0209e3fa98be4167c67edd474acd67"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Tue Jun 30 19:49:05 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Sat Aug 08 16:22:57 2026 +0000"
      },
      "message": "KUDU-3362: expose per-tablet stats via table statistics\n\nAdd per-tablet statistics to the GetTableStatistics response and surface\nthem in kudu table statistics --show_tablets.\n\nDefault table-level output is unchanged when --show_tablets is not set.\n\nChange-Id: If7889669181633a762c614afe96a9ea0827ed7f1\nReviewed-on: http://gerrit.cloudera.org:8080/24650\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "cb747ff0ca0209e3fa98be4167c67edd474acd67",
      "tree": "33b8025d705f185675fb88db870d722c57e55b19",
      "parents": [
        "d6bc70083ab5366b25adcd3db763c677bf38b6d0"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Thu Jul 16 14:50:56 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Aug 06 02:05:46 2026 +0000"
      },
      "message": "auto_leader_rebalancer: best-effort leader step-down\n\nWhen rebalancing leaders for a table, RunLeaderRebalanceForTable\nresolved the current leader\u0027s address and sent a LeaderStepDown RPC\nwith RETURN_NOT_OK. A single transient failure (an RPC timeout, the\ntarget briefly unavailable, or an election in flight) aborted the whole\nrebalancing pass and skipped every remaining tablet and table in that\nround.\n\nA leader transfer is best effort. The next round recomputes the plan\nand retries, so a single failed transfer should warn and move on to the\nnext tablet rather than fail the pass. RunLoop already only logs a\nwarning for the overall call, so this just stops one bad RPC from\nstarving the rest of the round.\n\nSeen under heavy load, where one failed LeaderStepDown would otherwise\nend a round early and leave the leaders unbalanced for longer.\n\nChange-Id: I0fb2c7a8bf750520d34d9aba62274dbe7433d80d\nReviewed-on: http://gerrit.cloudera.org:8080/24594\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "d6bc70083ab5366b25adcd3db763c677bf38b6d0",
      "tree": "ecc45e7b5e007e131c834dcc0a43e5e684832d7d",
      "parents": [
        "df601446fbac5d3e75fecc05401311d5e8d83843"
      ],
      "author": {
        "name": "Ashwani",
        "email": "ashwani@apache.org",
        "time": "Wed Aug 05 17:32:36 2026 +0530"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 05 18:25:22 2026 +0000"
      },
      "message": "KUDU-3795 Reduce storage footprint for ASAN build\n\nTestHeavyUpdateCompaction fails due to ENOSPC error for ASAN build.\nTSAN and ASAN instrument every memory access and allocation, making each\ntest iteration slower than a normal build. This means more instances are\nsimultaneously active on dist-test slaves at any given time, sharing the\nsame tmp dir capacity. With the default 500 rows, each instance can peak\nto several hundred MB of storage usage that could exhaust the tmpfs and\ntrigger ENOSPC under high concurrency, which causes a fatal crash in the\nserver\u0027s flush path.\n\nThe patches fixes that by reducing the row count to 20 thats keeps peak\ndisk usage under a safe limit, even with multiple concurrent tests\nrunning and sharing the same tmp folder for storage needs. This aligns\nwith existing handling for TSAN build.\n\nAll 2000 test reps passed with fix.\n48 out of 2000 test reps failed without fix.\n\nChange-Id: Iec34c4713476933a0a2e3ca1c90425d545412493\nReviewed-on: http://gerrit.cloudera.org:8080/24663\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "df601446fbac5d3e75fecc05401311d5e8d83843",
      "tree": "30816e88dc6a16956f71cd0b7d75edc07c8b4e8b",
      "parents": [
        "b304fc55802b0367587e351452dc141e227139af"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 04 15:08:46 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 05 17:20:00 2026 +0000"
      },
      "message": "KUDU-3772 fix flakiness in MiniPrometheusTest.StartStopNoTargets\n\nBefore this fix, one of my RHEL9.6 x86_64 build/test machines would\nregularly report a failure in the MiniPrometheusTest.StartStopNoTargets\nscenario when running mini_prometheus-test.  Reports looked like below:\n\n  src/kudu/util/mini_prometheus-test.cc:206: Failure\n  Failed\n  Bad status: Remote error: HTTP 503\n\nThis changelist address the issue.\n\nI also tried a more generic approach, trying to rely on the documented\n\u0027/-/ready\u0027 URL [1] by running the readiness check right before returning\nfrom the MiniPrometheus::Start() method.  However, it seems getting\nHTTP 200 for GET/HEAD requests at the \u0027/-/ready\u0027 URL doesn\u0027t guarantee\nthat Scrape/Target Manager initialization is complete, so the readiness\ncheck is useless in this context.\n\n[1] https://prometheus.io/docs/prometheus/latest/management_api/\n\nChange-Id: I05e9ca3e3c8782e9b073dd2329846d5eac661dcf\nReviewed-on: http://gerrit.cloudera.org:8080/24658\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "b304fc55802b0367587e351452dc141e227139af",
      "tree": "71d73f33aec5ce9625c9ca9229feb6e6b8cbfc7d",
      "parents": [
        "61a882f8ffd0729c21874a515711f03a1ce30df8"
      ],
      "author": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Mon May 11 16:38:28 2026 +0300"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Aug 05 14:32:59 2026 +0000"
      },
      "message": "[java] Add JDK25 support\n\nAdd support for building and running the Java modules on JDK25 while\npreserving JDK17 compatibility.\n\n* FakeDNS: rework the test DNS override to also drive the JDK25\n  java.net.spi.InetAddressResolver SPI (lookupByName / lookupByAddress),\n  falling back to the Java 9+ InetAddress$NameService path and the\n  Java 8 sun.net.spi.nameservice.NameService path. The existing\n  --add-opens\u003djava.base/java.net in gradle/tests.gradle already covers\n  the reflective field access on all of these paths. The Java 9+ path\n  catches only the expected ReflectiveOperationException /\n  InaccessibleObjectException so genuine programming errors surface\n  instead of being treated as \"try the next JDK path\".\n* Spark KuduContext: obtain the login/current user via Hadoop\u0027s\n  UserGroupInformation (loginUserFromKeytabAndReturnUGI when a principal\n  and keytab are configured, otherwise getCurrentUser) and run the\n  authentication-credentials export via UGI.doAs. This replaces the\n  previous javax.security.auth.Subject.getSubject()/Subject.doAs() and\n  manual LoginContext usage, which are disabled/deprecated on newer JDKs,\n  and does so without reflecting into JDK internals -- UGI encapsulates\n  the JDK17-vs-JDK18+ differences in how the current Subject is obtained.\n* Bump Hadoop to 3.4.3 for its newer JAAS/Subject compatibility fixes:\n  3.4.x obtains the current Subject via Subject.current() on JDK18+,\n  whereas 3.4.1 still calls the JDK18+-removed Subject.getSubject().\n  Spark 3.5.x bundles an older hadoop-client (3.3.x), so force the\n  hadoop-client-api / hadoop-client-runtime artifacts to the project\n  Hadoop version wherever Spark is on the classpath: kudu-spark and\n  kudu-spark-tools via the root build.gradle resolutionStrategy, and\n  kudu-backup (which excludes hadoop-common and would otherwise ride\n  Spark\u0027s older client) via its own resolutionStrategy. Without this,\n  SparkContext initialization fails on JDK17+ with\n  \"UnsupportedOperationException: getSubject is not supported\".\n* Negotiator: when Kerberos negotiation fails, unwrap the SaslException\n  from both the legacy Subject.doAs wrapping (RuntimeException -\u003e\n  PrivilegedActionException) and the modern Subject.callAs wrapping\n  (CompletionException) used by the SecurityManagerCompatibility shim on\n  JDK18+. Previously only the legacy wrapping was handled, so on JDK18+\n  an authentication failure escaped as an unexpected (recoverable)\n  exception and was retried until timeout instead of surfacing as a\n  clean NonRecoverableException.\n* hadoop-common 3.4.2+ dropped the old commons-collections 3.x in favor\n  of commons-collections4, but Ranger\u0027s RangerPluginConfig still uses\n  org.apache.commons.collections.CollectionUtils. Declare\n  commons-collections 3.2.2 explicitly for kudu-subprocess so the Ranger\n  subprocess handler and its tests keep resolving that class.\n* Skip the Hive Metastore integration test on JDK23+ (not yet\n  compatible). For the TestSecurity non-default-principal check, match a\n  broad set of authentication-related keywords instead of exact error\n  text (which varies across JDK/Kerberos implementations), so the test\n  still fails if the connection is rejected for an unrelated reason.\n\nChange-Id: I9d3835c9289ac9817c39a86b7be22a28818c5bb0\nReviewed-on: http://gerrit.cloudera.org:8080/24293\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "61a882f8ffd0729c21874a515711f03a1ce30df8",
      "tree": "c52f3459b7e062e8bb626ad351cb1e3259e25c8a",
      "parents": [
        "c4500b278067a97d3feb35fe6c77d5ef322b1f6d"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Mon Jul 06 12:39:32 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Aug 05 02:39:20 2026 +0000"
      },
      "message": "KUDU-3789 auto_rebalancer: de-flake TSAN tests\n\nA handful of tests in auto_rebalancer-test were flaky under TSAN\ndist-test. These are test-only fixes; there are no production changes.\n\n- OnlyLeaderDoesAutoRebalancing / NextLeaderResumesAutoRebalancing:\ninstead of asserting non-leader masters have exactly 0 iterations,\ncheck that only the current leader\u0027s counts grow over a stable\nleadership window. The initial election can flicker, so a brief\ntransient leader could have a non-zero count.\n\n- NoRebalancingIfReplicasRecovering / TestDeletedTables: wait until the\nmaster actually sees the killed tserver as dead\n(WaitForLiveTServerCount) rather than sleeping a fixed interval, set\nthe unresponsive timeout only after the tables exist, and use RF\u003d1 for\nthe extra table.\n\n- PreferFollowerRebalancingTest / TestMaxMovesPerServer: give\nCheckSomeMovesScheduled more time under TSAN (and a lighter workload\nfor the former), so the first scheduling round isn\u0027t cut off.\n\n- ExecuteMovesCASRejectionDropsMoveGracefully: retry until the\nCAS-rejection race we want to exercise actually happens, since a\nheartbeat can refresh the catalog\u0027s opid before ExecuteMoves runs.\n\n- RebalancerMetricsFollowerMoves: relax the leader-move count from \u003d\u003d0\nto \u003c\u003d follower moves. prefer_follower is only a preference, so the\nrebalancer can still fall back to a leader move when the source has no\nfollower for the table.\n\nChange-Id: I223f83be1db6f843f24a7bf95e31f3e3f77dcfe7\nReviewed-on: http://gerrit.cloudera.org:8080/24584\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "c4500b278067a97d3feb35fe6c77d5ef322b1f6d",
      "tree": "3db9e7c37b9cc38f873615b313911a210a6a007a",
      "parents": [
        "30501ee9e33a2799d3eca6816405b4132d3e0d14"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Mon Jun 08 13:01:31 2026 +0530"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Aug 04 18:05:56 2026 +0000"
      },
      "message": "KUDU-3429 Add extensive test for delta generation (3/n)\n\nThe patch adds a unit test that is a better version of existing tests\nto generate UNDO deltas using:\n* Pattern of inserting interleaved rows to ensure more rowsets become\n  eligible for compaction.\n* Wide column data to make each mutation size big enough (64KB). Along\n  with repetitive updates ensures increased delta memory footprint.\n* Increased rows per block batch size that ensures compaction op has\n  more memory footprint, used to hold rowblock and their mutations.\n* Use periodic byte pattern to minimize the effect of compression on\n  wall time and achieve \u0027compressible on disk but expands in memory\u0027\n  goal at the same time, for the data generated for UNDO deltas.\n* This can act as a de facto unit test for testing high memory\n  compaction ops. This can be used as a reference base test for any high\n  memory based compaction tests.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nCLEAN_THIRDPARTY\n\nChange-Id: I8c337dba87a9d1cf549f9b53813da8d50e86b6b4\nReviewed-on: http://gerrit.cloudera.org:8080/24412\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "30501ee9e33a2799d3eca6816405b4132d3e0d14",
      "tree": "74ea1bb214e331fc0c38a522d4e62ce580b5c217",
      "parents": [
        "1555eb8f00f70f362c73517328a73cfa482d4800"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Jul 06 14:55:36 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Aug 03 14:03:17 2026 +0000"
      },
      "message": "KUDU-3788 an option to use pre-built thirdparty artifacts\n\nWith this changelist, now it\u0027s possible to fetch and use pre-built\nartifacts for 3rd-party components instead of building them from\nscratch when running $KUDU_HOME/thirdparty/build-if-necessary.sh\nor $KUDU_HOME/thirdparty/build-thirdparty.sh \u003ccomponent_name\u003e.\n\nThe following attributes are used to find a match for a particular\n3rd-party component when installing on a host machine:\n  * name of the component (cmake, protobuf, etc.)\n  * version of the component as in $KUDU_HOME/thirdparty/vars.sh\n  * Kudu patch version of the component as in $KUDU_HOME/thirdparty/vars.sh\n  * OS name/flavor (redhat, ubuntu, macos, etc.)\n  * OS major version (9, 24, 26, etc.) -- this assumes the newer minor\n    versions of the same major release are backwards compatible\n  * CPU architecture (x86_64, aarch64, etc.)\n  * build toolchain info:\n    ** compiler family (gcc, clang, etc.)\n    ** C++ compiler version in form \u003cmajor\u003e.\u003cminor\u003e\u0027 (13.3, 17.0, etc.)\n\nThe usage of the pre-built 3rd-party artifacts is enabled by default:\nuse the USE_PREBUILT_THIRDPARTY env/shell variable to control this\nfeature.  If a pre-built archive isn\u0027t available at the designated\nS3 bucket, it\u0027s built from source and put into the local cache\ndirectory: $KUDU_HOME/thirdparty/prebuilt-cache.  After that, it\u0027s\npossible to upload the result into a sub-directory of the designated\nS3 bucket s3://cloudera-thirdparty-libs/prebuilt.  I didn\u0027t implement\nautomatic uploading into the bucket because:\n  * it makes sense to limit upload and refresh of the pre-built\n    archives, making sure we distribute only vetted and verified ones\n  * as for CI, our current upstream CI pipeline isn\u0027t supposed to keep\n    valid S3 credentials in the build environment\n\nSet REBUILD_PREBUILT_THIRDPARTY\u003d1 when it\u0027s necessary to force\nrebuilding pre-built artifacts even if corresponding archive is\navailable either in $KUDU_HOME/thirdparty/prebuilt-cache or in the\nS3 bucket.\n\nTo upload all the pre-built archives from the cache when necessary\ncredentials are present in the environment, run the following command\nfrom the $KUDU_HOME/thirdparty directory:\n\n  aws s3 cp prebuilt-cache s3://cloudera-thirdparty-libs/prebuilt --recursive\n\nThe prefix is set to /opt/kudu/thirdparty/{common,uninstrumented,tsan}\nwhen building pre-built artifacts for a 3rd-party component.  This is\nuniform and independent from the layout of the local Kudu git workspace:\ncompare with $KUDU_HOME/thirdparty/installed/{...} in the legacy\napproach.  This allows for using pre-built 3rd-party artifacts at any\nmachine regardless of the actual layout of local Kudu git workspace.\nUpon installation, symbolic links are created in /opt/kudu/thirdparty:\nthey point to the actual location of pre-built artifacts under one of\nthe sub-directories of $KUDU_HOME/thirdparty/installed.  When building\n3rd-party components using super-user account (UID 0), the prefix\ndirectory /opt/kudu/thirdparty directory is automatically created.\nOtherwise, the script prompts a regular user to create the directory\nand grant necessary permissions on the directory before commencing\nthe build.\n\nSince ninja doesn\u0027t support DESTDIR notation for the \u0027install\u0027 target,\nit\u0027s no longer used for building 3rd-party components, even if it\u0027s\navailable.  Only CMake/GNUmake combination is now used for building\n3rd-party components that rely on CMake to bootstrap build environment.\n\nBelow a list of TODOs to address in follow-up changelists:\n  * address the issue with trace-viewer: it should be packed into\n    pre-built archive as well, and links should be established\n    from $KUDU_HOME/www into somewhere under thirdparty/installed\n    instead of copying files directly into $KUDU_HOME\n  * avoid unconditionally downloading and unpacking source tarballs:\n    as of this version, the build script is still downloading and\n    unpacking the source archives for all the 3rd-party components\n    when it doesn\u0027t find corresponding sub-directory in\n    $KUDU_HOME/thirdparty/src\n  * add CPU features that are auto-detected and enabled for building\n    particular 3rd-party components, e.g., AVX2 instructions support\n    when building bitshuffle\n  * introduce matching of any CPU architecture and any OS: this\n    should help with de-duplication of packed JARs and similar content\n    (e.g., interpreted scripts, etc.).\n\nCLEAN_THIRDPARTY\n\nChange-Id: I55b5b99fcbe60eec3f6ae19fa4f2e335f361d143\nReviewed-on: http://gerrit.cloudera.org:8080/24583\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\n"
    },
    {
      "commit": "1555eb8f00f70f362c73517328a73cfa482d4800",
      "tree": "103ef9039871a1c6a99cb66797fd8c347f20ea0d",
      "parents": [
        "480c5c3ef84132edb8dc453a6d00d7f4929a9b36"
      ],
      "author": {
        "name": "Jeison Romero",
        "email": "jeidavid92@hotmail.com",
        "time": "Wed Jul 29 17:12:10 2026 -0600"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Sun Aug 02 09:42:24 2026 +0000"
      },
      "message": "KUDU-3775: relax entity type restriction in Prometheus labels\n\nBuildPrometheusLabels() previously DCHECKed that entity_type was one\nof \"server\", \"table\", or \"tablet\", rejecting any other entity type\n(e.g. synthetic test entities such as \"test_entity\"). This made it\nimpossible to use the entity-labels Prometheus format with anything\noutside those three built-in types.\n\nRemove the DCHECK and rename the internal helper from\nBuildTableTabletPrometheusLabels to BuildGenericPrometheusLabels,\nreflecting that it now handles any entity type other than \"server\"\ngenerically: it emits entity_type and entity_id as-is, along with\nany recognized attributes, without asserting on the type value.\n\nConvert MetricsTest.PrometheusFilterByEntityLevel from the legacy\nPrometheus format (previously required as a workaround, since it\nuses test_entity) to the entity-labels format now that this is\npossible. Add a dedicated regression test,\nPrometheusEntityLabelsArbitraryEntityType, that specifically\nverifies correct label output for a non-standard entity type.\n\nChange-Id: I23479bc3fb3c6f2ea81fd2b1727dd2bd1609a30c\nReviewed-on: http://gerrit.cloudera.org:8080/24646\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "480c5c3ef84132edb8dc453a6d00d7f4929a9b36",
      "tree": "8959a9dc493aa057d540ab4e7a3af49595586191",
      "parents": [
        "47a908950d2f3379ddab11c6fca3a696befcbe02"
      ],
      "author": {
        "name": "Ashwani",
        "email": "ashwani@apache.org",
        "time": "Wed Jul 22 12:10:22 2026 +0530"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Tue Jul 28 15:06:20 2026 +0000"
      },
      "message": "[build] Add IWYU mapping for boost\u0027s type_traits\n\nboost/move/detail/type_traits.hpp is a private Boost.Move\nimplementation header providing pre-C++11 polyfills for type\npredicates (is_trivially_destructible, is_nothrow_move_constructible,\netc.). IWYU\u0027s template instantiation tracing can surface it when\nstd algorithms move types that have opted into Boost.Move emulation,\neven though no user code directly uses anything from it.\n\nAdd a mapping in boost-extra.imp that redirects it to the standard\n\u003ctype_traits\u003e header, which is its C++11 public equivalent and is\nalready included in the affected translation units. This prevents\nIWYU from incorrectly suggesting a direct include of a Boost\ninternal detail header.\n\nChange-Id: I4fa5d5d89f9aea049d64e111f77ac10a792d0463\nReviewed-on: http://gerrit.cloudera.org:8080/24617\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nTested-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "47a908950d2f3379ddab11c6fca3a696befcbe02",
      "tree": "ecc782c70e11c7875720147273aedce03a97fabb",
      "parents": [
        "a7e9832c8bcf08484e72040238003d67f5eef4e3"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Sat Jul 18 11:09:54 2026 -0700"
      },
      "committer": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@cloudera.com",
        "time": "Tue Jul 21 19:23:17 2026 +0000"
      },
      "message": "[build-support] build Kudu with GCC13 on SLES15SP6\n\nChange-Id: I20371201ee7b18a72e745f80a57e07dd907013ac\nReviewed-on: http://gerrit.cloudera.org:8080/24607\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "a7e9832c8bcf08484e72040238003d67f5eef4e3",
      "tree": "d894def422d70f7b5b551ce0ac300a4e69824b0d",
      "parents": [
        "c04e8150acf1245577a9e409ea6e7079e3b3176a"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Sat Jul 18 17:52:18 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Jul 21 12:35:19 2026 +0000"
      },
      "message": "[codegen] fix build on macOS Tahoe with Xcode 26.x (x86_64)\n\nPrior to this patch, attempts to build Kudu on macOS Tahoe 26.5.2\nwith CLANG from Xcode 26.3 on Intel CPU (x86_64) machines were failing\nwith errors like below:\n\n  [ 93%] Generating precompiled.ll\n  In file included from src/kudu/codegen/precompiled.cc:39:\n  In file included from src/kudu/common/rowblock.h:28:\n  In file included from src/kudu/common/columnblock.h:27:\n  In file included from src/kudu/common/types.h:20:\n  In file included from thirdparty/installed/uninstrumented/include/c++/v1/cmath:308:\n  In file included from thirdparty/installed/uninstrumented/include/c++/v1/math.h:300:\n  /Applications/Xcode-26.3.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.2.sdk/usr/include/math.h:645:27: error: _Float16 is not supported on this target\n  extern _Float16 __fabsf16(_Float16) __API_AVAILABLE(macos(15.0), ios(18.0), watchos(11.0), tvos(18.0));\n\nI\u0027m not sure this is very relevant, but at least offical Swift docs [1]\nstate FLoat16 is avalable on macOS only for Apple silicon:\n  On macOS, Float16 is only available when targeting Apple silicon.\n\n[1] https://developer.apple.com/documentation/swift/float16\n\nChange-Id: Ieedac431c9c9cc023c3bcc87a8ac806ea966bb65\nReviewed-on: http://gerrit.cloudera.org:8080/24606\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "c04e8150acf1245577a9e409ea6e7079e3b3176a",
      "tree": "4af39aa80f5b1e0a7e99ca295c162b397d4910e7",
      "parents": [
        "a8d43ad68f23dc4886543f2c3380abcb1ed27257"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Jul 16 14:54:49 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Jul 17 09:45:32 2026 +0000"
      },
      "message": "[client] fix typo on doc API visibility for RecallTable()\n\nThe KuduClient::RecallTable() is an exported function/method,\nand it\u0027s also being referred to in the inline docs for the documented\nKuduClient::SoftDeleteTable() API call.  So, it\u0027s necessary to\nauto-generate the API docs for RecallTable() as well, and this\nupdate moves Doxygen\u0027s @endcond tag to achieve that.\n\nThere are no functional modifications in this changelist.\n\nThis is a follow-up to 7b6b6b636818d3e22a3939fde77689dce84e88b2.\n\nChange-Id: Ic759d2112075959e0203dc0e1eb5a1629ebef7b4\nReviewed-on: http://gerrit.cloudera.org:8080/24593\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "a8d43ad68f23dc4886543f2c3380abcb1ed27257",
      "tree": "d151f20db96fc893a8db46fd19bd2fd2f876b6cf",
      "parents": [
        "cf54a3ecc5e3bc18289983c2d599f3574db0fb28"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Jul 13 12:26:32 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Jul 17 05:53:06 2026 +0000"
      },
      "message": "[thirdparty] update boost up 1.91.0\n\nThis is one of the preliminary updates for KUDU-3788.  The motivation\nbehind this changelist is to use cmake for building the Boost library\ninstead of the built-in b2 tool.  With cmake-based build it\u0027s now\npossible to stage the pre-built binaries into a custom DESTDIR while\nstill keeping pre-defined PREFIX which doesn\u0027t depend on the location\nof the staging directory in local Kudu workspace.\n\nThe new version comes with many improvements and updates since 1.84.0.\n\nIn Boost 1.91.0, the BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX macro no\nlonger exists: platform-specific entropy providers were removed and\nrandom generators were switched to std::random_device as of 1.86.0 [1].\nAlso, comparing with b2-based builds, there is no need of explicitly\nsetting the compiler via the --with-toolset flag since cmake is able\nto derive the necessary toolset information from CC/CXX variables.\n\nThe new code in include/boost/uuid/detail/chacha20.hpp, added in 1.86.0,\ntriggers a UBSAN warning because the code implicitly assumes unsigned\ninteger overflow of the \"wrapping around\" style.  To address it,\nanother Boost-related item was added into ubsan-blacklist.txt.\n\nNOTE: the original source tarball for 1.91.0 published on GitHub [2]\n      was repackaged to change the directory prefix from boost-1.91.0-1\n      to boost-1.91.0 to comply with the established convention for the\n      \u0027thirdparty\u0027 directory layout, and then uploaded to the\n      corresponding S3 bucket as boost-1.91.0-cmake.tar.gz\n\n[1] https://www.boost.org/doc/libs/latest/libs/uuid/doc/html/uuid.html#changes_changes_in_boost_1_86_0_major_update\n[2] https://github.com/boostorg/boost/releases/download/boost-1.91.0-1/boost-1.91.0-1-cmake.tar.gz\n\nChange-Id: I4c9c2e9260b892c721ec2ba887c61b8aeef35888\nReviewed-on: http://gerrit.cloudera.org:8080/24581\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\n"
    },
    {
      "commit": "cf54a3ecc5e3bc18289983c2d599f3574db0fb28",
      "tree": "4b1791cc6e332c13e425b723b44c8a0cd97a777d",
      "parents": [
        "84f05a47990945843430a451318530a7cca6e61b"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Tue Jun 30 16:29:34 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Jul 16 18:16:08 2026 +0000"
      },
      "message": "KUDU-3789 auto_rebalancer: reliably clear replace marker after failed moves\n\nWhen a rebalancing move fails, we clear the source replica\u0027s replace\nmarker so the master stops trying to replace it. The problem is we only\ntried once, and right after a failed move the leader is usually busy with\nother config changes (promoting the new NON_VOTER, stepping down, a\nleader transfer), so that single attempt often gets rejected and the\nmarker is left set forever.\n\nNow we retry instead of giving up: a couple of quick inline attempts, and\nif those still don\u0027t land, the move is queued and retried on every\nrebalancer loop iteration, even when auto-rebalancing is disabled, since\nthe markers still need to converge. NotFound and InvalidArgument are\ntreated as already-cleared.\n\nAlso reset the per-round move counters each iteration so tests don\u0027t read\na stale count after a skipped round, and update\nTestRemoveReplaceFlagIfMoveFails to only check the leader\u0027s view of the\nconfig and to tolerate slower TSAN timing.\n\nChange-Id: Ia47698207612252bca3ec70fc090a37bd3f87809\nReviewed-on: http://gerrit.cloudera.org:8080/24525\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "84f05a47990945843430a451318530a7cca6e61b",
      "tree": "9da90a0d1cae0f839008f95d4db00d4d1cffe6ae",
      "parents": [
        "6124d83bc1f97b426a8efe47969845003266540d"
      ],
      "author": {
        "name": "senzei1",
        "email": "jeidavid92@hotmail.com",
        "time": "Fri Jul 03 10:56:55 2026 -0600"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Fri Jul 10 13:56:14 2026 +0000"
      },
      "message": "KUDU-3777: return HTTP 401 for bad SPNEGO headers\n\nWhen a client sends an Authorization header with an unrecognized scheme\n(e.g., Bearer) to a SPNEGO-protected webserver endpoint, RunSpnegoStep\nreturns Status::InvalidArgument. Previously, the error dispatch in\nWebserver::BeginRequestCallback only mapped IsNotAuthorized() to HTTP\n401, allowing InvalidArgument to fall through to an HTTP 500.\n\nThis patch updates the error dispatch to map IsInvalidArgument() to\nHTTP 401 (Authentication Required), ensuring the correct client error\nis returned. The SpnegoWebserverTest.TestInvalidHeaders test has also\nbeen updated to expect the correct 401 response.\n\nChange-Id: Ie1e85a991c50cddeec76a2ab16a65b34fe3fee5c\nReviewed-on: http://gerrit.cloudera.org:8080/24545\nTested-by: Kudu Jenkins\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Attila Bukor \u003cabukor@apache.org\u003e\n"
    },
    {
      "commit": "6124d83bc1f97b426a8efe47969845003266540d",
      "tree": "779212432c2df5fd87302f1a1b0ca0dfaaa51d85",
      "parents": [
        "a821a04aadda3e5ae28606ec1a5907b3272cc689"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Mon Jun 15 16:29:50 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Jul 10 08:35:47 2026 +0000"
      },
      "message": "KUDU-3767 Add global leader awareness to auto leader rebalancer (Part 2)\n\nPart 1 threaded a global leader count map through the per-table loop to\nbreak ties when scoring destinations. That steers individual transfers\nbut can\u0027t fix skew that spans tables: since each table is balanced\nindependently, a tserver can keep getting the ceiling (\u0027+1\u0027) allocation\nacross many tables and end up holding far more leaders than its peers,\neven though every table is locally balanced. A typical case is many\nsingle-tablet tables whose lone leaders all land on the same tserver.\n\nThis patch adds the post-loop global pass promised in Part 1. Once every\ntable is balanced on its own, it moves leaders off tservers that are above\nthe global ceiling onto ones with room below it, but only when doing so\nkeeps the affected table within its own floor/ceil. The pass runs only in\na round where per-table balancing scheduled nothing (to avoid racing its\nin-flight, asynchronous moves) and is best-effort, logging and skipping\ntransient step-down failures.\n\nChange-Id: I5d44761f6444ca1d1bf4fcee405d65d029e41980\nReviewed-on: http://gerrit.cloudera.org:8080/24476\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "a821a04aadda3e5ae28606ec1a5907b3272cc689",
      "tree": "40763f9241f06060e338a182f9eff893c3866c2f",
      "parents": [
        "844bedc15e81bd62879377e001142786f7d931d8"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Fri Jun 26 17:40:00 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu Jul 09 10:17:56 2026 +0000"
      },
      "message": "KUDU-3759 Randomize the choice among equally skewed tables\n\nWhen the greedy rebalancer picks its next move, it first finds the\ntables that are most out of balance. Often several tables share the\nsame worst skew, and only one of them gets fixed per step.\n\nThe trouble is that these tied tables came straight out of the\ntable_info_by_skew multimap, which always returns them in the same\norder. The first table in that order kept winning every time, so the\nrebalancer would keep hammering one table while other tables with the\nsame skew sat untouched.\n\nThe fix copies the tied tables into a vector and shuffles them with the\ngenerator the algorithm already owns before making a choice, so the\npick gets spread out fairly. This only applies to PICK_RANDOM;\nPICK_FIRST stays deterministic as before.\n\nThe change affects both the master auto-rebalancer and the CLI rebalance\ntool, since both run with PICK_RANDOM. The cross location balancer uses\na different algorithm and is left alone.\n\nChange-Id: I39cc610843d222a3dd2615a26993aba544639b54\nReviewed-on: http://gerrit.cloudera.org:8080/24516\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "844bedc15e81bd62879377e001142786f7d931d8",
      "tree": "820fb0728d4a15b6ed0932e3aed8973b674c8c26",
      "parents": [
        "d55aacb623be00756ad227d8f624c345da6e5f08"
      ],
      "author": {
        "name": "zchovan",
        "email": "zchovan@cloudera.com",
        "time": "Fri Jul 03 13:29:53 2026 +0200"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Mon Jul 06 06:50:34 2026 +0000"
      },
      "message": "[java] Fix javadocAggregate under Gradle 9\n\nThe javadocAggregate task runs in the root project but resolved each\nsubproject\u0027s compileClasspath configuration directly, which Gradle 9\nforbids without an exclusive lock (\"Resolution of the configuration\n\u0027:kudu-backup:compileClasspath\u0027 was attempted without an exclusive\nlock\").\n\nApply the same pattern already used by copyDistTestJars: each subproject\ncopies its own compileClasspath jars -- resolved within the subproject,\nand including compileOnly deps such as Flink -- into a shared directory\nthat the root task points its classpath at. kudu-jepsen is excluded from\nthe aggregate docs since it is Clojure-only and pulls in the unpublished\njepsen:jepsen dependency.\n\nChange-Id: Ibe9cad3fbe639604b7e458114b8af46e0e410a5e\nReviewed-on: http://gerrit.cloudera.org:8080/24537\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "d55aacb623be00756ad227d8f624c345da6e5f08",
      "tree": "abcd1fd5a1a851ff39b3c3cba4ce3770fc1d75ca",
      "parents": [
        "c3e20a42e131b6e599ae7496619139b57eb676ee"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Mar 31 11:10:34 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Jul 03 11:05:34 2026 +0000"
      },
      "message": "[Python] modernize packaging and extend version support\n\nAdd pyproject.toml with PEP 517 build-system table, versioning Cython\nper Python version. Drop setup_prerequisites.py. Package metadata\nremains in setup.py; KUDU-3764 tracks moving it.\n\nPin per-version dev dependencies (pytest, setuptools, numpy, pandas),\nand add compat aliases NP_OBJECT/NP_BOOL for NumPy \u003e\u003d 1.24 API removals.\n\nDrop PY26/unittest2, extend classifiers to Python 3.12-3.14, and\nfix sdist import test to run outside the source tree.\n\nTested client and packaging tests on:\n- Ubuntu 22: Python 2.7, 3.7-3.14\n- Ubuntu 18: Python 2.7, 3.7, 3.8\n\nChange-Id: I940cda86ac30d053ba284155a038f9e7b4e363fc\nReviewed-on: http://gerrit.cloudera.org:8080/24200\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "c3e20a42e131b6e599ae7496619139b57eb676ee",
      "tree": "7c9f17dded7a193dac40c26e21794f15da74a023",
      "parents": [
        "dddb4db76592ba5f032379f7348e420ccd49245f"
      ],
      "author": {
        "name": "zchovan",
        "email": "zchovan@cloudera.com",
        "time": "Fri Jun 26 17:32:49 2026 +0200"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Fri Jul 03 09:59:04 2026 +0000"
      },
      "message": "[java] Tighten field visibility and thread-safety\n\nDriven by new SpotBugs rules introduced with the SpotBugs 6.x upgrade\nin the preceding Gradle 9 commit:\n\n  * AT_STALE_THREAD_WRITE_OF_PRIMITIVE / AT_NONATOMIC_64BIT_PRIMITIVE\n    - Add `volatile` to fields read across threads in KuduTransaction.\n    - Make KuduRpc.attempt private and gate it behind synchronized\n      accessors (nextAttempt/getAttempt/resetAttempt). Mark\n      KuduRpc.sequenceId volatile.\n\n  * DMI_RANDOM_USED_ONLY_ONCE\n    - RemoteTablet: replace shared `new Random()` with\n      ThreadLocalRandom.current() for the one-off seed selection.\n    - RemoteTablet: also throw IllegalArgumentException (instead of a\n      bare RuntimeException) for an unknown replica selection mechanism,\n      and log the cached tabletId field directly.\n\n  * MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR / CT_CONSTRUCTOR_THROW\n    - Mark internal helper classes final (BackupIO, SubprocessConfiguration)\n      and tighten field visibility (`val rootPath` -\u003e `private[this] val`).\n    - Mark KuduTransaction.doStartKeepaliveHeartbeating final.\n\n  * THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION\n    - Drop unused `throws Exception` from public methods on KuduTable\n      that no longer propagate checked exceptions; narrow\n      ReplicationTableInitializer signatures from `throws Exception`\n      to `throws KuduException`.\n\n  * RowAction (kudu-backup): convert from Java enum to a Scala sealed\n    trait + objects so the rest of the backup module\u0027s pattern matching\n    is exhaustive.\n\nPublic-API impact is minimal: every class touched is annotated\n@InterfaceAudience.Private or, in KuduTable\u0027s case, the affected\nmethods are @LimitedPrivate(\"Impala\"). `throws` narrowing is\nsource-compatible for catch-Exception callers. The remaining global\nexclude in excludeFilter.xml (THROWS_METHOD_THROWS_RUNTIMEEXCEPTION)\ncovers the bare RuntimeException throws kept as-is for now.\n\nRemoves the temporary global suppressions (AA/AT/CT/DMI/MC bug\npatterns) that the preceding Gradle 9 commit had to add.\n\nChange-Id: I0b96c85c4a42d03d5b7911a823a147c0b66471f1\nReviewed-on: http://gerrit.cloudera.org:8080/24520\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "dddb4db76592ba5f032379f7348e420ccd49245f",
      "tree": "3e82beae2053d29f59f8361b7c990120403c4d6e",
      "parents": [
        "c404c695ce7113e7a82f5da15873809e07e318d2"
      ],
      "author": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Tue Jun 23 17:50:33 2026 +0300"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Fri Jul 03 09:58:47 2026 +0000"
      },
      "message": "[java] Replace deprecated APIs to silence build warnings\n\nGradle 9 / newer toolchains surface a number of deprecation warnings.\nIn this change the deprecated APIs are replaced with their supported\nequivalents:\n\n  - org.junit.Assert.assertThat -\u003e org.hamcrest.MatcherAssert.assertThat\n    (deprecated in JUnit 4.13) across the client, hive, and security\n    tests.\n  - commons-cli BasicParser -\u003e DefaultParser in the kudu-subprocess config.\n  - new Integer(...) -\u003e Integer.valueOf(...) in kudu-backup TableMetadata.\n  - Guava Throwables.propagateIfPossible -\u003e explicit instanceof rethrow\n    in FakeDNS, and drop the now-unused import.\n\nNo behavioral change; this only removes warning output from the build.\n\nChange-Id: Ia10fdbca3733d9b16caf8d4c0ad00e2234092d39\nReviewed-on: http://gerrit.cloudera.org:8080/24518\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "c404c695ce7113e7a82f5da15873809e07e318d2",
      "tree": "272dcc8a738c15a90913e269bc2fb035749d162b",
      "parents": [
        "bb85047edf6d1c39474ed940ced33ecf64e22c45"
      ],
      "author": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Tue Jun 23 17:24:51 2026 +0300"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Fri Jul 03 09:58:22 2026 +0000"
      },
      "message": "[java] Upgrade build to Gradle 9\n\nBump the Gradle wrapper from 7.6.4 to 9.1.0 and update the build to the\nAPIs and plugin versions required by Gradle 9:\n\n  * Swap plugins that are incompatible with Gradle 9 for maintained\n    equivalents:\n      * Shadow (johnrengelman:shadow 7.1.2 -\u003e\n        com.gradleup.shadow:shadow-gradle-plugin 9.4.1)\n      * SpotBugs (gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin 4.7.5 -\u003e\n        com.github.spotbugs.snom:spotbugs-gradle-plugin 6.4.7)\n      * protobuf plugin (0.8.18 -\u003e 0.10.0)\n      * scalafmt plugin (gradle.plugin.cz.alenkacz:gradle-scalafmt 1.16.2 -\u003e\n        cz.augi.gradle.scalafmt:cz.augi.gradle.scalafmt.gradle.plugin 1.21.5)\n      * JMH plugin (me.champeau.gradle:jmh-gradle-plugin 0.5.3 -\u003e\n        me.champeau.jmh:me.champeau.jmh.gradle.plugin:0.7.3)\n      * bump JaCoCo (0.8.8 -\u003e 0.8.14)\n  * Migrate the build scripts (artifacts, benchmarks, docs, publishing,\n    quality, shadow, tests) to the Gradle 9 API, including the\n    `url \u003d ...` property-assignment syntax now required in repository\n    and other configuration blocks.\n  * Re-enable Javadoc generation on JDK 17 by dropping the Yetus doclet\n    (disabled on Java 10+) and suppressing the stricter JDK 17 doclint\n    checks (Xdoclint:none) to avoid a large comment-only cleanup.\n  * Disable SpotBugs on the generated kudu-proto classes and add a\n    SpotBugs exclude filter; the generated protobuf code otherwise\n    yields pervasive, non-actionable false positives.\n  * Add Jersey service-provider descriptors (META-INF/services\n    MessageBodyReader and MessageBodyWriter) so the providers are\n    discovered without classpath scanning.\n  * Migrate the distributed-test tasks to Gradle 9, which forbids a task\n    in one project from resolving another project\u0027s configuration:\n      - copyDistTestJars is split into a per-subproject Copy of its own\n        testRuntimeClasspath that the root task only aggregates.\n      - distTest no longer resolves sibling testRuntimeClasspaths itself;\n        it reads each test task\u0027s classpath after the per-subproject copy\n        has already resolved it in-project.\n      - Exclude kudu-jepsen from both (Clojure-only, all tasks disabled on\n        JDK 12+, never run as dist-tests): its configuration is otherwise\n        never resolved in-project, which would trip the same error.\n  * Disable scalafmt on kudu-flatbuffers: it has only generated Java\n    sources, and the tasks otherwise consume generateFlatBuffers\u0027 output\n    without a declared dependency (a hard error under Gradle 9).\n  * Replace the non-ASCII character literal in SparkSQLTest with\n    0x4e55.toChar; the upgraded scalafmt fails to tokenize the literal.\n\nVerified the upgrade is jar-content neutral: a same-path comparison of\nthe produced artifacts shows every entry byte-for-byte identical except\nfor the two Jersey service-provider descriptors added above\n(META-INF/services/javax.ws.rs.ext.MessageBodyReader and\njavax.ws.rs.ext.MessageBodyWriter), which are the only new entries in\nthe jars.\n\nChange-Id: I874d631ce7f4ca6527c9ffda6caef75c2976932d\nReviewed-on: http://gerrit.cloudera.org:8080/24517\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "bb85047edf6d1c39474ed940ced33ecf64e22c45",
      "tree": "9f5ef5803e04dc2914c7e30aca88a8fa540a98bf",
      "parents": [
        "3a4068a26bd919021345b4adf2e89ab7d6da531b"
      ],
      "author": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Tue Jun 23 17:56:21 2026 +0300"
      },
      "committer": {
        "name": "Zoltan Martonka",
        "email": "zmartonka@cloudera.com",
        "time": "Wed Jul 01 11:11:52 2026 +0000"
      },
      "message": "[java] Run example tests on JDK 17\n\nThe java-example tests rely on reflective access that JDK 17\u0027s strong\nmodule encapsulation blocks by default. Add the maven-surefire-plugin\n(3.2.5) and pass --add-opens for java.base/java.lang and\njava.base/java.net so the example\u0027s tests run on JDK 17.\n\nChange-Id: I4d85afcc8707af3e8c6397ad4267d78470d6df66\nReviewed-on: http://gerrit.cloudera.org:8080/24519\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\n"
    },
    {
      "commit": "3a4068a26bd919021345b4adf2e89ab7d6da531b",
      "tree": "513c3e23067fb7c56f52a14c842c54c8370ada77",
      "parents": [
        "8e54d7be0c5da244871597007fb923f68518bf56"
      ],
      "author": {
        "name": "zchovan",
        "email": "zchovan@cloudera.com",
        "time": "Tue Jun 30 18:06:36 2026 +0200"
      },
      "committer": {
        "name": "Zoltan Martonka",
        "email": "zmartonka@cloudera.com",
        "time": "Wed Jul 01 11:09:52 2026 +0000"
      },
      "message": "KUDU-3790: Fix NPE in HdrHistogramAccumulator.isZero()\n\nSpark\u0027s executor-heartbeater thread periodically calls isZero() on every\nrunning task\u0027s accumulators. The executor-side copy of KuduContext\u0027s\n\"kudu.write_duration\" accumulator can have its internal histogram field\nobserved as null before the task records its first write (unsafe\npublication across threads, or constructor-bypassing deserialization such\nas Kryo). isZero() then threw a NullPointerException on the heartbeater\nthread, which Spark treats as fatal, killing the executor.\n\nIn this change, isZero() (and toString()) was made null-tolerant: a\nnull/absent histogram is logically zero.\nisZero() is also now lock-free so it cannot depend on any field being\npublished.\nAdditionally HistogramWrapper now synchronizes its mutators on `this`\nrather than on the reassignable `innerHistogram` var, which previously\nchanged the monitor object over time and provided no real mutual exclusion.\n\nAdds HdrHistogramAccumulatorTest covering the zero semantics, a\nserialization round-trip, and regression tests that force a null field\nand assert isZero() does not throw.\n\nChange-Id: Ia3d556aaf1051464303f35281d1d698b20d5ef20\nReviewed-on: http://gerrit.cloudera.org:8080/24527\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\n"
    },
    {
      "commit": "8e54d7be0c5da244871597007fb923f68518bf56",
      "tree": "68e2c0a4e8e5bf10b239192eec448667078e9012",
      "parents": [
        "8582d9a6429c2ef1a38b0d33bfa86db8efdb4656"
      ],
      "author": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Thu Jun 25 14:17:30 2026 +0200"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Tue Jun 30 12:50:14 2026 +0000"
      },
      "message": "KUDU-3787 Make tls_debug support Kerberos\n\nd4ec371 introduced a new tool to debug TLS connections (diagnose\ntls_debug), but unfortunately, it didn\u0027t work with Kerberos-enabled\nservers, which makes it less practical in real-life environments. With\nthis change, this tool can be used to debug TLS information on\nKerberos-enabled servers as well (without needing a valid ticket).\n\nIt also fixes a bug (which was only present in debug build) that\nsurfaced while testing skipping authentication where a malformed\nnegotiation could crash a server.\n\nChange-Id: Ic6c6c9ac1cebeab8cb48bd22aea852c93c0252a4\nReviewed-on: http://gerrit.cloudera.org:8080/24511\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "8582d9a6429c2ef1a38b0d33bfa86db8efdb4656",
      "tree": "f446b8d4d51da94c675b0a217a1d4325f7c0299f",
      "parents": [
        "094f53a3ba80e0cccdeadaf9b4a6c1cf93206461"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Mon Jun 01 12:10:27 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Jun 30 00:58:13 2026 +0000"
      },
      "message": "KUDU-3779: support in-memory metadata replay for encrypted clusters\n\nKUDU-3778 (Change-Id: Iacbe12977ae945e) sped up tserver startup by\nreading each LBM native-meta container\u0027s .metadata file fully into\nmemory before replay, but disabled the optimization on encrypted\nclusters: the in-memory shim bypassed the env\u0027s per-Read decryption,\nand a bulk decrypt at preload time would have broken the per-slice\nIsAllZeros() short-circuit that KUDU-2260 trailing-zero recovery\ndepends on.\n\nThis change extends the optimization to encrypted clusters by caching\nthe ciphertext in memory and decrypting on each in-memory Read().\nRandomAccessFile gains two virtuals with no-op defaults\n(ReadRaw / Decrypt) so the non-encrypted path is unchanged;\nPosixRandomAccessFile overrides them to expose its existing\nDoReadV / DoDecryptV helpers, which keep the IsAllZeros() short-circuit\nintact. MaybePreloadMetadataIntoMemory() no longer gates on encryption\nand applies the existing replay-threshold flag to the payload size.\n\nNon-encrypted behavior is bit-for-bit unchanged. Encrypted clusters\nnow get the same syscall collapse (O(records) -\u003e O(containers)) and\nstill recover trailing zero pads correctly.\n\nBenchmarks (release build, KUDU_ALLOW_SLOW_TESTS\u003d1,\n`log_block_manager-test --gtest_filter\u003d\u0027*InMemoryReplayStartupBenchmark*\u0027`,\n5 reopens per pass, native-meta containers, encryption ENABLED):\n\n\"streaming\" \u003d --log_container_metadata_inmem_replay_threshold_bytes\u003d0,\n\"in-memory\" \u003d --log_container_metadata_inmem_replay_threshold_bytes\u003d64MiB.\n\n  Workload scale (batches x blocks/batch, dirs, 90% deletion):\n    200 x 500,    4 dirs ( 10k live):  202 ms -\u003e  115 ms (1.76x, -43%)\n    500 x 1000,  8 dirs ( 50k live): 1016 ms -\u003e  604 ms (1.68x, -41%)\n    1000 x 1000, 8 dirs (100k live): 2091 ms -\u003e 1218 ms (1.72x, -42%)\n\n  Deletion-ratio sweep (500x1000 / 8 dirs, encryption enabled):\n    deleted\u003d0%  (500k records, 500k live):  703 ms -\u003e 468 ms (1.50x)\n    deleted\u003d50% (750k records, 250k live):  899 ms -\u003e 549 ms (1.64x)\n    deleted\u003d90% (950k records,  50k live): 1034 ms -\u003e 578 ms (1.79x)\n    deleted\u003d99% (995k records,   5k live): 1042 ms -\u003e 577 ms (1.81x)\n  Same pattern as KUDU-3778: the streaming-path time scales with total\n  records (creates + deletes), the in-memory-path time only scales with\n  the live-record decrypt work and a single bulk read per container.\n\n  Container-density sweep (500x1000 / 8 dirs / 90% deletion, all 50k\n  live; steady-state, the first reopen of a fresh on-disk layout is\n  excluded as it is dominated by cold page-cache):\n    log_container_max_blocks\u003d-1:    1018 ms -\u003e 577 ms (1.76x)\n    log_container_max_blocks\u003d10000:   54 ms -\u003e  34 ms (1.59x)\n    log_container_max_blocks\u003d1000:    28 ms -\u003e  22 ms (1.27x)\n\n  Non-encryption regression check (500 x 1000, 8 dirs, 90% deletion,\n  encryption DISABLED): 805 ms -\u003e 381 ms (2.11x). Matches the numbers\n  KUDU-3778 reported for the same configuration (811 ms -\u003e 394 ms), so\n  this change does not regress the existing non-encrypted fast path.\n\nThe absolute speedup on encrypted clusters (~1.7x) is lower than on\nnon-encrypted clusters (~2.1x) because per-record decryption work has\nto run on both paths; the in-memory path only collapses the O(records)\npreadv() syscalls into a single bulk read per container, it cannot\nskip decryption. Both the absolute and relative gain still grow with\nthe number of records per container, as expected.\n\nChange-Id: I37af5bc37613dd4081e1ad708f084e1c88fb3e75\nReviewed-on: http://gerrit.cloudera.org:8080/24387\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "094f53a3ba80e0cccdeadaf9b4a6c1cf93206461",
      "tree": "105c01d8fca5e65f6bdf82565211a822eb70e4de",
      "parents": [
        "59f7715aeebb34e0dd1e254dfb5ae1c3fad4c3e8"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Jun 25 09:23:11 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Jun 26 18:23:28 2026 +0000"
      },
      "message": "[thirdparty] do not try building EOL-ed Python version\n\nPython is required for building Kudu at least by the published\ndocumentation [1], so it doesn\u0027t make much sense to maintain dead code\nthat attempts building an already EOL-ed version of Python.\n\n[1] https://kudu.apache.org/docs/installation.html\n\nChange-Id: I302d8a48bd58171a9838845d254b31de1ca25169\nReviewed-on: http://gerrit.cloudera.org:8080/24514\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "59f7715aeebb34e0dd1e254dfb5ae1c3fad4c3e8",
      "tree": "8fb99bdb8aead8caea2650af2778c0095255aa3b",
      "parents": [
        "41d277d33fb85f01017eb921b645553c8e9cab13"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Jun 16 12:34:35 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Jun 24 10:50:58 2026 +0000"
      },
      "message": "KUDU-3785: Fix CLI flag validator failure\n\nA customer issue was discovered during rolling restarts where\nthe tserver flagfile is passed to CLI commands (e.g. kudu fs\ndump --flagfile\u003dtserver.flags). The CLI previously inflated\nrpc_max_message_size to ~2GB via SET_FLAGS_DEFAULT in tool_main.cc\nto accommodate large RPC responses. This caused the\nGROUP_FLAG_VALIDATOR in op_tracker.cc to reject any flagfile that\nset tablet_transaction_memory_limit_mb below 2GB (e.g. 256MB \u003c\n2GB -\u003e failure).\n\nThe root cause is that inflating rpc_max_message_size as a global\nflag is a layering violation: it\u0027s a client-side concern that\npollutes process-wide state and triggers global validators.\n\nThe fix moves the large message size into BuildMessenger(), which\nis the single chokepoint for all CLI RPC messengers. If the user\nhas not explicitly set --rpc_max_message_size, the messenger gets\nmin(INT32_MAX, available_memory); otherwise their explicit value\nis honored. The global flag is never mutated, so the validator\nsees the compiled default (50MB) and passes regardless of flagfile\ncontents. Server subcommands are unaffected since they build their\nown messengers through the normal server path.\n\nA regression test verifies the flagfile scenario, and a unit test\nconfirms BuildMessenger produces a messenger with a large max\nmessage size.\n\nChange-Id: Idd24ec605bd14ce90ed8a5705230ff96d77d0d64\nReviewed-on: http://gerrit.cloudera.org:8080/24475\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "41d277d33fb85f01017eb921b645553c8e9cab13",
      "tree": "996c6f9c3374504451b0063046de85078c796d58",
      "parents": [
        "3ee2dfce5d048a158bffc3e286352ca6cf23b995"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Fri May 15 17:17:11 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Jun 23 08:22:45 2026 +0000"
      },
      "message": "KUDU-3730 Add observability counters to the auto-rebalancer\n\nIntroduce three new server-level metrics to track rebalancing activity:\nleader/follower moves scheduled and rounds completed.\nRebalancer::FindReplicas() is changed to return bool to signal whether\nthe leader-fallback path was taken.\n\nChange-Id: I34ab527033ed71b1b591d86387f7f3af2dd4f6a3\nReviewed-on: http://gerrit.cloudera.org:8080/24319\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "3ee2dfce5d048a158bffc3e286352ca6cf23b995",
      "tree": "819b85f48e8988e6b58b19e026d982f3966adc60",
      "parents": [
        "faec34f53d4c9dd1e3a6dd2b7314d2fc7aadff6c"
      ],
      "author": {
        "name": "zchovan",
        "email": "zchovan@cloudera.com",
        "time": "Wed Jun 17 11:29:43 2026 +0200"
      },
      "committer": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Mon Jun 22 10:56:12 2026 +0000"
      },
      "message": "[java] Refactor disabling publishing\n\nThe publishing of internal modules (e.g. kudu-backup-common,\nkudu-subprocess, etc.) was supposed to be disabled, however Gradle still\nran the per-publication publish tasks.\n\nAdded a shared disablePublishing() helper method, that disables both\nlifecycle and per-publication publish tasks, preventing internal modules\nto be published/installed during release or local testing.\n\nTo confirm the change works as expected, the following manual test was done:\n\nWith and without this patch, a local publishing was executed with:\n./gradlew publishToMavenLocal \\\n  -Dmaven.repo.local\u003d\u003cpublish directory\u003e \\\n  -PskipSigning \\\n  -Pflatc\u003d~/CLionProjects/kudu/thirdparty/installed/common/bin/flatc\n\nThen the generated output was compared:\n\n$ ls -l /tmp/kudu-with-publish-patch/org/apache/kudu/\ntotal 0\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-backup-tools\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-backup3_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-client\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-hive\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-replication\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-spark3_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-spark3-tools_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:32 kudu-test-utils\n\n\n$ ls -l /tmp/kudu-without-publish-patch/org/apache/kudu/\ntotal 0\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-backup-common\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-backup-tools\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-backup3_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-client\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-flatbuffers\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-hive\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-proto\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-replication\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-spark3_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-spark3-tools_2.12\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-subprocess\ndrwxr-xr-x@ 4 zchovan  wheel  128 Jun 19 15:35 kudu-test-utils\n\nThe modules that are were marked not to be published are no longer\npresent in the listing.\n\n\nChange-Id: Ib28ef8374074928f614ae346649cc7f886fb833b\nReviewed-on: http://gerrit.cloudera.org:8080/24480\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "faec34f53d4c9dd1e3a6dd2b7314d2fc7aadff6c",
      "tree": "6211b9f47453eae04015baf188035caad21a7259",
      "parents": [
        "d362312238b96d2dcb23d97b536fff701ed2c142"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed May 27 12:50:53 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Jun 17 18:03:43 2026 +0000"
      },
      "message": "KUDU-3780: introduce KUDU_CLIENT_ONLY build option\n\nThis changelist introduces a shortcut to build only the kudu_client C++\nlibrary and a subset of 3rd-party components required by dependency.\nThe docs/installation.adoc has been updated accordingly, and below\nis an excerpt:\n\nTo build a subset of 3rd-party components, specify \u0027client_only\u0027\ncommand-line argument to the build-if-necessary.sh script:\n\n  $ ./thirdparty/build-if-necessary.sh client_only\n\nWith the subset of the 3rd-party components built, run cmake specifying\n-DKUDU_CLIENT_ONLY\u003d1 in the build sub-directory:\n\n  $ ../../thirdparty/installed/common/bin/cmake \\\n      -DCMAKE_BUILD_TYPE\u003drelease \\\n      -DKUDU_CLIENT_ONLY\u003d1 \\\n      ../..\n\nAnd then run make (maybe, adding -j\u003cN\u003e to match number of available\nCPU cores), specifying \u0027kudu_client_exported\u0027 and \u0027kudu_client\u0027 targets:\n\n  $ make kudu_client kudu_client_exported\n\nNOTE:\n  The original approach to downloading 3rd-party components\u0027 dist\n  tarballs is quite simplistic, and it leads to downloading of _all_\n  of them regardless of the subset of the components that are actually\n  being built for the selected \u0027client_only\u0027 dependency group. This\n  changelist focuses on reducing build times of 3rd-party components\n  for a particular client-only use case. A follow-up changelist might\n  take care of the selective downloading of dist tarballs.\n\nChange-Id: Ibc8b021e03808a3ca8da6cfff617bc913772f271\nReviewed-on: http://gerrit.cloudera.org:8080/24435\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Michael Smith \u003cmichael.smith@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "d362312238b96d2dcb23d97b536fff701ed2c142",
      "tree": "94eb09be4643e5c2202c1c694167e89333972963",
      "parents": [
        "23b10557f461bc2be3d2c282748d8de96f9c46ec"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Jun 16 09:19:05 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Jun 17 09:18:04 2026 +0000"
      },
      "message": "[thirdparty] fix arch detection in crcutil on Redhat10\n\nThis changelist updates crcutil in 3rd-party up to the latest version\nin the git repo at the time of writing [1].  An update from the prior\nversion is switching from \u0027uname -p\u0027 to \u0027uname -m\u0027 to provide relevant\ninformation on RedHat10.\n\n[1] https://github.com/cloudera/crcutil/commit/0437b1a99\n\nChange-Id: Ie1d353ee3e7b3d5187cd9107a0f0609dd5cff4d6\nReviewed-on: http://gerrit.cloudera.org:8080/24477\nTested-by: Kudu Jenkins\nReviewed-by: Joe McDonnell \u003cjoemcdonnell@cloudera.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "23b10557f461bc2be3d2c282748d8de96f9c46ec",
      "tree": "8897fb1f81073601467c59c02ee45ea63ffaa5fb",
      "parents": [
        "3396d19fb3cae30ffddb1de1e8c4632645aea710"
      ],
      "author": {
        "name": "Jarek Potiuk",
        "email": "jarek@potiuk.com",
        "time": "Sat Jun 06 02:22:15 2026 +0200"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Jun 16 05:41:12 2026 +0000"
      },
      "message": "Add security threat model and wire AGENTS.md -\u003e SECURITY.md -\u003e THREAT_MODEL.md\n\nAdds a v0 security threat model (THREAT_MODEL.md), a SECURITY.md disclosure\npointer to it, and an AGENTS.md entry point so the AGENTS.md -\u003e SECURITY.md -\u003e\nTHREAT_MODEL.md discoverability chain resolves for automated tooling. The\nthreat model is a provenance-tagged v0 draft for the PMC to review (see the\nopen questions in its section 14).\n\nChange-Id: I41a29e63e09430abc8812ca4edc2e8665d19ab6b\nGenerated-by: Claude Code (Claude Opus 4.8)\nReviewed-on: http://gerrit.cloudera.org:8080/24413\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "3396d19fb3cae30ffddb1de1e8c4632645aea710",
      "tree": "b446f633e197ff265ad5b80956aba664aead051a",
      "parents": [
        "9abc5a5e3c3d3c3a9f1807817fbdbecbd9125129"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Wed May 20 12:12:39 2026 +0530"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Mon Jun 15 14:31:02 2026 +0000"
      },
      "message": "KUDU-3429 Fix rowset compaction memory accounting (2/n)\n\nThe patch fixes the following:\n- \u0027delta_blocks_mem_size()\u0027 does double accounting of the CFile block\n  buffer by adding Slice::val again when it is already accounted for\n  inside DeltaFileIterator::delta_blocks_mem_size_. The Slice::val field\n  is a zero-copy view of CFile block buffer and not a separate memory\n  area where block data is stored. Remove additional buffer sizes.\n- Keep memory accounting calculation for prepare_deltas_ separate from\n  delta_blocks_mem_size_ to avoid scenarios where delta block buffers\n  are freed (inside FreeDeltaBlocks) while struct overhead for entries\n  in prepared_deltas_ remain until preparation of next batch starts.\n  So, even after clearing of delta blocks , memory_footprint() still\n  reflects surviving PreparedDelta struct overhead.\n- \u0027peak_mem_usage\u0027 doesn\u0027t show the correct peak of memory usage of a\n  rowset compaction operation. It leaves out base-data arena and\n  ApplyMutations arena contributions that the tracker does capture.\n  MergeCompactionInput::max_memory_usage_ is sampled at FinishBlock()\n  time when all the DRS delta blocks are not residing in memory\n  simultaneously. Instead, make use of tracker\u0027s peak_consumption() that\n  takes into consideration all the big consumers of memory during a\n  rowset merge compaction operation.\n- After fixing the double-counting in delta_blocks_mem_size(), tracker\n  value is lower and the old \u00273 MB\u0027 constant is no longer reliably\n  exceeded for tests in compaction-highmem-test. Set the threshold\n  (compaction_mem_usage_approx) to a value that is reliably below the\n  minimum tracked allocation during compaction run.\n- Pre-account for the arena\u0027s initial component so that the first\n  PrepareBlock\u0027s Reset() produces a correctly-signed delta.\n\nChange-Id: Icc2133d38ed766f6834392a2e335d9246b511456\nReviewed-on: http://gerrit.cloudera.org:8080/24330\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "9abc5a5e3c3d3c3a9f1807817fbdbecbd9125129",
      "tree": "71a5f1133dc840a077c974eaeae26ddae06d648b",
      "parents": [
        "6b1bbe17b8ab938291541389a90c67c358bba716"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Thu Jun 11 16:15:10 2026 +0200"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Mon Jun 15 14:30:38 2026 +0000"
      },
      "message": "KUDU-3782 avoid unsigned underflow in MaterializingIterator::Init\n\nA \"counting\" scan (e.g. SELECT count(...)) projects no columns, so the\nMaterializingIterator\u0027s schema can have fewer columns than the number of\npredicates in the ScanSpec. This happens because a lower-level iterator,\nCFileSet::Iterator::OptimizePKPredicates(), can lift additional predicates\nfrom a rowset\u0027s primary key bounds onto key columns that are not part of\nthe scan projection. It is most pronounced for counting scans whose\nprojection is empty or tiny.\n\nIn that case MaterializingIterator::Init() computed:\n\n  non_predicate_column_indexes_.reserve(\n      num_columns - spec-\u003epredicates().size());\n\nwhere num_columns is int32_t and predicates().size() is size_t. When\nnum_columns \u003c predicates().size() the subtraction is evaluated in unsigned\narithmetic and wraps to a value near SIZE_MAX, so vector::reserve() throws\nstd::length_error. The exception is not caught, so the tablet server\naborts with SIGABRT. The preceding DCHECK_GE(num_columns,\npredicates().size()) encodes an invariant that does not actually hold and\nis compiled out in release builds.\n\nThis patch:\n - removes the invalid DCHECK_GE;\n - reserves an upper bound (num_columns) instead of the difference, which\n   cannot underflow;\n - skips predicates whose column is not in the projection rather than\n   returning InvalidArgument. Such predicates are derived from the\n   rowset\u0027s primary key bounds and are already enforced by the key range,\n   so skipping them here is safe.\n\nAlso adds a regression test that initializes a MaterializingIterator with\nmore predicates than projected columns (including a predicate on a column\noutside the projection) and verifies that Init() succeeds and that the\nin-projection predicate still filters correctly.\n\nChange-Id: I646ab64c2139b37c7e29152695805bf28ef1dd20\nReviewed-on: http://gerrit.cloudera.org:8080/24439\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "6b1bbe17b8ab938291541389a90c67c358bba716",
      "tree": "62ece0e5a163e02d1850e30a6730b57a9ed28a6f",
      "parents": [
        "0b45a5f213f86976667a3b67ca38691e46a0ae68"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Wed Apr 29 14:33:48 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Jun 12 08:15:17 2026 +0000"
      },
      "message": "KUDU-3767 Add global leader awareness to auto leader rebalancer (Part 1)\n\nThe leader rebalancer processes tables independently, so when picking\na destination for a leader transfer it only considers per-table leader\ndensity. If two follower tservers score equally on that metric, the\nchoice is driven by iteration order, which can consistently favour the\nsame tserver across many tables.\n\nThis patch threads a global leader count map through the per-table\nloop. Each call to RunLeaderRebalanceForTable accumulates actual leader\ncounts from the current table and updates the map as moves are planned.\nWhen two destination candidates have the same per-table score, the one\nwith the lower global leader count is preferred, steering transfers\naway from tservers that are already carrying more leaders from earlier\ntables in the same round.\n\nThis is part 1 of this addition; part 2 will be a follow-up change\nadding a post-loop global pass to detect and correct tservers that are\nglobally overloaded even when per-table balance is already achieved.\n\nChange-Id: I47e266d2a06d5c18a50270e0d5e9d4954480f308\nReviewed-on: http://gerrit.cloudera.org:8080/24246\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "0b45a5f213f86976667a3b67ca38691e46a0ae68",
      "tree": "69af4224855d1abfbcd5c220071b9f3aa6b0abbd",
      "parents": [
        "00d42c47aba225b36cc0f56485163d6976969979"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Jun 10 15:17:44 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Jun 11 01:24:26 2026 +0000"
      },
      "message": "KUDU-3781 one more test scenario for HMS Thrift TLS support\n\nThis changelist adds one more test scenario to be explicit on the\nKudu HMS Thrift client\u0027s behavior when TLS support is enabled only\nat the server side.  The client attempts to talk to the HMS server\nwithout enabling TLS on its side, but turning on other types of\nprotection mechanisms provided by SASL such as authentication,\nintegrity, privacy.\n\nThis patch does not contain any functional modifications.\n\nChange-Id: I47ab8e25507d115250fd18fcc0ff128526d4d99c\nReviewed-on: http://gerrit.cloudera.org:8080/24436\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "00d42c47aba225b36cc0f56485163d6976969979",
      "tree": "7bfe5ecfb8be6d2198e225d32adee5ed35cd27cf",
      "parents": [
        "c968d85cc9d5ea18cbabf7464cb48bbec51a63a6"
      ],
      "author": {
        "name": "Anu Sudarsan",
        "email": "anu.sudarsan@starburstdata.com",
        "time": "Wed Jun 10 14:43:41 2026 -0400"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Jun 10 23:25:41 2026 +0000"
      },
      "message": "Bump netty to 4.1.135.Final\n\nThis is for fixing the multiple CVEs reported in the scanner used by our Java upstream project which uses the client\nNetty codec-http vulnerability\nNetty codec-mqtt vulnerability\nNetty codec-redis vulnerability\nNetty handler-proxy vulnerability\n\nChange-Id: I42ebbcdb1d91d6d69fa44b416c94fcf16b4d2e27\nReviewed-on: http://gerrit.cloudera.org:8080/24434\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "c968d85cc9d5ea18cbabf7464cb48bbec51a63a6",
      "tree": "7f70a80aa993c1c82a4379b7c7debea39c2ef86f",
      "parents": [
        "39dfd48de0fee9e8b74a561f91a8838893d7c44e"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Tue Jun 09 21:09:43 2026 +0530"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Jun 09 20:01:25 2026 +0000"
      },
      "message": "[subprocess] Fix buffer over-read/overflow in message discard\n\nSubprocessProtocol::DoReadAndDiscard() clears an oversized message off\nthe communication channel using a fixed 4K stack buffer, but bounded\neach read() with std::max\u003cssize_t\u003e(rem, sizeof(buf)) instead of\nstd::min(). Since this returns the greater of the two, the read length\nis never held to the buffer size. This causes two issues:\n* Stack buffer overflow: when the discarded payload is larger than\n  4K (say, 8K message), a single read() is asked to copy up to \u0027rem\u0027\n  bytes into the 4K buffer, smashing the stack.\n* Valid message subsumption: when the oversized payload is smaller than\n  4K, the read still pulls up to 4K, over-reading into and consuming the\n  following well-formed message. The next ReceiveMessage() then loses\n  that message, breaking the \"discard to re-sync the channel\" guarantee.\n\nThe bug has existed since DoReadAndDiscard() was introduced in KUDU-3450.\nThe patch fixes it by limiting each read to std::min(rem, sizeof(buf)),\nmatching the Java implementation in doReadAndDiscard.\n\nAdd two unit tests covering both scenarios: a deterministic over-read\nand an oversized-payload overflow test.\n\nChange-Id: I73da816132555cb3d29b7bbf8a6821ad3f2dec9c\nReviewed-on: http://gerrit.cloudera.org:8080/24427\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "39dfd48de0fee9e8b74a561f91a8838893d7c44e",
      "tree": "6dea8957005517b932738605a962757f9d90c493",
      "parents": [
        "43dc5b1fea55e2b819205a7962c083ddf34884f3"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Jun 08 19:05:09 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Jun 09 14:03:13 2026 +0000"
      },
      "message": "[consensus] one dependency less for consensus_metadata_proto\n\nThis removes unnecessary fs_proto item from the dependency list\nof the consensus_metadata_proto library.\n\nThis patch does not contain any functional modifications.\n\nChange-Id: I926447729420917463649ca8a7370932a1857891\nReviewed-on: http://gerrit.cloudera.org:8080/24421\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "43dc5b1fea55e2b819205a7962c083ddf34884f3",
      "tree": "73fe9948e3fd4cac0aa982e30729251f19f3d150",
      "parents": [
        "1f2e0ae1b3166b31625eef7611aeda61bf5c9726"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Thu May 07 14:28:53 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Jun 09 14:00:27 2026 +0000"
      },
      "message": "KUDU-3732 Get consensus state from CatalogManager in auto-rebalancer\n\nAutoRebalancerTask::CheckMoveCompleted() previously issued a\nGetConsensusState RPC to the tablet leader on every polling cycle\nto check whether a replica move had completed. Replace this RPC with\na read from CatalogManager, which is populated via tserver-to-master\nheartbeats.\n\nExecuteMoves now records the committed config opid_index from\nCatalogManager before sending BulkChangeConfig, storing it in\nReplicaMove.config_opid_idx. CheckMoveCompleted uses this as a\nfreshness gate: if the opid_index in CatalogManager has not advanced\npast the stored value, the heartbeat carrying the new config has not\nyet arrived and the check waits rather than applying completion or\nerror logic.\n\nAdd CatalogManager::GetTabletConsensusState() to expose the\ncommitted consensus state from the in-memory tablet map.\n\nChange-Id: Iba021539fbfaca5905fbbf4abbb6e2a61db1f7dc\nReviewed-on: http://gerrit.cloudera.org:8080/24285\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "1f2e0ae1b3166b31625eef7611aeda61bf5c9726",
      "tree": "81267bd72535f4a1a0615fd3eb25b2f37cdda5f1",
      "parents": [
        "3638b3814e36cbcb90ebfbf02dbbfaf7a0d70843"
      ],
      "author": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@apache.org",
        "time": "Mon Jun 01 21:41:29 2026 -0700"
      },
      "committer": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@cloudera.com",
        "time": "Mon Jun 08 17:40:31 2026 +0000"
      },
      "message": "[Java] Upgrade SLF4J to 2.0.17 and migrate to log4j-slf4j2-impl\n\n- Upgrade the global SLF4J framework from 1.7.36 to 2.0.17\n- Rename and upgrade \u0027log4j-slf4j-impl\u0027 to \u0027log4j-slf4j2-impl\u0027 in\n  dependencies.gradle.\n- Update implementation, compileOnly, and shadowJar settings across\n  all submodules (kudu-client, kudu-spark, kudu-subprocess,\n  kudu-test-utils, etc.).\n- Remove the log4j-slf4j provider from the \u0027kudu-backup\u0027 test\n  runtime path to prevent a circular loop conflict with LogCaptor\u0027s\n  underlying Logback framework during tests.\n\nChange-Id: Id4dedfa6e4a7a8b1c2c21ebfff91b3513ddfb1f2\nReviewed-on: http://gerrit.cloudera.org:8080/24390\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "3638b3814e36cbcb90ebfbf02dbbfaf7a0d70843",
      "tree": "e90dae8a38f5ebd9c6c69f816adcf67969d7de93",
      "parents": [
        "e5519e57bdb91005f7ffb5eaca841029259ef5f9"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Tue May 19 12:17:59 2026 +0530"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Mon Jun 08 14:22:11 2026 +0000"
      },
      "message": "KUDU-3429 Make rows per block flag based (1/n)\n\nConvert hard-coded kRowsPerBlock to a flag based variable that can be\nused and modified by tests at runtime to control memory usage during\nrowset compaction.\n\nMajorDeltaCompaction and MinorDeltaCompaction also have their own\nkRowsPerBlock. The patch doesn\u0027t modify those to flags.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nChange-Id: I65f1e0d91e718b097bcc6e3979f246a13a618edf\nReviewed-on: http://gerrit.cloudera.org:8080/24328\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "e5519e57bdb91005f7ffb5eaca841029259ef5f9",
      "tree": "e97870f82b4fa201bdda7ba360ad0094a3a50374",
      "parents": [
        "fc27ecbedf0481c7ed77b0c2cd295b9f0af8efea"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed May 27 21:07:15 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Jun 04 17:15:24 2026 +0000"
      },
      "message": "KUDU-3781: add TLS transport support for HMS client\n\nWith this patch, the Thrift client used for communication between\nKudu masters and Hive Metastore can protect its connections with TLS.\n\nA few new flags have been introduced:\n  --hive_metastore_tls_enabled (default: false)\n  --hive_metastore_tls_trusted_ca_cert_file (default: \"\")\n  --hive_metastore_tls_use_https_trusted_ca_cert (default: true)\n\nIf the latter is set to \u0027true\u0027, the trusted CA certificates are sourced\nfrom the location where --trusted_certificate_file points to, i.e. the\nsame trusted CA information is used for HTTPS-based API connections\n(KMS, JWKS, etc.) and HMS Thrift connections.  Otherwise, the trusted CA\ncertificate to validate HMS server certificate is sourced from the file\npointed to by the --hive_metastore_tls_trusted_ca_cert_file flag.\n\nIf no trusted CA certificates are provided for the Thrift HMS client,\nthe HMS server certificate must be verifiable using the system-wide\ntrusted CA certificate bundle.  Otherwise, TLS handshake between the\nKudu HMS client and the target HMS Thrift server fails, and the client\ncannot talk to the HMS.\n\nTo provide proper handling of situations where the trusted CA\ncertificate file is absent or contains invalid data and satisfy the\nrequirements of HaClient high-availability wrapper, the HmsClient\u0027s\ninstantiation scheme changed to factory-based approach returning the\nresult instance allocated on the heap and wrapped into std::unique_ptr.\nIf the trusted CA certificate file is absent or contain invalid data,\nHmsClient cannot be instantiated.\n\nTo cover the new functionality:\n  * a few new scenarios are now present in hms_client-test.cc and\n    a few are parameterized with TLS support enabled/disabled\n  * most of scenarios in hms_catalog-test.cc\n    are now parameterized with TLS support enabled/disabled\n  * most of scenarios in master_hms-itest.cc\n    are now parameterized with TLS support enabled/disabled\n\nChange-Id: I9658323ed9aebdfdf8e6847c9c3129f5c8517c65\nReviewed-on: http://gerrit.cloudera.org:8080/24383\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Attila Bukor \u003cabukor@apache.org\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "fc27ecbedf0481c7ed77b0c2cd295b9f0af8efea",
      "tree": "79e95b608f77d028afbf0d04210d40c1b9746b9a",
      "parents": [
        "60ded710ed6f5f4abff063ca63516e05079ddaac"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri May 29 21:34:02 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Jun 02 01:41:57 2026 +0000"
      },
      "message": "KUDU-3781: upgrade Thrift from 0.21.0 to 0.23.0 with recent patches\n\nThere were several CVEs with the Apache Thrift project published\nrecently and addressed in version 0.23.0 [1]:\n  * CVE-2026-43869\n  * CVE-2026-43868\n  * CVE-2026-43870\n  * CVE-2026-41603\n  * CVE-2026-41602\n  * CVE-2026-41604\n  * CVE-2026-41605\n  * CVE-2026-41606\n  * CVE-2026-41607\n  * CVE-2025-48431\n  * CVE-2026-41636\n\nEven none of the CVEs above seem to affect the Thrift C++ client\nthat Kudu uses for communication with HMS, it\u0027s a good idea to update\nthe library and keep automated security scanners happy.\n\nI also picked up recent updates on the C++ library on top of 0.23.0\nrelease from the Apache Thrift git repo that look related to security\nfixes:\n  * https://github.com/apache/thrift/commit/e96bc4015\n  * https://github.com/apache/thrift/commit/c1457c69f\n  * https://github.com/apache/thrift/commit/5748bbb6b\n  * https://github.com/apache/thrift/commit/e3c8c534c\n\nc1457c69f is the only update that might be attributed to the JIRA item\nin the summary since it addresses an issue in TSSLSocket related to\nthe wildcard name matching in TLS certificates.\n\n[1] https://app.opencve.io/cve/?product\u003dthrift\u0026vendor\u003dapache\n\nChange-Id: Idc1e7e10f92f4a078878a6861c3448aea45453a9\nReviewed-on: http://gerrit.cloudera.org:8080/24384\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "60ded710ed6f5f4abff063ca63516e05079ddaac",
      "tree": "eb8010e7abbaeb8c64cd519aae4e589fb00e429a",
      "parents": [
        "94b246ae31c71ed6a660d966b984e84c8fc3d314"
      ],
      "author": {
        "name": "Zoltan Chovan",
        "email": "zchovan@cloudera.com",
        "time": "Thu May 28 13:03:55 2026 +0300"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri May 29 17:13:00 2026 +0000"
      },
      "message": "KUDU-3781: Add TLS support to MiniHms\n\nThis change adds the functionality of generating a PKCS12 keystore for\nthe MiniHms when TLS is enabled and wires the generated keystore into\nthe HMS configuration.\n\nAdded a very simple test for sanity checking, to confirm that the\nHMS configs are properly generated, this should be replaced by a more\ndetailed test, when the HMS client TLS support is added.\n\nAdditionally, ExternalMiniClusterOptions and ExternalMiniCluster were\nextended to support the added functionality.\n\nChange-Id: I8fca647fd900fafc6d737c93a4af4565631839b7\nReviewed-on: http://gerrit.cloudera.org:8080/24374\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "94b246ae31c71ed6a660d966b984e84c8fc3d314",
      "tree": "9cfd2349a0ebefbda2cf992e0716832794acfc7c",
      "parents": [
        "43e84f1101c143e0ada17c442e805a8a71c2c6d8"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Mon May 18 14:22:58 2026 +0800"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu May 28 11:09:14 2026 +0000"
      },
      "message": "KUDU-3778 [fs] speed up LBM startup by replaying small metadata files from memory\n\nOn startup, LogBlockContainerNativeMeta::ProcessRecords replays a\ncontainer\u0027s .metadata file through ReadablePBContainerFile::ReadNextPB,\nwhich issues two pread() syscalls per record. The total number of read\nsyscalls during container loading is therefore proportional to the\nnumber of records across all containers, and on a tserver with many\ncontainers each holding many records this turns the loading phase into\na long stream of tiny sequential reads against the kernel.\n\nAdd an opt-in fast path: when the payload fits in a configurable\nbudget, read the file once into a faststring and let\nReadablePBContainerFile parse it through an in-memory RandomAccessFile\nshim. This collapses the per-record preadv pair into a single bulk\nread per container, so the number of read syscalls during startup\ndrops from O(total records) to O(number of containers). Any IO error\nor oversized file falls back to the existing streaming reader, so\nthe optimization can only help and never break startup.\n\nThe fast path is gated by\n--log_container_metadata_inmem_replay_threshold_bytes (default 64 MiB,\nruntime/advanced/experimental); set it to 0 to disable.\n\nEncryption is intentionally left on the streaming path.\n\nBenchmarks (release build, KUDU_ALLOW_SLOW_TESTS\u003d1,\n`log_block_manager-test --gtest_filter\u003d\u0027*InMemoryReplayStartupBenchmark*\u0027`,\n5 reopens per pass, native-meta containers, encryption disabled):\n\n\"streaming\" \u003d --log_container_metadata_inmem_replay_threshold_bytes\u003d0,\n\"in-memory\" \u003d --log_container_metadata_inmem_replay_threshold_bytes\u003d64MiB.\n\n  Workload scale (batches x blocks/batch, dirs, 90% deletion):\n    200 x 500,    4 dirs ( 10k live):  154 ms -\u003e 66 ms  (2.33x, -57%)\n    500 x 1000,  8 dirs ( 50k live):  811 ms -\u003e 394 ms (2.06x, -51%)\n    1000 x 1000, 8 dirs (101k live): 1643 ms -\u003e 817 ms (2.01x, -50%)\n\n  Deletion-ratio sweep (500k writes, 500x1000 / 8 dirs):\n    deleted\u003d0%  (500k records, 500k live): 597 ms -\u003e 379 ms (1.58x)\n    deleted\u003d50% (750k records, 250k live): 734 ms -\u003e 416 ms (1.76x)\n    deleted\u003d90% (950k records,  50k live): 806 ms -\u003e 388 ms (2.08x)\n    deleted\u003d99% (995k records,   5k live): 836 ms -\u003e 386 ms (2.17x)\n  The streaming-path time scales with total records (creates+deletes); the\n  in-memory-path time is nearly flat across deletion ratios (379-416 ms).\n  That is exactly the \"O(records) preadv syscalls -\u003e O(containers) bulk\n  reads\" collapse this patch targets.\n\n  Container-density sweep (500x1000 / 8 dirs / 90% deletion, all 50k live;\n  numbers are steady-state, the first reopen of a fresh on-disk layout is\n  excluded as it is dominated by cold page-cache):\n    log_container_max_blocks\u003d-1:    788 ms -\u003e 384 ms (2.05x)\n    log_container_max_blocks\u003d10000:  38 ms -\u003e  23 ms (1.65x)\n    log_container_max_blocks\u003d1000:   28 ms -\u003e  22 ms (1.27x)\n  The optimization\u0027s absolute and relative gain both grow with the number\n  of records per container, as expected: each container\u0027s per-record\n  preadv() pair is replaced by a single bulk read at open time.\n\nReal-world perf trace:\n\nBefore (streaming, two preadv() per record):\n  7 metadata worker threads each issued ~4.2 M preadv() calls,\n  totaling ~30.8 M preadv() syscalls in ~35 s of per-thread kernel\n  time (~294 s summed across threads). preadv avg syscall duration: 8 us.\n  perf trace itself reported \"LOST \u003cn\u003e events!\" thousands of times\n  during this window, i.e. the syscall rate overran the perf ring\n  buffer.\n\nAfter (in-memory replay,\n --log_container_metadata_inmem_replay_threshold_bytes\u003d64MiB):\n  the same 7 worker threads issued 17-109 preadv() calls each,\n  totaling 358 preadv() syscalls (the file-management thread did an\n  additional ~7.7K preadv() on non-metadata files in both runs and is\n  unchanged). preadv avg syscall duration rose to 60-130 ms because\n  each call now slurps a whole ~8 MiB metadata file in one go,\n  but per-thread preadv() wall time dropped from ~35 s to ~5-6.5 s.\n  perf trace reported zero event loss.\n\nChange-Id: Iacbe12977ae945e7fa2f97a41aef250b03495cd4\nReviewed-on: http://gerrit.cloudera.org:8080/24326\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "43e84f1101c143e0ada17c442e805a8a71c2c6d8",
      "tree": "32a3c2ad910ce86fc7c09bc00f9019868a611af4",
      "parents": [
        "1a048343ec7587d70c29313e25a4ccba872f7108"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed May 27 22:50:44 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu May 28 10:14:28 2026 +0000"
      },
      "message": "KUDU-3781: build 3rd-party Thrift with OpenSSL support\n\nIn the context of the JIRA ticket it\u0027s necessary to use TLS/SSL-related\nentities in the Thrift C++ library, and those are available only\nwhen configuring the library to be built with OpenSSL support.\nThis patch explicitly enables OpenSSL support for the Thrift\nlibrary by adding -DWITH_OPENSSL\u003dON for cmake invocation.\n\nAlso, add an extra flag to be explicit that the compiler supports\nat least C++17 and remove obsolete -DWITH_PLUGIN macro.\n\nP.S. I\u0027m planning to update the library up to 0.23.0 version\n     in a follow-up changelist: there were multiple security\n     vulnerabilities published recently\n\nChange-Id: If8bb4ad61b57546c3c0c9ced0f1b9b3aabac183c\nReviewed-on: http://gerrit.cloudera.org:8080/24373\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nTested-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "1a048343ec7587d70c29313e25a4ccba872f7108",
      "tree": "394715bcee2356f829c68f7c79376c154a1bf8c2",
      "parents": [
        "6ab30abe247627112ff04a64b5a6481277dc607a"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 19 21:59:14 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 26 17:19:28 2026 +0000"
      },
      "message": "KUDU-1865 reduce cross-thread allocations in RPC (part 2)\n\nWith this update, the OutboundCall::call_response_ member field\nof the CallResponse type is no longer allocated on the heap.  Instead,\nit\u0027s allocated on the stack and the move semantics is used to pass\nthe object around.\n\nI ran the same test scenario as in the \u0027part 1\u0027 to trace the asymmetry\nin tcmalloc\u0027s cross-thread allocations/deallocations and confirmed\nthat the entries related to CallResponse were gone.\n\nI also ran the test scenario to account for the total number of updates\nin tcmalloc\u0027s central free lists.  This patch results in ~1.07x times\nreduction in the total number of updates in the central free lists with\nthe default setting of TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES:\n\n  before: 367\n  after:  341\n\nThe requests-per-second performance hasn\u0027t changed per reports from\nthe RpcBench.BenchmarkCalls scenario.\n\nChange-Id: Ia5b8771f4092d5e566e91b7c7fdbf560c5fd3851\nReviewed-on: http://gerrit.cloudera.org:8080/24329\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Michael Smith \u003cmichael.smith@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "6ab30abe247627112ff04a64b5a6481277dc607a",
      "tree": "1112fedf24badfc4e7b37fea152100268da39371",
      "parents": [
        "66827b15b158c37363c37baa160f29a0ca1f1e63"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 12 23:33:10 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed May 20 16:21:16 2026 +0000"
      },
      "message": "KUDU-1865 reduce cross-thread allocations in RPC (part 1)\n\nThis patch was originally posted by Todd [1].  I\u0027m re-posting it\nre-based and updated -- that\u0027s the best path forward; otherwise,\nthere are too many conflicts if trying to re-base and revv the\noriginal patch in gerrit [1].\n\nTo verify that the number of cross-thread allocations is reduced with\nthis patch, I ran the target rpc-bench test scenario under customized\nenvironment to trace tcmalloc allocations/deallocations, and then used\nthe Python script attached to KUDU-1865 ticket (updated a bit) to track\ncross-thread allocations/deallocations in tcmalloc:\n\n  env TCMALLOC_TRACE\u003d1 \\\n    TCMALLOC_STACKTRACE_METHOD\u003dgeneric_fp \\\n  ./bin/rpc-bench \\\n    --server_reactors\u003d1 \\\n    --client_threads\u003d1 \\\n    --run_seconds\u003d1 \\\n    --gtest_filter\u003d\u0027*BenchmarkCalls\u0027\n\nThe results confirm that all the malloc/free asymmetry related to\nReactorTask objects is now gone.  I\u0027m planning to take care of\nthe rest of allocation/de-allocation asymmetry in hot RPC paths\nin follow-up patches.\n\nI ran the same test scenario with different parameters under a custom\nenvironment to evaluate the total number of calls that lead to acquiring\nlocks guarding the per-size-classes\u0027 central free lists in tcmalloc.\nI did so with the default and customized setting for the\nTCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES environment variable.  The\ncustomization allowed to induce more activity on tcmalloc\u0027s central\nfree lists since the sizes of the free lists were shorter than with the\ndefault setting.\n\nThe results of running rpc-bench under the perf utility on 8 CPU-core\nmachine are below.  There is an improvement:\n  * ~1.37x times reduction in the total number of calls to the free lists\n    with the default setting of TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES\n  * ~1.06x times reduction in the total number of calls to the free lists\n    with the custom setting of TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES\n\nAs for requests-per-second performance, the improvement is minuscule.\nThe target test scenario doesn\u0027t create enough memory pressure and\nconcurrency to get to the point where too much of lock contention in\ntcmalloc significantly affects RPC performance.\n\n  export TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES\u003d1048576\n\n  perf record -g -e \u0027syscalls:sys_enter_futex\u0027 \\\n  ./bin/rpc-bench \\\n    --gtest_filter\u003d\u0027*BenchmarkCalls\u0027 \\\n    --server_reactors\u003d2 \\\n    --client_threads\u003d4 \\\n    --worker_threads\u003d2 \\\n    --run_seconds\u003d60\n\n  perf script | \\\n    grep -E \u0027tcmalloc::ThreadCache::(FetchFrom|ReleaseTo)CentralCache\u0027 | \\\n    wc -l\n\nTCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES unset (using default tcmalloc setting):\n  before:       499     488     491\n  after:        373     328     376\n\nTCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES\u003d1048576\n  before:       13794   12727   12215\n  after:        12695   12137   11857\n\n[1] https://gerrit.cloudera.org/#/c/5905/\n\nChange-Id: I86a2acbd1d8cb724728034c4e91907c99cbfe32e\nReviewed-on: http://gerrit.cloudera.org:8080/24305\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Michael Smith \u003cmichael.smith@cloudera.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "66827b15b158c37363c37baa160f29a0ca1f1e63",
      "tree": "c2a382c7ff31be0a85bdd5e47ce196199c0b321d",
      "parents": [
        "c037ba5884c705d2e1bc327c8109719289abe50b"
      ],
      "author": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@apache.org",
        "time": "Thu Apr 23 16:34:40 2026 -0700"
      },
      "committer": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@cloudera.com",
        "time": "Sun May 17 05:28:59 2026 +0000"
      },
      "message": "KUDU-3762 - Fix catchup deadlock on LMP mismatch\n\nA Raft leader could enter an infinite LMP mismatch loop if it erroneously\nmarked a peer as unrecoverable (wal_catchup_possible \u003d false). In this\nstate, RequestForPeer() skips log-position negotiation and sends status\nupdates at the log tip. If the peer is behind, it rejects the request,\ntriggering an immediate retry loop that consumes CPU and prevents catchup.\n\nThis patch introduces is_joining_existing_cluster_ in CatalogManager to\nsilence heartbeats and background tasks during the join phase. Explicitly\nshuts down the system catalog tablet before initiating AddMaster() to\nprevent the leader from seeing a stale Index 0 state.\n\nTesting:\n- Added a test case to reproduce the issue.\n- Verified the fix resolves the loop and allows the new master to become\n  a voter.\n\nChange-Id: I00f4f840c21cc037a2aa6c023af168352fef0761\nReviewed-on: http://gerrit.cloudera.org:8080/24287\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "c037ba5884c705d2e1bc327c8109719289abe50b",
      "tree": "5d83d50bc363f1ae649cc6e6287d678f7528b1bf",
      "parents": [
        "8882db7bd58d6fbdfd06a85b979a44fe4bce14d9"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri May 15 11:19:23 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri May 15 23:55:35 2026 +0000"
      },
      "message": "KUDU-3216 fix flakiness in LeadershipChangeOnTskGeneration (take 2)\n\nThe DeleteTable RPC needs the same treatment as CreateTable\nwhen the system catalog often changes its leadership.  Otherwise, the\ntest scenario might fail with the following error:\n\n  src/kudu/integration-tests/catalog_manager_tsk-itest.cc:164: Failure\n  Failed\n  Bad status: Service unavailable: an error occurred while updating the sys-catalog: leader is not yet ready\n\nThis is a follow-up to [1] (git changelist [2]).\n\n[1] http://gerrit.cloudera.org:8080/21397\n[2] https://github.com/apache/kudu/commit/ca56ee56e\n\nChange-Id: Ia00b11e64fe8099fc0f51b7996be2d5d5c4fbb44\nReviewed-on: http://gerrit.cloudera.org:8080/24312\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "8882db7bd58d6fbdfd06a85b979a44fe4bce14d9",
      "tree": "73a3c748b51d15d4cb22b3f49ce2aa731a9f07e7",
      "parents": [
        "3e42c0e7dc2199f80eabd0413e53de79e3940f1b"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed May 06 17:14:40 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu May 14 11:46:29 2026 +0000"
      },
      "message": "KUDU-3693: Add bearer token auth for Prometheus\n\nPrometheus does not support SPNEGO, so scraping a secured Kudu cluster\nrequires an alternative authentication mechanism. Add\n--webserver_prometheus_token_cmd: when set, designated Prometheus\nendpoints (/metrics_prometheus, /prometheus-sd) accept an\n\"Authorization: Bearer \u003ctoken\u003e\" header as an alternative to SPNEGO.\nThis allows Prometheus scrapers to authenticate on an otherwise\nSPNEGO-secured cluster. Clients that do support SPNEGO (e.g.\ncurl --negotiate, Knox Gateway) can continue to use it on these\nendpoints as before.\n\nAdds unit tests in webserver-test.cc and integration tests in\nprometheus_auth-itest.cc covering correct, wrong, and missing\ntoken scenarios for both scrape and SD endpoints.\n\nExample Prometheus configs for using the Bearer token:\n\nStatic scrape config:\n    global:\n    scrape_configs:\n    - job_name: kudu\n        metrics_path: /metrics_prometheus\n        scrape_interval: 2s\n        authorization:\n        type: Bearer\n        credentials: \u003cwebserver_prometheus_token\u003e\n        static_configs:\n        - targets:\n            - 127.0.0.1:8050\n            - 127.0.0.1:8051\n            - 127.0.0.1:8052\n\nSD scrape config:\n    global:\n    scrape_configs:\n    - job_name: kudu\n        metrics_path: /metrics_prometheus\n        scrape_interval: 2s\n        authorization:\n        type: Bearer\n        credentials: \u003cwebserver_prometheus_token\u003e\n        http_sd_configs:\n        - url: http://127.0.0.1:8050/prometheus-sd\n            refresh_interval: 2s\n            authorization:\n            type: Bearer\n            credentials: \u003cwebserver_prometheus_token\u003e\n        - url: http://127.0.0.1:8051/prometheus-sd\n            refresh_interval: 2s\n            authorization:\n            type: Bearer\n            credentials: \u003cwebserver_prometheus_token\u003e\n        - url: http://127.0.0.1:8052/prometheus-sd\n            refresh_interval: 2s\n            authorization:\n            type: Bearer\n            credentials: \u003cwebserver_prometheus_token\u003e\n\nChange-Id: If8169196a2c49d64865095f3bc6da1d3bfbcecfb\nReviewed-on: http://gerrit.cloudera.org:8080/24278\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "3e42c0e7dc2199f80eabd0413e53de79e3940f1b",
      "tree": "6e325d8586f29ebe8f28b42f82385527c866d14f",
      "parents": [
        "16079e32d104c6b8ae4872c61de991194b899a56"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Mon May 04 17:01:25 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue May 12 13:49:27 2026 +0000"
      },
      "message": "KUDU-3690: Add filtering to /metrics_prometheus\n\nThe /metrics_prometheus endpoint now accepts the same query\nparameters as the /metrics JSON endpoint for filtering:\n\n  ?level\u003d      severity threshold (debug/info/warn)\n  ?types\u003d      entity type (server/tablet/table)\n  ?ids\u003d        entity ID substring\n  ?metrics\u003d    metric name substring\n  ?attributes\u003d key/value pairs for entity attribute matching\n\nMalformed ?attributes\u003d (odd number of values) returns HTTP 400,\nmirroring the existing JSON endpoint behaviour.\n\nChange-Id: I5c0b23ae5c184bf9e33e453736cef5e7ce8ee2e1\nReviewed-on: http://gerrit.cloudera.org:8080/24269\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "16079e32d104c6b8ae4872c61de991194b899a56",
      "tree": "34575ef1bd3db20e55d61112dc8694ecb8562ff8",
      "parents": [
        "2a6d793b9b2aee77c2eb77e92161ba5844a15aec"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Mon May 11 19:18:18 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 12 01:47:13 2026 +0000"
      },
      "message": "[tools] fix `table add_column` failing to add DECIMAL/VARCHAR columns\n\n`kudu table add_column` does not correctly support DECIMAL\nor VARCHAR columns.\n\nThe CLI never forwards precision/scale/length attributes to\nKuduColumnSpec, even though the `table create` JSON path\nalready handles type_attributes correctly in\nParseTableSchema().\n\nThe following invocations currently fail:\n\n    kudu table add_column \u003cm\u003e \u003ct\u003e c DECIMAL\n    kudu table add_column \u003cm\u003e \u003ct\u003e c \"DECIMAL(10,2)\"\n    kudu table add_column \u003cm\u003e \u003ct\u003e c VARCHAR\n\nPropagate precision/scale/length through the AddColumn()\ncode path via three new optional flags:\n--column_precision, --column_scale, and --column_length.\n\nMissing required attributes are now rejected client-side\nwith a clear error message pointing to the required flag,\ninstead of the previous server-side \"no precision provided\"\nerror.\n\nDrive-by: remove \"TIMESTAMP\" from the kDataTypeArg help\ntext. Kudu uses UNIXTIME_MICROS instead, and\nStringToDataType() does not recognize TIMESTAMP.\n\nAdds regression tests covering both DECIMAL and VARCHAR\nsuccess paths, along with missing-attribute validation.\n\nChange-Id: I4cf3cc23d1bc972c48bbc4a579503b13aad47655\nReviewed-on: http://gerrit.cloudera.org:8080/24290\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "2a6d793b9b2aee77c2eb77e92161ba5844a15aec",
      "tree": "a868a65ef406f9ce8d754b21c8973eb0e35abc72",
      "parents": [
        "1aa3a7e0f7ff8bca65864112057d9e0e7b6baaf0"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Thu May 07 21:14:32 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon May 11 19:27:22 2026 +0000"
      },
      "message": "[tools] perf loadgen: support configurable column counts for auto-created table\n\n`kudu perf loadgen` always creates a fixed 3-column table\n(`key INT64 PK`, `int_val INT32`, `string_val STRING`) when --table_name\nis not provided. Benchmarking wide-row workloads currently requires\npre-creating a table out-of-band and pointing loadgen at it via\n--table_name, which is inconvenient for parameter sweeps over column\ncount.\n\nThis patch adds two flags:\n\n  --table_num_int_columns    (default 1)\n  --table_num_string_columns (default 1)\n\nWhen both default to 1 the auto-created schema is byte-for-byte\nidentical to before (column names `int_val`, `string_val` are\npreserved). Setting either to N \u003e\u003d 2 produces N suffix-numbered\ncolumns of that type; 0 omits that column type entirely.\n\nThis patch is intentionally limited to INT32 / STRING column counts.\nDECIMAL precision, VARCHAR length, and encoding are out of scope;\nusers needing those should pre-create a table and pass --table_name.\nThey are noted as possible follow-ups.\n\nChange-Id: I5a1581a7d6056fcb1d7435f29d4670bff68fb147\nReviewed-on: http://gerrit.cloudera.org:8080/24289\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "1aa3a7e0f7ff8bca65864112057d9e0e7b6baaf0",
      "tree": "a3f8101f4eb9c9d5e5b5078aadab73527245954c",
      "parents": [
        "5e476d45c5549828d7d8c3341a0e9459a8a47b97"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Tue Apr 14 18:45:47 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu May 07 08:37:50 2026 +0000"
      },
      "message": "[auto_rebalancer] address TODO in ExecuteMoves()\n\nRemove moves that fail to be scheduled from replica_moves\ninstead of early-returning on the first error. The old code\nused RETURN_NOT_OK inside a const-ref loop, leaving unscheduled\nmoves in the vector and causing CheckReplicaMovesCompleted to\nwait on them indefinitely.\n\nExecuteMoves now takes replica_moves by pointer and handles each\nfailure per-move: log a warning and erase the move before\nreturning, so only successfully submitted moves remain.\n\nChange-Id: I6a356c52f940827075a564ab3d03e082f02a1d61\nReviewed-on: http://gerrit.cloudera.org:8080/24191\nTested-by: Kudu Jenkins\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "5e476d45c5549828d7d8c3341a0e9459a8a47b97",
      "tree": "dec359d7d897e90a4db9bf5617a4a878235681c7",
      "parents": [
        "54bc0b0cb7454006e6380e476f063224cfe77156"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Sat Aug 24 12:39:03 2024 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed May 06 09:15:12 2026 +0000"
      },
      "message": "KUDU-3538: Add Prometheus HTTP service discovery\n\nPrometheus HTTP service discovery enables automatic discovery of all\nKudu Master and TServer instances. This makes setting up monitoring for\nKudu through Prometheus much easier.\n\nThis patch adds a new /prometheus-sd endpoint on Kudu Master servers,\naccording to the Prometheus HTTP SD format [1], [2]. Leader master\nresponds with HTTP-SD JSON describing all Masters and TServers.\nFollower masters return an empty JSON array.\n\nFor example, with 3 Masters and 3 TServers running locally, the leader\u0027s\n/prometheus-sd endpoint returns:\n\n[\n  {\n    \"targets\": [\n      \"127.0.0.1:8765\"\n    ],\n    \"labels\": {\n      \"group\": \"masters\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  },\n  {\n    \"targets\": [\n      \"127.0.0.1:8767\"\n    ],\n    \"labels\": {\n      \"group\": \"masters\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  },\n  {\n    \"targets\": [\n      \"127.0.0.1:8769\"\n    ],\n    \"labels\": {\n      \"group\": \"masters\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  },\n  {\n    \"targets\": [\n      \"127.0.0.1:9875\"\n    ],\n    \"labels\": {\n      \"group\": \"tservers\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  },\n  {\n    \"targets\": [\n      \"127.0.0.1:9873\"\n    ],\n    \"labels\": {\n      \"group\": \"tservers\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  },\n  {\n    \"targets\": [\n      \"127.0.0.1:9871\"\n    ],\n    \"labels\": {\n      \"group\": \"tservers\",\n      \"cluster_id\": \"8d4a5e7e8ac14324aad96630f54f661f\",\n      \"location\": \"n/a\",\n      \"__scheme__\": \"http\"\n    }\n  }\n]\n\nI\u0027ve added basic unit tests to verify the structure of the JSON.\nMoreover, integration tests dedicated to the SD feature have been added.\n\n[1] https://prometheus.io/docs/prometheus/latest/http_sd/#writing-http-service-discovery\n[2] https://training.promlabs.com/training/relabeling/introduction-to-relabeling/hidden-labels-and-metadata/\n\nChange-Id: I931aa72a7567c0dde43d7b7ed53a2dd0fa8bc1fe\nReviewed-on: http://gerrit.cloudera.org:8080/21723\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "54bc0b0cb7454006e6380e476f063224cfe77156",
      "tree": "c6112c4e7f68cfd43d9f6340198acfe6da9c2475",
      "parents": [
        "eebdd0d33b6174df6617b5cef07f32085ac8c475"
      ],
      "author": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@cloudera.com",
        "time": "Thu Jan 29 20:43:12 2026 -0800"
      },
      "committer": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@cloudera.com",
        "time": "Tue May 05 18:45:12 2026 +0000"
      },
      "message": "[build] Include OS version in kudu-binary artifact names\n\nUpdate the naming convention for published Kudu mini-cluster binary\nartifacts. Including the specific OS distribution and major version\nprevents different build environments (e.g., RHEL 8 vs. RHEL 9) from\noverwriting each other in the repository.\n\nUpdate the logic in KuduBinaryJarExtractor.java and the tests\naccordingly. Took the liberty of updating the Kudu version in\nthe test resources of kudu-test-utils.\n\nBefore:\nkudu-binary-1.19.0-SNAPSHOT-osx-x86_64.jar\nkudu-binary-1.19.0-SNAPSHOT-linux-x86_64.jar\n\nAfter:\nkudu-binary-1.19.0-SNAPSHOT-osx15-x86_64.jar\nkudu-binary-1.19.0-SNAPSHOT-rhel9-x86_64.jar\n\nChange-Id: I7f17971704dfec32a0256383bbc3029743b4674f\nReviewed-on: http://gerrit.cloudera.org:8080/23921\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "eebdd0d33b6174df6617b5cef07f32085ac8c475",
      "tree": "4df8f7a4ab6d4becaf4c2fbeb4974e56b756230c",
      "parents": [
        "24c979d5efddcf6d2c5f428c2f9605bbacc9ff4c"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon May 04 18:19:45 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 05 17:54:07 2026 +0000"
      },
      "message": "KUDU-3776 fix sporadic gperftools build failure\n\nI had a build machine where KUDU-3776 was 100% reproducible starting with\na particular state of the 3rd-party workspace.  Without spending time on\nthe detailed RCA, I put together a fix that worked 100% for me at that\nmachine, while the build would fail 100% of the times if starting with\na particular state of the workspace without this patch.\n\nOne of the regular suspects is the incorrect tracking of transitive\ndependencies, but I didn\u0027t see much sense in getting to the bottom of the\nissue, given the new way of building gperftools is more consistent with\nthe build recipe provided in the top-level INSTALL file.\n\nChange-Id: Ie8c26bcc3c2625741cd05b3cc459159434e9d60b\nReviewed-on: http://gerrit.cloudera.org:8080/24272\nTested-by: Kudu Jenkins\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "24c979d5efddcf6d2c5f428c2f9605bbacc9ff4c",
      "tree": "33395207cab817f91754b789b288248a8fdcbd9f",
      "parents": [
        "0ba7f54e15c9f673bf3e350f30b8d5f1a4037b79"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 08 17:24:06 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue May 05 17:52:54 2026 +0000"
      },
      "message": "[rpc] in-bulk memory recycling for Connection::ProcessOutboundTransfers()\n\nWhile troubleshooting RPC performance issues in a highly concurrent\nworkload, I noticed a pattern of lock contention in tcmalloc.  Among\nthe captured stack traces, multiple reactor threads in a single pstack\nsnapshot often had stack traces similar to the one below.\n\nFor more context, the majority of RPCs had relatively large side-cars\nand a single RPC connection often had a multitude of outgoing in-flight\ntransfers.  The socket buffer size was around 128MB at the OS level.\n\nIt seems the issue manifests itself when many concurrent allocations\nand deallocations go through the tcmalloc\u0027s central free list, while\nthe latter is guarded by a lock.  There might be multiple reasons why\nit happens: see [1].  Regardless of the underlying reasons, a reactor\nthread is more efficient if performing as much I/O as possible at once\nwithout the risk of waiting on a synchronization primitive and then\nbeing de-scheduled off the CPU while there is still data ready to be\nwritten into a socket whose buffer isn\u0027t full yet.\n\nThis patch is an attempt to reduce the described lock contention by\nperforming pending socket I/O for all the outgoing transfers first, and\ndeallocating the memory in-bulk after completing all the pending write\nactivity.  In addition, it straightens memory ownership rules for the\nOutboundTransfer::callbacks_ field and modernizes signatures of related\nmethods to use std::unique_ptr instead of raw pointers.\n\n  #0  sys_futex (... \u003ctcmalloc::Static::pageheap_lock_\u003e)\n  #1  base::internal::SpinLockDelay (...)\n  #2  base::internal::SpinLockDelay (...)\n  #3  SpinLock::SlowLock() ()\n  #4  tcmalloc::CentralFreeList::ReleaseToSpans(...) ()\n  #5  tcmalloc::CentralFreeList::ReleaseListToSpans(...) ()\n  #6  tcmalloc::CentralFreeList::InsertRange(...) ()\n  #7  tcmalloc::ThreadCache::ReleaseToCentralCache(...) ()\n  #8  tcmalloc::ThreadCache::ListTooLong(...) ()\n  #9  google::protobuf::internal::ArenaImpl::~ArenaImpl() ()\n  #10 google::protobuf::Arena::~Arena ()\n  #11 kudu::rpc::InboundCall::~InboundCall (...)\n  #12 std::default_delete\u003ckudu::rpc::InboundCall\u003e::operator()\n  #13 std::unique_ptr\u003ckudu::rpc::InboundCall, ...\u003e::~unique_ptr (...)\n  #14 kudu::rpc::ResponseTransferCallbacks::~ResponseTransferCallbacks\n  #15 kudu::rpc::ResponseTransferCallbacks::~ResponseTransferCallbacks (...)\n  #16 kudu::rpc::ResponseTransferCallbacks::NotifyTransferFinished (...)\n  #17 kudu::rpc::OutboundTransfer::SendBuffer (...)\n  #18 kudu::rpc::Connection::ProcessOutboundTransfers (...)\n  #19 kudu::rpc::Connection::QueueOutbound (...)\n  #20 kudu::rpc::QueueTransferTask::Run (...)\n  #21 kudu::rpc::ReactorThread::AsyncHandler (...)\n  #22 ev_invoke_pending ()\n  #23 kudu::rpc::ReactorThread::InvokePendingCb (...)\n  #24 ev_run ()\n  #25 ev::loop_ref::run (...)\n  #26 kudu::rpc::ReactorThread::RunThread (...)\n\nI ran the newly added test with the paramters as below on 8 CPU core\nmachine under perf before and after this patch, 50 iterations each.\nThe idea was to oversubscribe on CPU resources and see how it runs.\n\n  mt-rpc-test --gtest_filter\u003d*Sidecar* \\\n    --mt_rpc_clients_num\u003d12 \\\n    --mt_rpc_iterations_num\u003d32768 \\\n    --mt_rpc_server_reactors_num\u003d4\u0027\n\nbefore:\n  155,551.50 msec task-clock:HG       #    7.020 CPUs utilized  ( +-  0.28% )\n   2,297,600      context-switches:HG #   14.771 K/sec          ( +-  1.44% )\n     243,684      cpu-migrations:HG   #    1.567 K/sec          ( +-  4.37% )\n     118,185      page-faults:HG      #  759.781 /sec           ( +-  0.16% )\n\n      22.159 +- 0.280 seconds time elapsed  ( +-  1.26% )\n\nafter:\n  155,350.60 msec task-clock:HG       #    7.197 CPUs utilized  ( +-  0.21% )\n   2,296,021      context-switches:HG #   14.780 K/sec          ( +-  1.43% )\n     226,160      cpu-migrations:HG   #    1.456 K/sec          ( +-  3.28% )\n     118,243      page-faults:HG      #  761.136 /sec           ( +-  0.15% )\n\n      21.586 +- 0.186 seconds time elapsed  ( +-  0.86% )\n\nThe results of the RPC benchmark scenario run before and after\nthis patch shown no performance degradation:\n\n  rpc-bench --gtest_filter\u003d\u0027*BenchmarkCalls\u0027\n\n[1] https://gperftools.github.io/gperftools/tcmalloc.html\n\nChange-Id: Idf7ab105a851ef4d583efc2d1b33d57607810df0\nReviewed-on: http://gerrit.cloudera.org:8080/24176\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "0ba7f54e15c9f673bf3e350f30b8d5f1a4037b79",
      "tree": "1bb3dc2a683d5bb65bb737a5fe2326d62890233c",
      "parents": [
        "aa7cc0aa9c559b87f264235eaadd03ec492277e4"
      ],
      "author": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@apache.org",
        "time": "Sun Apr 26 14:46:56 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri May 01 19:33:01 2026 +0000"
      },
      "message": "KUDU-3769 Upgrade Ranger from 2.1 to 2.6\n\nThis patch upgrades the Apache Ranger and Ranger KMS dependencies from\n2.1.0 to 2.6.0. To support this upgrade, several adaptations were\nrequired in the Kudu MiniRanger test framework:\n\nRanger Admin \u0026 KMS Classpath:\n- Updated the Ranger KMS classpath to include \u0027ews/lib/*\u0027 and\n  \u0027ews/webapp/WEB-INF/lib/*\u0027. This is required to find the\n  EmbeddedServer class and JAXB dependencies (required for Java 11+)\n  which were moved in the Ranger 2.6.0 directory restructuring.\n\nUser Management:\n- Ranger 2.6.0 now enforces that users must exist in the Ranger\n  database before a policy can be created for them. Updated\n  MiniRanger::AddPolicy to automatically create unique users\n  prior to policy submission.\n\nTest Assertions:\n- Ranger 2.6.0 automatically generates a default \"EXPIRES_ON\" tag\n  policy upon service creation. Updated policy count assertions to\n  use the \u0027?serviceName\u003dkudu\u0027 filter to ensure tests only count\n  explicitly created Kudu policies.\n\nConfigurations:\n- Added \u0027ranger.spnego.kerberos.name.rules\u0027 to support proper\n  principal mapping during Kerberos authentication needed for fetching\n  the policies.\n- Added the mandatory configurations - JPA/JDBC connection properties\n  (timeouts, validation query, and PostgreSQL dialect) to\n  ranger-admin-default-site.xml.\n\nLogging Migration (Log4j to Logback):\n- Ranger 2.6 migrated its internal logging engine from Log4j 1.x to Logback.\n  Consequently, the legacy \u0027log4j.properties\u0027 template was ignored, causing\n  the Ranger Admin server to fall back to default DEBUG logging on stdout,\n  which spammed the test console.\n- Replaced GetRangerLog4jProperties() with GetRangerLogbackXml() to\n  generate a valid Logback configuration.\n\nChange-Id: I0923669abef6512ba9a53b985a3570af9fcc1f19\nReviewed-on: http://gerrit.cloudera.org:8080/24242\nTested-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "aa7cc0aa9c559b87f264235eaadd03ec492277e4",
      "tree": "a51b4fe81de1e01d96a598f2cd525f6a94dfb6ad",
      "parents": [
        "8537ed5bb5e0e6ac1e481ff961e6b9d08cce7671"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Apr 23 18:03:26 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Apr 30 21:19:30 2026 +0000"
      },
      "message": "[rpc] use min priority queue for service queue container\n\nA lot of contention in libtcmalloc might result in longer times spent\nby reactor and RPC worker threads waiting on the lock in RPC service\nqueue when invoking LifoServiceQueue::{Put,BlockingGet}().  Per analysis\nof captured stack traces, the culprit seemed to be a thread that would\nacquire LifoServiceQueue::lock_ while executing LifoServiceQueue::Put()\nto add an element into the queue.  The latter lead to memory\n(de)allocations via tcmalloc that went through the central free list\nperhaps due to exhaustion of the thread cache\u0027s free list.  Meanwhile,\nthe central free list\u0027s lock had already been acquired by some other\nthread performing memory (de)allocation.\n\nIt\u0027s prudent to switch to a container which doesn\u0027t do any dynamic\nmemory allocations while adding and removing elements to/from the\nservice queue.  Using a pre-allocated std::vector instance to maintain\na min priority queue turns to be a good option.  Instead of using direct\nAPI of the std::priority_queue container adaptor, std::push_stack() and\nstd::pop_stack() are used on top of the underlying array/vector to\nhandle an edge case to evict an element while replacing it with the\nnewly arrived one.\n\nVarious scenarios of the dedicated perf benchmark run on a 8 CPU-core\nmachine reported improvement even without artificially induced\ncontention in libtcmalloc.  The service queue length was set to 200.\nWith larger service queue the performance boost was even higher for\nscenarios where the queue often stays full.\n\n  KUDU_ALLOW_SLOW_TESTS\u003d1 ./bin/service_queue-test --num_producers\u003dP --num_consumers\u003dC --max_queue_size\u003d200\n\nBalanced P\u003d4/C\u003d4 scenario reported ~1.56x improvement:\n  before:\n    Reqs/sec:         1288901\n    User CPU per req: 2.89116us\n    Sys CPU per req:  2.71363us\n    Avg rpc queue length: 102.518\n    Avg idle workers:     0\n  after:\n    Reqs/sec:         2022126\n    User CPU per req: 1.9856us\n    Sys CPU per req:  1.78929us\n    Avg rpc queue length: 50.964\n    Avg idle workers:     0.03\n\nBalanced P\u003d3/C\u003d3 scenario reported ~1.30x improvement:\n  before:\n    Reqs/sec:         1470446\n    User CPU per req: 2.3612us\n    Sys CPU per req:  1.37508us\n    Avg rpc queue length: 76.184\n    Avg idle workers:     0\n  after:\n    Reqs/sec:         1917650\n    User CPU per req: 1.97289us\n    Sys CPU per req:  1.0409us\n    Avg rpc queue length: 145.424\n    Avg idle workers:     0\n\nSkewed P\u003d4/C\u003d2 scenario reported ~1.76x improvement:\n  before:\n    Reqs/sec:         1053219\n    User CPU per req: 3.59901us\n    Sys CPU per req:  1.5802us\n    Avg rpc queue length: 194.678\n    Avg idle workers:     0\n  after:\n    Reqs/sec:         1862593\n    User CPU per req: 2.32343us\n    Sys CPU per req:  0.823388us\n    Avg rpc queue length: 194.37\n    Avg idle workers:     0\n\nSkewed P\u003d4/C\u003d3 scenario reported ~1.55x improvement:\n  before:\n    Reqs/sec:         1185783\n    User CPU per req: 3.08805us\n    Sys CPU per req:  2.16397us\n    Avg rpc queue length: 191.486\n    Avg idle workers:     0\n  after:\n    Reqs/sec:         1834414\n    User CPU per req: 2.35371us\n    Sys CPU per req:  1.32012us\n    Avg rpc queue length: 192.042\n    Avg idle workers:     0\n\nSkewed P\u003d3/C\u003d5 scenario reported ~1.29x improvement:\n  before:\n    Reqs/sec:         1622451\n    User CPU per req: 2.081us\n    Sys CPU per req:  1.86138us\n    Avg rpc queue length: 5.072\n    Avg idle workers:     0.104\n  after:\n    Reqs/sec:         2095612\n    User CPU per req: 1.65551us\n    Sys CPU per req:  1.39116us\n    Avg rpc queue length: 6.296\n    Avg idle workers:     0.176\n\nSkewed P\u003d2/C\u003d5 scenario reported ~1.23x improvement:\n  before:\n    Reqs/sec:         1168078\n    User CPU per req: 1.83038us\n    Sys CPU per req:  1.94243us\n    Avg rpc queue length: 0.85\n    Avg idle workers:     0.858\n  after:\n    Reqs/sec:         1436187\n    User CPU per req: 1.57106us\n    Sys CPU per req:  1.56673us\n    Avg rpc queue length: 1.078\n    Avg idle workers:     0.878\n\nChange-Id: I0d95828177ae6458b427ce43dd292877d03065cf\nReviewed-on: http://gerrit.cloudera.org:8080/24230\nTested-by: Kudu Jenkins\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "8537ed5bb5e0e6ac1e481ff961e6b9d08cce7671",
      "tree": "4f100f5fbe3b2a060106e9d560dc9e3d73f56fde",
      "parents": [
        "80f39681e127423fa66f8c177be6c05697ac70dd"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Apr 28 22:23:47 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 29 18:25:17 2026 +0000"
      },
      "message": "[security] update DCHECK in TlsHandshake::Continue()\n\nAt the client side there should be no pending data at rbio upon\nsuccessfully completing TLS handshake.  But in case of TLSv1.3 at\nthe server side there may already be application data encrypted with\nthe session key pending at rbio received along with the client\u0027s\n\"finished\" message.\n\nThis changelist updates DCHECK() in TlsHandshake::Continue() to\naccount for this optimization in TLSv1.3.  With newer versions of\nthe OpenSSL library deployed, various tests started hitting the prior\nversion of DCHECK() with errors like below:\n\n  I20260427 07:23:33.098873 29508 tls_socket-test.cc:108] client: negotiation complete\n  F20260427 07:23:33.101608 29513 tls_handshake.cc:166] Check failed: 0 \u003d\u003d BIO_ctrl_pending(rbio) (0 vs. 960)\n\nChange-Id: I1a54514dcac581e25b701db55faca35ded3e3a50\nReviewed-on: http://gerrit.cloudera.org:8080/24245\nTested-by: Kudu Jenkins\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "80f39681e127423fa66f8c177be6c05697ac70dd",
      "tree": "f915526423fc039c366c5185554797a8f99a23eb",
      "parents": [
        "a2b53295daf0f4b0bffbba27e7c4051f17d391f5"
      ],
      "author": {
        "name": "Abhishek Chennaka",
        "email": "achennaka@apache.org",
        "time": "Sun Apr 26 14:10:44 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Apr 28 17:20:32 2026 +0000"
      },
      "message": "KUDU-3768 Fix service file overwriting in kudu-subprocess JAR\n\nThis patch addresses a build issue in the kudu-subprocess module where\nService Provider Interface (SPI) registration files in META-INF/services\nwere being overwritten during the creation of the Shadow (fat) JAR.\n\nTesting:\n- Verified the kudu-subprocess.jar contains StringProvider in its\n  MessageBodyReader service file.\n- Confirmed the kudu-subprocess no longer throw the below error log:\n\nMar 31, 2026 8:05:51 PM com.sun.jersey.api.client.ClientResponse getEntity\nSEVERE: A message body reader for Java class java.lang.String, and Java type class java.lang.String, and MIME media type application/octet-stream was not found\nMar 31, 2026 8:05:51 PM com.sun.jersey.api.client.ClientResponse getEntity\nSEVERE: The registered message body readers compatible with the MIME media type are:\n*/* -\u003e\n  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General\n  com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General\n  com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General\n  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General\n  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General\n\nThe generated jar diffrences:\njava %  jar tvf /tmp/kudu-subprocess-new/kudu-subprocess-1.19.0-SNAPSHOT.jar|  wc -l\n   54917\njava %  jar tvf /tmp/kudu-subprocess-old/kudu-subprocess-1.19.0-SNAPSHOT.jar|  wc -l\n   54920\njava % stat /tmp/kudu-subprocess-new/kudu-subprocess-1.19.0-SNAPSHOT.jar\n16777234 10323361 -rw-r--r-- 1 abhishekchennaka wheel 0 92210113 \"Apr 26 13:42:14 2026\" \"Apr 26 13:42:14 2026\" \"Apr 26 13:42:14 2026\" \"Apr 26 13:42:14 2026\" 4096 180104 0 /tmp/kudu-subprocess-new/kudu-subprocess-1.19.0-SNAPSHOT.jar\njava % stat /tmp/kudu-subprocess-old/kudu-subprocess-1.19.0-SNAPSHOT.jar\n16777234 10328175 -rw-r--r-- 1 abhishekchennaka wheel 0 92208129 \"Apr 26 13:47:05 2026\" \"Apr 26 13:47:05 2026\" \"Apr 26 13:47:05 2026\" \"Apr 26 13:47:05 2026\" 4096 180096 0 /tmp/kudu-subprocess-old/kudu-subprocess-1.19.0-SNAPSHOT.jar\n\nThe three missing files in the new jar are below (empty placeholder files):\n0 Sun Apr 26 13:42:46 PDT 2026 META-INF/services/\n0 Wed May 24 15:46:46 PDT 2017 META-INF/services/com.sun.jersey.server.impl.model.method.dispatch.ResourceMethodDispatchProvider\n0 Wed May 24 15:46:46 PDT 2017 META-INF/services/com.sun.jersey.spi.container.ContainerResponseFilter\n\nThe MessageBodyReader now contains the combined list (jersey-core, jersey-json, jersey-client, and others), hence the size difference:\njava %  jar tvf /tmp/kudu-subprocess-new/kudu-subprocess-1.19.0-SNAPSHOT.jar|  grep \"META-INF/services/javax.ws.rs.ext.MessageBodyReader\"\n  5584 Thu Apr 23 23:25:32 PDT 2026 META-INF/services/javax.ws.rs.ext.MessageBodyReader\njava %  jar tvf /tmp/kudu-subprocess-old/kudu-subprocess-1.19.0-SNAPSHOT.jar|  grep \"META-INF/services/javax.ws.rs.ext.MessageBodyReader\"\n   821 Sat Feb 24 20:49:36 PST 2024 META-INF/services/javax.ws.rs.ext.MessageBodyReader\n\nChange-Id: I2677acee77a42b63cb697329fd2e1a424415d52c\nReviewed-on: http://gerrit.cloudera.org:8080/24241\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "a2b53295daf0f4b0bffbba27e7c4051f17d391f5",
      "tree": "e265f974d5952a519abcffa6cb883ccb76dce750",
      "parents": [
        "d4ec3717eede2449aa7fc23a3b508068ea6fbf3c"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Thu Apr 23 12:16:52 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Apr 28 02:12:08 2026 +0000"
      },
      "message": "[server] aggregate sub-step progress for \"Reading filesystem\"\n\nThe /startup page\u0027s \"Reading filesystem\" parent step is driven by a\nsingle Timer that is started before InitAndOpenBlockManager() and\nstopped after it returns. Its rendered percentage therefore flips\nstraight from 0% to 100%, even though the underlying work (especially\nLogBlockManager::Open()\u0027s per-container LoadContainer() pass) can take\nmany minutes on tablet servers with hundreds of thousands of log block\ncontainers. During that window the UI is misleading: a sibling sub-step\n\"Opening container files\" already shows 100% (see Change-Id: Ia372ad5),\nbut the parent stays at 0%, suggesting nothing is happening.\n\nThis change derives an intermediate percentage for the parent step\nfrom its sub-steps:\n\n  * \"Reading instance metadata files\" (small, fixed weight: 5%)\n  * \"Reading data directories\"        (dominant weight: 95%, driven\n    by the existing containers_processed / containers_total counters\n    when the log block manager is in use)\n\nThe aggregate is clamped to [0, 99] while the parent Timer is still\nrunning so that the parent only transitions to 100% when its own\nTimer is stopped (matching the existing semantics for downstream\nmetrics like startup_progress_steps_remaining).\n\nChange-Id: Id658c9da1399c8a05f28a8a0e7d28a2c81a205c1\nReviewed-on: http://gerrit.cloudera.org:8080/24227\nTested-by: Kudu Jenkins\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "d4ec3717eede2449aa7fc23a3b508068ea6fbf3c",
      "tree": "bd011dd571d638c0a3330b084eec22ec02d77702",
      "parents": [
        "80873c98b5cc5110e611dd6180cfac12549e84f6"
      ],
      "author": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Tue Apr 21 23:29:37 2026 +0200"
      },
      "committer": {
        "name": "Attila Bukor",
        "email": "abukor@apache.org",
        "time": "Mon Apr 27 09:53:08 2026 +0000"
      },
      "message": "KUDU-3765 Add `diagnose tls_debug` CLI tool\n\nAs OpenSSL s_client doesn\u0027t support Kudu RPC protocol, it\u0027s difficult to\nverify that a server is secured properly.\n\nThis patch introduces a new CLI tool to assist with this - it simply\nprints the negotiated TLS protocol version and the cipher used, along\nwith whether the extended master secret extension was used in cases of\nTLSv1.2 and lower. It also adds this information to the /rpcz endpoint.\nIt supports disabling TLS using a -disable_tls flag, in which case it\nattempts to connect to a server without using TLS.\n\nIt also adds support for specifying -tls_min_version, -tls_ciphers\n(TLSv1.0 to TLSv1.2), and -tls_ciphersuites (TLSv1.3) for all CLI tools\nconnecting to a Kudu server.\n\nChange-Id: Ibf90a81d03d1da064a7bc737cf608e2ff97d6ad0\nReviewed-on: http://gerrit.cloudera.org:8080/24222\nTested-by: Kudu Jenkins\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "80873c98b5cc5110e611dd6180cfac12549e84f6",
      "tree": "50bbdcd8ad2c09e06111da2d2309df9d29acb211",
      "parents": [
        "47a905e8c20baa81eda8484b04fb5b6abbd207fa"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Thu Mar 12 16:38:08 2026 +0530"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Apr 24 07:26:27 2026 +0000"
      },
      "message": "[fs] add metrics for untracked orphaned blocks\n\nDuring flush, if orphaned blocks are there and for some reason those\nblocks\u0027 records are not deleted (maybe due to some underlying transient\nI/O error, etc), those blocks are never re-tried for deletion and erased\nfrom the list of orphaned_blocks_. This can cause un-reclaimed space on\nthe persistent storage that can get accumulated over time to a big size.\nThis un-reclaimed space can only be reclaimed with user intervention by\nrunning \u0027kudu fs check --repair\u0027.\n\nInitially, this patch addressed the issue by not removing those orphaned\nblocks from the orphaned_blocks_ list, for which delete failed due to\nsome transient error. This ensures that when next flush is scheduled,\nthe metadata still contains those orphaned blocks in the list and delete\ncan be retried on those blocks to reclaim the space.\n\nHowever, with that change, TestEIODuringDelete started failing because\nDeleteTabletData expects an empty orphaned_blocks_ set after calling\nFlush() couple of times. A second flush is required to clear the\norphaned blocks from superblock even if delete failed for those earlier.\nSince we keep adding the orphaned blocks (for which delete failed)\nback to the set, it never got an empty set, that caused the failure.\n\nIf orphaned_blocks_ set is cleared after the second flush, to maintain\noriginal behavior and expectation, it may fix the TestEIODuringDelete\nfailure but it opens the possibility of hitting KUDU-1060 where a number\ntombstoned tablets keep the record of all orphaned blocks on persistent\nsuperblock i.e., roll-forward of the block deletions until next restart.\nThis can severely impact the startup time for a tablet server that has\na lot of tombstoned tablets.\n\nIn a nutshell, having to keep these orphaned blocks in the set may not\nbe of much use if the disk error is persistent and not to mention the\nadditional handling required in various cases like mentioned above. It\nmakes sense to just rely on \u0027kudu fs check --repair\u0027 like workflow to\nremove these stale orphaned blocks as a maintenance operation.\n\nWith all this information, re-purposing this patch to only focus on\nadding additional logs, metrics and stats that can help identify the\nscenarios with stale orphaned block id lists and log the appropriate\naction for user i.e. \u0027kudu fs check --repair\u0027. Original behavior holds\nfor orphaned blocks set i.e. erase all blocks from the set irrespective\nof the CommitDeletedBlocks() outcome.\n\nFollow-up:\nKUDU-829 - Create a separate patch for adding a maintenance op that can\nrun in the background to reclaim all the space left from those orphaned\nblocks using the same logic as \u0027kudu fs check --repair\u0027.\n\nHighlights of the change:\n- Add warning logs at CommitDeletedBlocks callers when the commit fails.\n- Add per-block level error logs for blocks for which deletion record\n  could not be committed.\n- Add these metrics that can hold the orphan block deletion outcome:\n  * orphaned_blocks_cleaned\n  * orphaned_block_cleanup_failures\n- Add unit tests to test these scenarios with metrics verification:\n  * Usual path where orphaned blocks are deleted with no error.\n  * No metrics are updated when orphan block deletion is disabled.\n  * Induced I/O error causes orphaned blocks lying around that are not\n    deleted and eventually removed from the set with a action to user.\n  * Two stages: First induce I/O error, verify metrics shows cleanup\n    failure count increased. Second remove induced error, verify metrics\n    remains unchanged.\n\nChange-Id: Id386d9fc8d0900839e229e66772f35299b3ef2e9\nReviewed-on: http://gerrit.cloudera.org:8080/24092\nTested-by: Kudu Jenkins\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "47a905e8c20baa81eda8484b04fb5b6abbd207fa",
      "tree": "9c6286408b3f63cc7f0e2331a8b3e986fd13b9dc",
      "parents": [
        "f25fef48df6410798d23165b241872430815b5d1"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Wed Apr 01 14:27:53 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Apr 24 07:19:32 2026 +0000"
      },
      "message": "[tablet] optimize MemRowSet scan to single-pass changelist application\n\nPreviously, ApplyMutationsToProjectedRow applied mutations by iterating\nthrough the RowChangeList once per projected column, creating a new\nRowChangeListDecoder for each column and calling ApplyToOneColumn. This\nresulted in O(P * C) complexity where P is the number of projected\ncolumns and C is the number of column updates in the changelist.\n\nThis patch replaces the multi-pass approach with a single-pass\ntraversal: decode each column update once and use the projection\nschema\u0027s find_column_by_id() (via DecodedUpdate::Validate()) as the\nreverse mapping to locate the destination column. Updates for columns\nnot in the projection are simply skipped. This reduces the complexity\nto O(C).\n\nThe improvement is most significant for wide-table scans with many\nprojected columns and long mutation chains, where the old code would\nre-decode the same changelist bytes P times.\n\nChange-Id: I7ccdfcf207680261907d025b64a9b046bb108f13\nReviewed-on: http://gerrit.cloudera.org:8080/24158\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "f25fef48df6410798d23165b241872430815b5d1",
      "tree": "a4358752c892f78f5d5f6ef6e2c35cce9e42bcf2",
      "parents": [
        "31ccd07122ee4ac3fea277ad7088975efac68028"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Thu Apr 23 17:27:59 2026 +0530"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu Apr 23 13:23:47 2026 +0000"
      },
      "message": "[fs,util] replace LOG_EVERY_N with KLOG_EVERY_N\n\nReplace uses of glog\u0027s LOG_EVERY_N with Kudu\u0027s KLOG_EVERY_N in\nFileBlockManager::DeleteBlock() and LogBlockManager::RemoveLogBlock(),\nadding the necessary logging.h include to both files.\n\nAlso clean up the KUDU_SOME_KIND_OF_LOG_EVERY_N macro family in\nlogging.h:\n- Split combined static variable declarations onto separate lines.\n- Add parentheses around \u0027condition\u0027 and \u0027n\u0027 macro parameters in\n  KUDU_SOME_KIND_OF_LOG_IF_EVERY_N for safer expansion.\n- Suppress bugprone-macro-parentheses clang-tidy warnings on\n  .stream() call sites with NOLINT annotations.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nChange-Id: I4095f2473e5420e05f9f0ced3ef585d8e06cf1db\nReviewed-on: http://gerrit.cloudera.org:8080/24228\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "31ccd07122ee4ac3fea277ad7088975efac68028",
      "tree": "109a02db56410dda0b4eeb9daa5306d793b183a6",
      "parents": [
        "c2c233f5e3067950abe71c09e7390931e0aa315f"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Apr 10 13:58:02 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 22 20:28:24 2026 +0000"
      },
      "message": "[rpc] add read/write event handling latency histograms\n\nThis changelist adds metrics for tracking latencies of registered read\nand write handlers invoked by the libev\u0027s I/O event loop mechanism.\nThe idea is to be able to tell how much time it took a registered\nhandler to start reading/writing of pending data since the beginning\nof a loop prompted by corresponding I/O events.\n\nTwo pairs of histograms have been added:\n\n  * Histograms of read/write handler latencies for currently active RPC\n    connections.  Each of the histograms is updated when a registered\n    handler is invoked on a reactor thread as a part the libev\u0027s event\n    loop.  These per-connection histograms are available as a part\n    of the output at the \u0027/rpcz\u0027 endpoint of the embedded webserver.\n\n  * Histograms of maximum read/write latencies among all RPC connections\n    that have already been closed.  Each of the histograms is updated\n    with connection\u0027s lifetime maximum read/write handler latency upon\n    shutting down the connection.  These histograms are available as\n    server-level metrics that can be fetched from the \u0027/metrics\u0027 and\n    the \u0027/metrics_prometheus\u0027 endpoints of the embedded webserver.\n    These are named \u0027reactor_ev_loop_max_read_latency_us\u0027 and\n    \u0027reactor_ev_loop_max_write_latency_us\u0027 correspondingly.\n\nCollecting/updating the newly introduced metrics is gated by the\n\u0027--rpc_connection_collect_io_handler_latency\u0027 runtime flag, which is set\n\u0027false\u0027 by default.  The rationale for the default setting is this:\nthe \u0027reactor_active_latency_us\u0027 metric is always enabled and collected\nby ReactorThread::InvokePendingCb() as a duration of running all the\nregistered callbacks per libev event handling loop, including I/O and\ntimer watchers.  If it shows high numbers, then by setting the\n\u0027--rpc_connection_collect_io_handler_latency\u0027 flag to \u0027true\u0027 via the\n\u0027kudu master/tserver set_flag\u0027 CLI tool it\u0027s possible to get\nper-connection stats when necessary.  It\u0027s relatively cheap to update\nand maintain the newly introduced metrics, but it adds at least a few\nmicroseconds into every I/O handler invocation, so it\u0027s better\nto enable it only for troubleshooting.\n\nChange-Id: I8f7208d1adfe95bc9e909f7db04221dbb15ea552\nReviewed-on: http://gerrit.cloudera.org:8080/24181\nTested-by: Kudu Jenkins\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\n"
    },
    {
      "commit": "c2c233f5e3067950abe71c09e7390931e0aa315f",
      "tree": "8c978b7710c641cc62c1dabe7f75c5e45d3a2b8b",
      "parents": [
        "3aeb9025e4efe9657cf40853de6d0b5dcade91f0"
      ],
      "author": {
        "name": "Yan-Daojiang",
        "email": "yan_daojiang@163.com",
        "time": "Mon Apr 20 20:51:49 2026 +0800"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 22 18:12:41 2026 +0000"
      },
      "message": "[fs] fix startup progress tracking containers_processed counter\n\nThe /startup web page’s “Opening container files” progress reports\ncontainers_processed based on OpenContainer() completion, but the\nexpensive work happens in LoadContainer() which runs asynchronously.\nThis causes the progress to jump to 100% long before containers are\nactually loaded.\n\nMove the containers_processed increment into the LoadContainer()\ncompletion callback so the counter reflects actual loading progress.\nAdd a fault injection flag for testing intermediate progress values.\n\nChange-Id: Ia372ad51b5d44ce80b27f611979388d0b685560d\nReviewed-on: http://gerrit.cloudera.org:8080/24215\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "3aeb9025e4efe9657cf40853de6d0b5dcade91f0",
      "tree": "de3757fb0e70da1825b07cc5079ca29f530d7538",
      "parents": [
        "a0a7b25dbd0086f21b7ca5b04af93098bcc4d14b"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Apr 21 13:30:11 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 22 02:05:20 2026 +0000"
      },
      "message": "[rpc] nano-optimizations on RPC feature flags\n\nAvoid memory re-allocations and allow for optimizations (e.g., memcpy())\nwhen copying elements between std::vector and protobuf\u0027s RepeatedField.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nChange-Id: I77ec723ad8aed3dcc18e3a653740ddf1da95fb2c\nReviewed-on: http://gerrit.cloudera.org:8080/24221\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "a0a7b25dbd0086f21b7ca5b04af93098bcc4d14b",
      "tree": "969d31e77905f03078a74bed1cb197d6f933232b",
      "parents": [
        "be9e859daa2155cdc51e0e7ba547b8b3d0d7022b"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Mon Apr 13 21:40:20 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Apr 17 13:09:44 2026 +0000"
      },
      "message": "KUDU-3685: add MiniPrometheus\n\nMiniPrometheus is a thin wrapper around a real Prometheus subprocess\nfor use in integration tests. It supports static scrape targets\nand HTTP service discovery, and exposes a minimal API surface\n(GetTargets, WaitForActiveTargets, Query) sufficient to verify\nend-to-end scraping and SD behavior.\n\nThe helper is intended to be used alongside InternalMiniCluster\nto answer open questions raised in the Prometheus SD patch review\n(https://gerrit.cloudera.org/#/c/21723/).\n\nChange-Id: Icdc4d3e6ee6ab0bd89c20c21b75d4d8e6518993e\nReviewed-on: http://gerrit.cloudera.org:8080/24189\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "be9e859daa2155cdc51e0e7ba547b8b3d0d7022b",
      "tree": "c086fba3e7825429423c6fc9b6169d85a19b098b",
      "parents": [
        "f1531669cc74f73fa9cbadedf062fff90aad9f44"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Mar 31 11:11:52 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu Apr 16 14:45:21 2026 +0000"
      },
      "message": "[Python] add compatibility testing\n\nThe Kudu Python client declares support for Python 2.7 and 3.6–3.11\nin its trove classifiers, but had no mechanism to verify that the build,\ntest suite, and sdist packaging actually work across all those versions.\n\nbuild-support/python-compat/ fills this gap with shell scripts that\nbootstrap each interpreter via the deadsnakes PPA and exercise the\nfull build+test+package cycle per version:\n  bootstrap-deadsnakes-python.sh  install all supported interpreters\n  test-client.sh                  build extension + run test suite\n  test-packaging.sh               sdist round-trip in a clean venv\n\ntest-client.sh supports a -j [N] flag for parallel execution across\nversions (mirroring make -j semantics).  Parallel builds are safe\nbecause each version gets its own isolated copy of the source tree\nunder /tmp: setup.py generates several files in-tree at import time\n(config.pxi, version.py, kudu/*.cpp) that would otherwise race when\nmultiple interpreters build concurrently.  The source tree is cleaned\nonce up-front and then copied per version with cp -aL (dereferencing\nsymlinks such as version.txt -\u003e ../version.txt) so every build starts\nfrom a known-clean state.\n\nTools like tox exist for exactly this kind of test-matrix work, but\nsupporting a range that stretches back to Python 2.7 requires older\nvirtualenv versions that conflict with modern toolchains, making a\ntox setup more brittle than the straightforward shell scripts here.\n\nThese scripts are intended to be run manually by developers when\nadding or dropping a supported Python version, and as part of the\nrelease checklist to confirm packaging works across the full matrix.\nThey are not wired into CI.\n\nDONT_BUILD\n\nChange-Id: Id1f4e6c837a0a3e9da531627ec38f1c452341c11\nReviewed-on: http://gerrit.cloudera.org:8080/24155\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\n"
    },
    {
      "commit": "f1531669cc74f73fa9cbadedf062fff90aad9f44",
      "tree": "74fa2d44e663f37e9233b5048e9ee358de2ea185",
      "parents": [
        "bee410f8afe3d9e602ff3bc743596692fae784e1"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 15 15:35:26 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu Apr 16 14:44:59 2026 +0000"
      },
      "message": "[gitignore] ignore .qtcreator dir\n\nChange-Id: I44cf78d4b25ed1a4f6a7dd17a03da7a410bce740\nReviewed-on: http://gerrit.cloudera.org:8080/24195\nTested-by: Kudu Jenkins\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "bee410f8afe3d9e602ff3bc743596692fae784e1",
      "tree": "ca3228119d97ea251a98fde9e012840e885a76dc",
      "parents": [
        "c8baa0cf1141c792a8535f564b48a2b9c3393d7b"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Tue Apr 14 19:44:05 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Apr 15 12:23:39 2026 +0000"
      },
      "message": "modernize code with WARN_UNUSED_RESULT attribute\n\nSince introduction of the \u0027nodiscard\u0027 attribute for Status [1] and\nadding `-Werror` compiler flag [2], there isn\u0027t a need to annotate\nmethods/functions with WARN_UNUSED_RESULT in the C++ code that is\nsupposed to compile with the C++17 and newer standards.  This changelist\nremoves the WARN_UNUSED_RESULT where applicable, and also replaces\nWARN_UNUSED_RESULT with [[nodiscard]] for methods/functions returning\nother than Status types.\n\nNOTE: it\u0027s still there for code that\u0027s compiled with the C++98 standard.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\n[1] https://github.com/apache/kudu/commit/8f136bb21\n[2] https://github.com/apache/kudu/commit/ef7483f78\n\nChange-Id: I83166e0dddec57e5b11ef958615848bde4165a72\nReviewed-on: http://gerrit.cloudera.org:8080/24194\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "c8baa0cf1141c792a8535f564b48a2b9c3393d7b",
      "tree": "f4f9b057e3964a7ef8bf20fed2cc3505bf94721b",
      "parents": [
        "35f51f402a5f154b6b9c5f6bb38022f200d32c56"
      ],
      "author": {
        "name": "Gabriella Lotz",
        "email": "lotzgabriella@gmail.com",
        "time": "Fri Mar 06 14:29:43 2026 +0100"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 14 13:09:22 2026 +0000"
      },
      "message": "KUDU-3729 Prefer follower moves in auto-rebalancing\n\nAdd --auto_rebalancing_prefer_follower_replica_moves (default: true).\n\nWhen multiple tables are equally imbalanced, the greedy algorithm\nprefers a move whose source server hosts a follower replica for that\ntable. If no such candidate exists among the ties, it falls back to\na leader-sourced move. When false, equal-skew ties are broken as\nbefore with no leader/follower distinction.\n\nChange-Id: I0b56ae5ef8db5fe15ab25df1d1cebe84fd3b8f2c\nReviewed-on: http://gerrit.cloudera.org:8080/24085\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "35f51f402a5f154b6b9c5f6bb38022f200d32c56",
      "tree": "2809b0b25420b3d12420166ae8434bbe2f7f4e6c",
      "parents": [
        "948a8577b019926f1c86c9a0a9cc5310b1fecaf0"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Mon Apr 13 20:02:21 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 14 10:14:01 2026 +0000"
      },
      "message": "KUDU-3685: Add Prometheus to thirdparty\n\nAdd Prometheus to thirdparty to support implementing MiniPrometheus for\ntests.\n\nDo not build Prometheus from source, since it would currently be the\nonly third-party component requiring Go tooling. Instead, download the\nPrometheus release binary.\n\nTested that the install works, and Prometheus can start up on:\nUbuntu22, Ubuntu18, Rhel88\n\nChange-Id: I22ec4d34cb5f486aca3e2d624b17528774c2be09\nReviewed-on: http://gerrit.cloudera.org:8080/24187\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "948a8577b019926f1c86c9a0a9cc5310b1fecaf0",
      "tree": "72ce2193683db9ef313ef00c81e7cbfef917b890",
      "parents": [
        "d8712fee7dbdf2f2590d0bc01c99454e06189c63"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Apr 13 16:58:17 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 14 08:57:43 2026 +0000"
      },
      "message": "[server] fix typo in acceptor\u0027s effective accept backlog\n\nThis is a follow-up to 6c02274ce275615fbbc83703b6f695a0a53c87f1.\n\nChange-Id: I02171593bbf46f2cafe01f91f3db542426645b49\nReviewed-on: http://gerrit.cloudera.org:8080/24186\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\n"
    },
    {
      "commit": "d8712fee7dbdf2f2590d0bc01c99454e06189c63",
      "tree": "abf5bd45c6a5777db456957890eaf096b7f75bcb",
      "parents": [
        "7c8d8079be030d5f26bcceca5af39b57d6afb0bc"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Mar 31 10:58:19 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 14 08:55:50 2026 +0000"
      },
      "message": "fix flaky TestTableStatistics stat assertions\n\n`live_row_count` and `on_disk_size` return -1 when the master has\nnot yet received a tablet-server heartbeat carrying the stat. Tests\nthat asserted \u003e\u003d 0 immediately after table creation could therefore\nfail intermittently.\n\nReplace the narrowly-scoped `_wait_for_live_row_count` helper with a\ngeneric `_wait_for_stat(client, table_name, get_stat, min_value)`\nthat accepts a callable to extract any stat field. All stat\nassertions in TestTableStatistics now poll through this helper\ninstead of reading stats once and asserting immediately.\n\nChange-Id: I6d5cd69802ec2139e8df4c87903e3c6196e26ae3\nReviewed-on: http://gerrit.cloudera.org:8080/24152\nTested-by: Kudu Jenkins\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "7c8d8079be030d5f26bcceca5af39b57d6afb0bc",
      "tree": "7653bf0f98ddb688795be3e6c47206118dc7cefc",
      "parents": [
        "748ef105309d0a5423660ea100f33ec56fb5cc45"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Mar 25 18:44:21 2026 +0100"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Thu Apr 09 13:00:31 2026 +0000"
      },
      "message": "docs: add Flink replication guide\n\nAdd kudu_flink_replication.adoc covering the end-to-end operational\nguide for the Flink-based replication job: overview, prerequisites,\nsecurity (Kerberos/Ranger), job lifecycle (start/stop/savepoint),\nconfiguration reference, supported types, metrics, monitoring\n(Prometheus + Grafana), schema change handling, resource sizing,\nDR failover, and troubleshooting.\n\nIncludes a sequence diagram illustrating the full snapshot and\nincremental diff scan flow.\n\nThe Monitoring section references the example stack introduced in\nthe companion change that adds examples/flink-replication/.\n\nChange-Id: I684d608165af636bd4a799351926b68322469218\nReviewed-on: http://gerrit.cloudera.org:8080/24139\nTested-by: Kudu Jenkins\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "748ef105309d0a5423660ea100f33ec56fb5cc45",
      "tree": "b07c0a91cb22a4bda75a1132fbd7a5ba4c653cc2",
      "parents": [
        "b08896a95a9e1d873d723e42688d15cadbb57675"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Mon Apr 06 21:20:15 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 08 02:00:11 2026 +0000"
      },
      "message": "[rpc] add PREDICT_FALSE() for unlikely error scenarios\n\nI was looking at the RPC code to clarify a few perf-related questions\nand found that PREDICT_{TRUE,FALSE}() were not used uniformly throughout\nthe code.  This patch adds these macros in the rest of relevant places,\nwhere applicable.\n\nThis changelist doesn\u0027t contain any functional modifications.\n\nChange-Id: I3178a37ec371ca4db2b818a67cf04f52b72f2dd0\nReviewed-on: http://gerrit.cloudera.org:8080/24173\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "b08896a95a9e1d873d723e42688d15cadbb57675",
      "tree": "a2f46e8d5b0110e9321f0822cc4699e94f6c2f29",
      "parents": [
        "3c59615bd5516b582137d0811c7f870d3e505987"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Mar 20 12:09:14 2026 +0100"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 07 10:58:35 2026 +0000"
      },
      "message": "[examples] add replication demo\n\nAdds a self-contained Docker Compose environment demonstrating\nKudu-to-Kudu replication with Apache Flink.\n\nThe setup includes two Kudu clusters (source + sink), a Flink cluster,\na Python ingest simulator, and a Prometheus + Grafana observability\nstack with a pre-built replication dashboard — all wired together and\nready to run.\n\nA Makefile covers the full workflow: building the replication JAR,\nstarting and stopping the stack, submitting and savepointing the Flink\njob, and verifying row counts across clusters. Version pins and tunables\nare centralized in .env.\n\nChange-Id: Iebf29efaebc91d9831f57fc884a2acbab31715ce\nReviewed-on: http://gerrit.cloudera.org:8080/24127\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\nReviewed-by: Gabriella Lotz \u003clotzgabriella@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "3c59615bd5516b582137d0811c7f870d3e505987",
      "tree": "36c3b41d2e906846a9e56fc97a03356de321ee73",
      "parents": [
        "99d498fb5fe30828a2f52b4b6b8609f2c97ddaeb"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Mar 31 14:20:07 2026 +0200"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Apr 07 10:55:14 2026 +0000"
      },
      "message": "Fix misleading Javadoc for writer.maxBufferSize\n\nThe Javadoc for writer.maxBufferSize incorrectly described it as\n\"maximum size in bytes of the client-side write buffer\". It actually\nmaps to KuduSession\u0027s mutationBufferMaxOps, which is a count of\nbuffered mutation operations, not a byte size.\n\nThe confusion likely stems from the parameter name in the Flink\nconnector (KuduWriterConfig.maxBufferSize), which implies a byte\nquantity, while the connector\u0027s own source comment clarifies:\n\"Reference from AsyncKuduSession mutationBufferMaxOps 1000.\"\n\nChange-Id: I2e79b888ecc4bd0ef815aeadec9003027b7d6b3a\nReviewed-on: http://gerrit.cloudera.org:8080/24157\nReviewed-by: Ashwani Raina \u003caraina.git@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Chovan \u003czchovan@cloudera.com\u003e\n"
    },
    {
      "commit": "99d498fb5fe30828a2f52b4b6b8609f2c97ddaeb",
      "tree": "a69fd2bf4a866e19cd4a2ef982076170959cecea",
      "parents": [
        "80c1b1dcb5d065f739fd74b0177f1f72e09733d9"
      ],
      "author": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Fri Mar 20 15:20:07 2026 +0100"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Apr 02 17:55:16 2026 +0000"
      },
      "message": "KUDU-3755 tool: add leave_files to control shell\n\nAdd a leave_files boolean field to CreateClusterRequestPB so callers\ncan opt out of the unconditional cluster-root deletion that the\ncontrol shell performs on exit.\n\nAdd TestLeaveFiles, TestDeleteOnExit, and\nTestPreserveFilesOnAbnormalExit to ControlShellToolTest to verify both\nnormal exit paths and that files are preserved when the shell exits\nabnormally.\n\nChange-Id: Ifa09d63d614190d25cb9b1c6706fd0db992eb5eb\nReviewed-on: http://gerrit.cloudera.org:8080/24122\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "80c1b1dcb5d065f739fd74b0177f1f72e09733d9",
      "tree": "baeb47cd66d5a2f6ac314a8cf454ddbe890b4635",
      "parents": [
        "49610a0f323e422f7e4f1379a208d657463135a8"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Wed Apr 01 11:17:30 2026 -0700"
      },
      "committer": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Thu Apr 02 02:24:27 2026 +0000"
      },
      "message": "KUDU-3758 avoid TransferPayload copying for CreateForCall{Request,Response}\n\nEven if copying of Slice objects is shallow (the underlying memory isn\u0027t\ncopied, just the pointer and the size are copied), it makes sense to\navoid heap memory allocation and copying of Slice objects themselves.\nThe latter happens when there are more than two side-cars in per RPC, so\nTransferPayload (boost::container::small_vector\u003cSlice, 4\u003e typedef)\nstarts allocating its elements on the heap.\n\nChange-Id: Ia26e1a18fbb903a4df2ab7b20549fca3c2b06ad2\nReviewed-on: http://gerrit.cloudera.org:8080/24160\nReviewed-by: Michael Smith \u003cmichael.smith@cloudera.com\u003e\nReviewed-by: Abhishek Chennaka \u003cachennaka@cloudera.com\u003e\nTested-by: Alexey Serbin \u003calexey@apache.org\u003e\n"
    },
    {
      "commit": "49610a0f323e422f7e4f1379a208d657463135a8",
      "tree": "8e695c01b1dadbbf1d016dc4714ac1c56d9b9df2",
      "parents": [
        "737e339d3813d1a520eb46b96ab91eb44555c025"
      ],
      "author": {
        "name": "Ashwani",
        "email": "araina.git@gmail.com",
        "time": "Tue Mar 24 22:00:10 2026 +0530"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Wed Apr 01 08:01:04 2026 +0000"
      },
      "message": "[fs] fix partial blocks deletion case in rocksdb\n\nThis fixes a bug in rocksdb block deletion logic where only a partial\nnumber of total blocks are successfully deleted, but the function\nreturns total number of blocks as \u0027deleted\u0027 inside the out parameter\ni.e., \u0027deleted_block_ids\u0027. However, the same case is handled in native\ncontainer by resizing the out parameter to correct number of blocks that\nwere deleted successfully, at the end of function scope.\n\nThe fix is to apply the same scoped cleanup logic for rocksdb method as\nwell by resizing the \u0027deleted_block_ids\u0027 out parameter with total number\nof committed blocks. A unit test is added to verify the same.\n\nChange-Id: Ifb553fbf9a88f0cdb392f926289bbdf5f18b5d29\nReviewed-on: http://gerrit.cloudera.org:8080/24134\nReviewed-by: Alexey Serbin \u003calexey@apache.org\u003e\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\n"
    },
    {
      "commit": "737e339d3813d1a520eb46b96ab91eb44555c025",
      "tree": "b4d214abc5e1b8bda5a5c2028decea21d5191e83",
      "parents": [
        "67d60d77347f66f9949061573ac8b69adab681e2"
      ],
      "author": {
        "name": "Alexey Serbin",
        "email": "alexey@apache.org",
        "time": "Fri Mar 27 21:03:14 2026 -0700"
      },
      "committer": {
        "name": "Marton Greber",
        "email": "greber.mx@gmail.com",
        "time": "Tue Mar 31 12:00:59 2026 +0000"
      },
      "message": "KUDU-3757 usability improvement for unsafe/experimental flags\n\nThis changelist allows for keeping customization for an \u0027experimental\u0027\nor \u0027unsafe\u0027 flag when its effective value remains set as by default.\n\nThis is a follow-up to 27ac602108ab5e6b4e2211c2bfae3b36badc3121.\n\nChange-Id: I78b6cc2a4611f3e8056e3d65658bc052f07e1f50\nReviewed-on: http://gerrit.cloudera.org:8080/24151\nReviewed-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nTested-by: Marton Greber \u003cgreber.mx@gmail.com\u003e\nReviewed-by: Zoltan Martonka \u003czmartonka@cloudera.com\u003e\n"
    }
  ],
  "next": "67d60d77347f66f9949061573ac8b69adab681e2"
}
