)]}'
{
  "log": [
    {
      "commit": "ce74072496ff8179c93008a202d6ebc4b893c148",
      "tree": "32feab898c165bab728612cd6245bdfaf22b6118",
      "parents": [
        "38f8b4cfe509335977ccd3863d5996113948add4"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Fri Jun 12 13:56:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 13:56:20 2026 -0700"
      },
      "message": "feat: Prunable shard specs for streaming published segments (#19571)\n\nKafka ingestion can now publish segments that the broker prunes at query time, without waiting for compaction. Set tuningConfig.streamingPartitionsSpec.partitionDimensions to a list of low-to-medium cardinality dimensions; each task records the distinct values it observes per dimension and stamps them onto a new dim_value_set shard spec. Queries that filter on a declared dimension then skip segments whose values can\u0027t match. The feature is opt-in, Kafka-only, and disabled by default; when unset, behavior is unchanged.\n\nCompatibility: dim_value_set is a new core shard spec type with no fallback, so it is not forward-compatible. Upgrade all services before enabling streamingPartitionsSpec. Once dim_value_set segments are published, downgrade is unsupported\nuntil they are compacted away or streamingPartitionsSpec is removed.\n\nHighlights:\n- StreamRangeShardSpec extends NumberedShardSpec; possibleInDomain prunes by\n  per-value range intersection. Null is declared as a first-class value\n  (encoded as Range.lessThan(\"\")) so IS NULL queries are never wrongly pruned,\n  and is kept distinct from the empty string.\n- Opt-in via partitionFilterDimensions on the Kafka supervisor/IOConfig\n  (null by default; segments otherwise get a plain NumberedShardSpec). Kafka\n  only for now; backward-compatible config (old specs/constructors unchanged).\n- Per-segment value accumulation at ingest time; each segment is stamped with\n  only its own observed values at publish.\n- Correctness guards: restart-spanning segments fall back to NumberedShardSpec\n  (pre-restart rows are not re-read, so their values can\u0027t be fully observed);\n  dimensions that observed a null/missing value declare null so IS NULL is not\n  pruned.\n- BaseAppenderatorDriver reconciles the returned SegmentsAndCommitMetadata to\n  the published shard specs so handoff/publish logs report the real spec.\n\nTests:\n- StreamRangeShardSpecTest: possibleInDomain matrix incl. null vs \"\" and serde.\n- SeekableStreamIndexTaskRunnerTest: annotator unit tests (restart fallback,\n  null handling).\n- EmbeddedStreamRangeShardSpecTest: end-to-end pruning verified via the\n  query/segment/time scan metric across a predicate matrix (\u003d, !\u003d, IN, NOT IN,\n  IS NULL, IS NOT NULL, multi-value, untracked dimension, non-existent value),\n  plus a no-partitioning control twin and in-memory/graceful-widening cases.\n- StreamAppenderatorDriverTest: returned metadata carries the published spec.\n\n* Comments\n\n* Move to tuningConfig.\n\n* Stamp with empty partitions spec when segments cannot be recovered.\n\n* Sort partitionDimension values.\n\n* Use SegmentId for strongly typed identifier \u0026 tests\n\n* Reanme stream_range to dim_value_set to better capture the intent.\n\nRenames related classes as well\n\n* Document numeric type is not eligible for pruning \u0026 additional test coverage.\n\n* Assert row values too in addition to counts\n\n* Cleanup"
    },
    {
      "commit": "38f8b4cfe509335977ccd3863d5996113948add4",
      "tree": "35afb75a075a79113ad90c75f5b1450bb3441298",
      "parents": [
        "80d7700f55c3fb5890ecc0c75938e8b53495babc"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri Jun 12 12:19:09 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 13 00:49:09 2026 +0530"
      },
      "message": "fix: empty loads for asymmetric cluster-group partial-load matchers (#19565)\n\n* fix: empty loads for asymmetric cluster-group partial-load matchers\n\n* fix test\n\n* ensure that rule is compatible with clustering before doing empty loads\n\n* broken javadoc link"
    },
    {
      "commit": "80d7700f55c3fb5890ecc0c75938e8b53495babc",
      "tree": "e654192b0c89a65dc2a127605e26eb90ceaaf4a3",
      "parents": [
        "2f1f0b770ac3d289b8c2782bc0fc10865fce9737"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Thu Jun 11 21:06:15 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 08:36:15 2026 -0700"
      },
      "message": "fix: flaky Consul embedded test startup (#19564)\n\nFixes #19563.\n\nDescription\nThis PR hardens the Consul-backed embedded tests against startup races where the Consul container has started but the host-mapped Consul API is not yet reliably accepting requests."
    },
    {
      "commit": "2f1f0b770ac3d289b8c2782bc0fc10865fce9737",
      "tree": "caf2cb5d20347a471d2559cd799ce4630342d71b",
      "parents": [
        "ca51d780bf34a107a6be61d49c71acc8c0df8b32"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Tue Jun 09 11:06:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 11:06:19 2026 -0700"
      },
      "message": "feat: S3 SegmentRangeReader for partial segment downloads (#19560)\n\nchanges:                                                                                                                                                                                                                                 * adds new `S3SegmentRangeReader` that wraps `ServerSideEncryptingAmazonS3` + bucket + key prefix and issues closed-range `GetObjectRequests` against `keyPrefix + filename`. Returned stream is wrapped in a `RetryingInputStream` with the `S3Utils.S3RETRY` predicate (the same retry policy `S3DataSegmentPuller` uses for full-segment downloads) so a transient mid-stream error reopens at the byte offset where it failed and resumes with a fresh range request for the remaining bytes, rather than restarting the whole read.\n* New `rangeable` boolean on `S3LoadSpec` stamped by the pusher at write time. `S3LoadSpec.openRangeReader()` returns a reader iff the flag is true and the key isn\u0027t .zip\n* `S3DataSegmentPusher.pushNoZip` stamps rangeable\u003dtrue when binaryVersion is `V10_VERSION`, false otherwise. `pushZip` omits the field"
    },
    {
      "commit": "ca51d780bf34a107a6be61d49c71acc8c0df8b32",
      "tree": "9b8c12c5bb60209debd6bc9c1514d2eaed38620b",
      "parents": [
        "7bbfa039403196aa45783b1601ca631b3c3cf4cb"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Tue Jun 09 09:25:18 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 09:25:18 2026 -0700"
      },
      "message": "feat: clustered segments pt.1 (#19460)"
    },
    {
      "commit": "7bbfa039403196aa45783b1601ca631b3c3cf4cb",
      "tree": "f59eb9e8581963a81bbaaf48b99fdfa3975ef422",
      "parents": [
        "d06aa83cd809f6cedec15ba8f8e8e12de26e1587"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Mon Jun 08 18:16:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 18:16:08 2026 -0500"
      },
      "message": "feat: Make segmentLoadAheadCount able to be configured at worker task level in addition to context (#19559)\n\n* Make segmentLoadAheadCount able to be configured at worker task level in addition to context\n\n* fixups based on review"
    },
    {
      "commit": "d06aa83cd809f6cedec15ba8f8e8e12de26e1587",
      "tree": "189a657417b4f5f5f9d0225c1d9dd46a2864f3c9",
      "parents": [
        "7426949b2134770c3a37ec0c54b5293d7a57eb30"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Fri Jun 05 15:18:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 15:18:41 2026 -0700"
      },
      "message": "fix: retry transient AWS credential resolution failures (#19558)\n\nS3 segment pushes that use the AWS SDK v2 transfer manager can resolve credentials on the async upload path. If a file-session credential refresh, container credential lookup, or IMDS lookup is temporarily unavailable, the SDK reports an SdkClientException such as \u0027Unable to load credentials from any of the providers in the chain\u0027.\n\nDruid\u0027s S3 push path already wraps uploads in retryS3Operation, but these credential-provider failures were not classified as recoverable after the SDK v2 migration. That made an intermittent credential miss fail the task immediately instead of using the existing retry budget."
    },
    {
      "commit": "7426949b2134770c3a37ec0c54b5293d7a57eb30",
      "tree": "3d288220799e823993cc0cca2e95b2e1b891511f",
      "parents": [
        "4f83cee078fcb68de59861b79e087583e7d07b6e"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Fri Jun 05 10:47:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 05 10:47:10 2026 -0700"
      },
      "message": "fix: thrownAway reason incorrectly defaulting to null for streaming tasks (#19540)\n\nStreaming ingestion tasks were incorrectly reporting thrown-away reason as null for filtered rows."
    },
    {
      "commit": "4f83cee078fcb68de59861b79e087583e7d07b6e",
      "tree": "91c486367338f297110ee3ae9bebce5258de5200",
      "parents": [
        "9d82a0ec9a611e234cfec652fcb076b3583878d2"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu Jun 04 14:54:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 14:54:02 2026 -0700"
      },
      "message": "fix: Track load completion in StorageLocationVirtualStorageManager. (#19555)\n\nMost metrics are tracked by the StorageLocation itself, but it needs\nhelp from the higher level layer to track load completion."
    },
    {
      "commit": "9d82a0ec9a611e234cfec652fcb076b3583878d2",
      "tree": "a07cc22b46a5fc4ed0ea9991bacb79c7ac54e990",
      "parents": [
        "03ab4e2b1e345d5ee2dc4df78a9a3232b0aa8927"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu Jun 04 14:32:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 14:32:46 2026 -0700"
      },
      "message": "fix: Retain exception that triggered Dart query cancellation. (#19553)\n\nIn some cases, cancellation is triggered by an exception (rather than a\nnon-exceptional reason, like timeout or user request). This patch\nretains the exception and includes it in the query report."
    },
    {
      "commit": "03ab4e2b1e345d5ee2dc4df78a9a3232b0aa8927",
      "tree": "476e33322e0f3ba232f015037e5c7cd530009842",
      "parents": [
        "11b0b5918220b51b7e2c0c684d1113ab038d9c15"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Wed Jun 03 14:09:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 14:09:47 2026 -0700"
      },
      "message": "feat: Background fetching of files for SQL EXTERN. (#19539)\n\nThis patch adds the setting \"backgroundFetchExternalFiles\". When set,\ncloud storage files referenced by ExternalSegment (EXTERN) are fetched\nasynchronously into the task\u0027s storage locations. The setting defaults\nto true.\n\nTo support this, new infrastructure is added:\n\n1) VirtualStorageManager, a layer on top of StorageLocation that\n   provides a simple \"fetch and cache a file\" API.\n\n2) StorageLoadingThreadPool, an extraction of the thread pool from\n   SegmentLocalCacheManager so it can be shared with\n   VirtualStorageManager.\n\n3) AsyncResource, a Future-like utility that provides better tools for\n   managing Closeable resources. It is used by VirtualStorageManager to\n   provide the asynchronously-fetched file handles."
    },
    {
      "commit": "11b0b5918220b51b7e2c0c684d1113ab038d9c15",
      "tree": "e884773f3c0d7e71e0f04a3a1ddc14108f463819",
      "parents": [
        "fd6befe010bb314fae1ef7eaeb3e0ece285ccb55"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Wed Jun 03 07:12:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 07:12:59 2026 -0700"
      },
      "message": "feat: Include supervisorId in Kafka consumer metrics. (#19525)\n\nThis patch updates KafkaConsumerMonitor to accept the task\u0027s\nmetric builder, which includes supervisorId as well as other dimensions\nfrom IndexTaskUtils.setTaskDimensions."
    },
    {
      "commit": "fd6befe010bb314fae1ef7eaeb3e0ece285ccb55",
      "tree": "b2bc6b6c045f3b9cb17c93cc1fa0265e77c24140",
      "parents": [
        "b210c99149c6378e585fb76af51b7a6798fc9c6b"
      ],
      "author": {
        "name": "Daniel Jilg",
        "email": "daniel@telemetrydeck.com",
        "time": "Tue Jun 02 19:09:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 10:09:56 2026 -0700"
      },
      "message": "Fix a small typo in bin/start-druid (#19544)\n\nFixes a typo in the error message \"python interpreter not found\" when running bin/start-druid with no installed python interpreter. The error message previously read \"python interepreter not found\"."
    },
    {
      "commit": "b210c99149c6378e585fb76af51b7a6798fc9c6b",
      "tree": "3cc9629dc28b2650535396db76542eab9687a09e",
      "parents": [
        "b876851c68a2fc3efdf58ba73dc7ad626b02c85d"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Tue Jun 02 01:23:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 01:23:56 2026 -0700"
      },
      "message": "minor: scale AWSClientConfig default maxConnections with available processors (#19536)\n\nchanges:\n* `AWSClientConfig` now defaults `maxConnections` to scale with available processors `(max(50, 4 * cores))` to be in sync with virtual storage mode historical download thread pool size\n* tests with artificial `RuntimeInfo` to cover the config scaling"
    },
    {
      "commit": "b876851c68a2fc3efdf58ba73dc7ad626b02c85d",
      "tree": "8f7916e4d31399acde0b3341b80a442a28ed430c",
      "parents": [
        "e61fddc3dbe1af432b60f6bf30afd4187cb4e539"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Mon Jun 01 14:07:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 14:07:32 2026 -0700"
      },
      "message": "refactor: remove deprecated curator ServiceAnnouncer stuff (#19523)"
    },
    {
      "commit": "e61fddc3dbe1af432b60f6bf30afd4187cb4e539",
      "tree": "5ceaac4f1e95d148a14411927ee4b823f0581bea",
      "parents": [
        "120be6e11c5f5fdf072cfe47fd001d007c624942"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Mon Jun 01 14:06:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 14:06:15 2026 -0700"
      },
      "message": "feat: add simd add/sub/mul expressions (#19512)"
    },
    {
      "commit": "120be6e11c5f5fdf072cfe47fd001d007c624942",
      "tree": "1e85555b1ccca321c7669a76009d5d781f95f5d0",
      "parents": [
        "530a30a7502440b9645ee938c7a3f042e50daea6"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Mon Jun 01 13:40:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 13:40:31 2026 -0700"
      },
      "message": "refactor: adjust diskNormalized strategy to scale cost exponentially with disk utilization (#19422)\n\nThe existing linear penalization factor is still ineffective in large skew scenarios where the CostBalancerStrategy\u0027s cost forces a move/load (even with the utilization-based penalty). This switches the penalty to scale exponentially with the disk utilization, ensuring that near-full historicals are penalized. This is also particularly helpful when the size of segments on the cluster vary wildly.\n\nThis also marks the diskNormalized strategy as ready for production use."
    },
    {
      "commit": "530a30a7502440b9645ee938c7a3f042e50daea6",
      "tree": "57e3de7b7a6dde36342f66ed458f1e8e45d922bc",
      "parents": [
        "efa6ed493391564b7cddfdb44f2b0f6ca0213e84"
      ],
      "author": {
        "name": "aho135",
        "email": "andrewho135@gmail.com",
        "time": "Mon Jun 01 11:59:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 11:59:53 2026 -0700"
      },
      "message": "feat: Web console support for resetToLatestAndBackfill (#19533)\n\n* Web console support for resetToLatestAndBackfill\n\n* Make pretty\n\n* Update supervisor-reset-to-latest-dialog.tsx"
    },
    {
      "commit": "efa6ed493391564b7cddfdb44f2b0f6ca0213e84",
      "tree": "aa481015449dee4f9288499cca0766b452787512",
      "parents": [
        "cf275580199e93485062a7b1d7e1dbb4e2c6e2bf"
      ],
      "author": {
        "name": "Andreas Maechler",
        "email": "amaechler@gmail.com",
        "time": "Sun May 31 09:09:03 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 23:09:03 2026 +0800"
      },
      "message": "Bump caffeine to 3.2.4 and errorprone to 2.49.0 (#19527)\n\nCaffeine 3 raised the Java baseline to 11, tightened the AsyncCache\nsurface, and replaced size-LRU eviction with W-TinyLFU with explicit\nadmission control. The Caffeine APIs Druid uses (Cache, Caffeine\nbuilder, Weigher, CacheStats) are stable across the transition.\n\nErrorprone 2.49.0 is required because caffeine 3.2.4 pulls\nerror_prone_annotations 2.49.0 transitively, which violates the\nrequireUpperBoundDeps enforcer rule without the bump.\n\nCaffeineCacheTest.testSizeEviction is rewritten for W-TinyLFU: the old\ntest pre-read key1 multiple times before putting key2, biasing the\nadmission policy to keep key1 and reject val2, so the assertion that\nkey1 was evicted no longer holds. The rewrite avoids the pre-reads\nand asserts only that eviction happened and the cache stayed under\nbound, mirroring caffeine\u0027s own EvictionTest patterns.\n\nAlso adds the previously-missing license entry for org.jspecify:jspecify\n1.0.0 in extensions-core/kubernetes-extensions, which the\ncheck-licenses dependency report flags. This was missing pre-bump and\nis unrelated to caffeine/errorprone, but the CI license check fails\nwithout it, so it is included here to keep the PR green."
    },
    {
      "commit": "cf275580199e93485062a7b1d7e1dbb4e2c6e2bf",
      "tree": "75ab98f74972e3c8bde471ca94d9f4c20bb20056",
      "parents": [
        "2f35573537a46f2afca1e239f232db56f57284e7"
      ],
      "author": {
        "name": "aho135",
        "email": "andrewho135@gmail.com",
        "time": "Fri May 29 18:06:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 18:06:27 2026 -0700"
      },
      "message": "feat: resetOffsetsAndBackfill using bounded stream supervisor (#19477)\n\n* resetOffsetsAndBackfill using bounded stream supervisor\n\n* Reject non-positive backfillTaskCount\n\n* Reset supervisor after backfill Supervisor has already been started\n\n* Add helper method specHasConcurrentLocks\n\n* Fix doc reference\n\n* Move validations into helper function\n\n* Add embedded-test for resetSupervisorAndBackfill\n\n* Remove flaky waitUntilPublishedRecordsAreIngested\n\n* Update KafkaBoundedSupervisorTest.java\n\n* Wait for supervisor to be RUNNING\n\n* Use checkpointed offset if \u003e requested reset offset to prevent duplicate ingestion\n\n* Update KafkaBoundedSupervisorTest.java\n\n* Revert \"Use checkpointed offset if \u003e requested reset offset to prevent duplicate ingestion\"\n\nresetOffsetsForwardOnly does not fully close the race it targets (the write is\nstill unconditional) and the duplicate scenario it addresses is narrower than\nthe overlap case, which cannot be solved without suspending the main supervisor.\nAccepting the limitation and documenting it is preferable to the added complexity.\n\nThis reverts commit 89b5fec25e3a7dc88441d6e995564723557f2312.\n\n* Doc update - duplication notice and Kinesis callout\n\n* Rename endpoint from resetOffsetsAndBackfill to resetToLatestAndBackfill\n\n* Update test name to reflect new endpoint\n\n* Address clean up from review comments\n\n* Log out start/end offsets\n\n* Add abstract createBackfillSpec\n\n* Unit test createBackfillSpec\n\n* Fix deprecation notices\n\n* Rename functions to align with new endpoint name\n\n* Add null check and rename for consistency"
    },
    {
      "commit": "2f35573537a46f2afca1e239f232db56f57284e7",
      "tree": "f2452881dbb7eb7fbd1767221cb1bf78cd3201d2",
      "parents": [
        "5ba191be9f689a13a16001b3f1b20cc31bd559dd"
      ],
      "author": {
        "name": "Andreas Maechler",
        "email": "amaechler@gmail.com",
        "time": "Fri May 29 07:50:04 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 21:50:04 2026 +0800"
      },
      "message": "build(deps): Bump jackson to `2.21.3` (#19528)\n\n* Bump jackson to 2.21.3\n\nJackson 2.21 (issue #1381) changed the default resolution of\n@JacksonInject when combined with @JsonProperty on the same parameter:\nthe injected value now wins over the JSON value, where 2.20 treated\nthe inject as a fallback used only when JSON did not supply one.\n\nDruidNode\u0027s serviceName, port, and tlsPort parameters carry both\nannotations, with JSON expected to win when supplied — this is how\nDruidNode JSON config files have always worked. Add the explicit\nuseInput \u003d OptBoolean.TRUE to restore that contract.\n\nA repo-wide audit confirmed DruidNode\u0027s three parameters are the only\nsites in Druid where @JacksonInject and @JsonProperty annotate the\nsame parameter; everywhere else the annotations are on distinct\nparameters and are unaffected.\n\nAlso adds the previously-missing license entry for org.jspecify:jspecify\n1.0.0 in extensions-core/kubernetes-extensions, which the\ncheck-licenses dependency report flagged.\n\n* Preserve @JacksonInject metadata in GuiceAnnotationIntrospector\n\nfindInjectableValue was returning JacksonInject.Value.forId(id), which\nstrips useInput and optional from the original annotation. Production\ndeserialization happens to remain correct under jackson 2.21 because\nAnnotationIntrospectorPair.findInjectableValue falls back to the\nsecondary (default Jackson) introspector and merges the recovered\nuseInput onto the primary\u0027s Value via withUseInput.\n\nThat fallback is undocumented as part of the introspector contract and\nwould silently regress if the pair semantics change, or if this\nintrospector were ever installed standalone for a special-purpose\nmapper. Construct the Value via JacksonInject.Value.from(annotation)\n.withId(id) so the introspector returns a complete Value on its own\nand no longer relies on the pair to fix it up.\n\nThe annotation lookup is hoisted to the top of findInjectableValue so\nthe non-null contract between it and findGuiceInjectId is explicit —\nfindGuiceInjectId now documents the precondition and trusts the caller\nto verify, eliminating the duplicate getAnnotation call.\n\nDefensive cleanup motivated by FasterXML/jackson-databind#1381; no\nobservable behavior change."
    },
    {
      "commit": "5ba191be9f689a13a16001b3f1b20cc31bd559dd",
      "tree": "b1ceec18f91b81f492375276292a2163bdcf53cc",
      "parents": [
        "7bdbc2d6b8100c930ce65a48676e1bc9f567b00e"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Thu May 28 20:47:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 20:47:03 2026 +0800"
      },
      "message": "perf: disable processing thread renaming by default (#19518)\n\n* Add default value for thread enabling\n\n* Peon disable thread renaming\n\n* Add benchmark query types\n\n* Add groupby benchmark\n\n* Specify query type\n\n* Docs for thread"
    },
    {
      "commit": "7bdbc2d6b8100c930ce65a48676e1bc9f567b00e",
      "tree": "218ae792a352b88f96fcb9ecd13aa46dbfefd37d",
      "parents": [
        "ab12df66fbe63bd892ade1302f11e718508515c8"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Thu May 28 20:46:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 20:46:38 2026 +0800"
      },
      "message": "Remove raw types in ChainedExecutionQueryRunner (#19529)"
    },
    {
      "commit": "ab12df66fbe63bd892ade1302f11e718508515c8",
      "tree": "0751eb68e3f6c8ab64fead6ec81f3787f9324041",
      "parents": [
        "177cada0f3470a1db64ff781fc89bde2764b14b3"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Wed May 27 17:21:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 17:21:53 2026 -0700"
      },
      "message": "feat: add getDimensionRangeSet support to LikeDimFilter for equality and prefix cases (#19524)"
    },
    {
      "commit": "177cada0f3470a1db64ff781fc89bde2764b14b3",
      "tree": "bfa13bc77e02a4607a3765a0b65daa81c333e54e",
      "parents": [
        "06ef24c1e09a8000c91dd0767e09278b34066252"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Tue May 26 00:34:27 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 12:04:27 2026 -0700"
      },
      "message": "fix: OrcInputFormat concurrent FileSystem init race condition (#19491) (#19497)\n\nOrcInputFormat.initialize() — which swaps Thread.currentThread().setContextClassLoader() and calls FileSystem.get(conf) — was invoked on every createReader() call. When a ParallelIndexTask runs multiple ORC subtasks concurrently in the same JVM (as in embedded tests)"
    },
    {
      "commit": "06ef24c1e09a8000c91dd0767e09278b34066252",
      "tree": "6691aa68fee044de9a0a143600798b5beb7305b4",
      "parents": [
        "215f415e5a20d58074ab1e86ab139d6db09be8a7"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Sat May 23 14:40:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 14:40:06 2026 -0700"
      },
      "message": "feat: ingest support for numeric typed ExpressionLambdaAggregatorFactory (#19508)"
    },
    {
      "commit": "215f415e5a20d58074ab1e86ab139d6db09be8a7",
      "tree": "d24113f606014f1a35c0af888fa57fda8dcc7544",
      "parents": [
        "f0d06c45ada0ce6177e0e0663e27a79a45b917db"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Sat May 23 13:55:48 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 13:55:48 2026 -0700"
      },
      "message": "feat: partial segment cache infrastructure (#19496)\n\nchanges:\n* add `PartialSegmentMetadataCacheEntry` a `CacheEntry` that range-reads the V10 header on mount, constructs `PartialSegmentFileMapperV10`, and shrinks its reservation to actual on-disk size\n* add `PartialSegmentBundleCacheEntry` and `PartialSegmentBundleCacheEntryIdentifier` are `CacheEntry` associated with each file bundle of a v10 segment that sparse-allocates and evicts its containers as a unit; places holds metadata and transitive parent bundle entries holds via the `StorageLocation` methods (weak reference holds on the parent cache entries) and reference-counted usage references\n* add `PartialSegmentCacheBootstrap` a helper that restores partial-format entries from on-disk layout on historical startup (not wired up yet); cleans orphaned bundles\n* add `ResizableCacheEntry` interface and `StorageLocation.adjustReservation` (shrink-only) so the metadata entry can tighten its reservation post-mount\n* rename `SegmentFileBuilder.startFileGroup` → `startFileBundle`; introduce `ROOT_BUNDLE_NAME` as the default bundle for containers written without an explicit declaration                                                              * rename json field `SegmentFileContainerMetadata.fileGroup` → `bundle`; now non-null via getter, normalizes to `ROOT_BUNDLE_NAME` in the constructor, default value omitted from JSON using a custom `JsonInclude` filter\n* Extract shared `DirectoryBackedRangeReader` and `CountingRangeReader` test helpers; consolidate duplicates across processing + server tests"
    },
    {
      "commit": "f0d06c45ada0ce6177e0e0663e27a79a45b917db",
      "tree": "cc3356b2d9ad7d511f945148f44acb553256e714",
      "parents": [
        "50ce46501f2e823598087b2999d3a900e9cc4bc1"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 22 23:34:14 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 23:34:14 2026 -0700"
      },
      "message": "ci: fix unit tests, bump actions-timeline (#19509)\n\n* fix unit tests, bump actions-timeline\n\nCI is failing to startup to run unit tests, complaining about actions-timeline version not being allowed, switched to latest per https://github.com/apache/infrastructure-actions/blob/main/actions.yml\n\n* fix S3InputSourceTest"
    },
    {
      "commit": "50ce46501f2e823598087b2999d3a900e9cc4bc1",
      "tree": "de3b3e99ed18dba7004742f609fe00ecf865e1cb",
      "parents": [
        "b3b1ff255ba7f6145da8e6b1f27020c1ccf675e4"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 22 12:07:25 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 12:07:25 2026 -0700"
      },
      "message": "refactor: remove deprecated zookeeper-based task runner (#19500)"
    },
    {
      "commit": "b3b1ff255ba7f6145da8e6b1f27020c1ccf675e4",
      "tree": "c5a2f658fdbba9a69cd34a41f668aa997dc2f297",
      "parents": [
        "47925aa0998756f0137ec35b4202d2851ca9819d"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Sat May 23 01:40:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 10:40:39 2026 -0700"
      },
      "message": "docs: Stop Referring to MSQ as an extension (#19507)"
    },
    {
      "commit": "47925aa0998756f0137ec35b4202d2851ca9819d",
      "tree": "9d0da091777297afab344e133303dd6e5109ed94",
      "parents": [
        "983c0c37db2ca238fc763d8c3c6ec3dee89e1144"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Fri May 22 12:13:21 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 10:13:21 2026 -0700"
      },
      "message": "fix: Close exposure to potential NPE in S3Utils.useHttps (#19504)"
    },
    {
      "commit": "983c0c37db2ca238fc763d8c3c6ec3dee89e1144",
      "tree": "786152039f6b1ef6fe25b8f5b87578f7e622f0b4",
      "parents": [
        "f0ea14b2f39370c1b97405babe52f3fb36a3120f"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu May 21 23:57:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 23:57:12 2026 -0700"
      },
      "message": "minor: Get StorageMonitor metrics from StorageLocations. (#19494)\n\nThis patch changes StorageMonitor to get metrics from StorageLocations\ndirectly, rather than through SegmentLocalCacheManager. This simplifies\nthe logic by removing an unnecessary layer. It also ensures that metrics\nare reported properly no matter how the StorageLocations are accessed."
    },
    {
      "commit": "f0ea14b2f39370c1b97405babe52f3fb36a3120f",
      "tree": "48abf339b87f45908414c8a58c9926f8ffacab48",
      "parents": [
        "e5e31b7d96282f7f448497fd9b164aa5ac644934"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu May 21 23:56:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 23:56:51 2026 -0700"
      },
      "message": "perf: Hoist config check in acquireSegment. (#19503)\n\nWhen virtual storage is not enabled, it is not possible for a segment\nto be acquired unless it is already-existing."
    },
    {
      "commit": "e5e31b7d96282f7f448497fd9b164aa5ac644934",
      "tree": "c7a88a698aab38fc99678d986e5a951c976d3474",
      "parents": [
        "a946950223808e6adb1f335a727637319d43ffba"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Thu May 21 21:52:11 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 21:52:11 2026 -0700"
      },
      "message": "fix: chat handler response parsing (#19495)\n\nOverlord task report requests can sometimes be too eager during\ningestion and ping a task before the http server servicing the chat\nrequests has spun up. This causes 4xx/5xx to be returned, which\nare not correctly parsed by the chat client. While this doesn\u0027t\nexplicitly fail the ingestion, it spams the logs and causes confusion."
    },
    {
      "commit": "a946950223808e6adb1f335a727637319d43ffba",
      "tree": "6eacbd3adb3f611c425127e7cc816f799ad417e6",
      "parents": [
        "520978e94e24ce6cd8bde2a4c158c68a61e9cd5d"
      ],
      "author": {
        "name": "Cece Mei",
        "email": "yingqian.mei@gmail.com",
        "time": "Thu May 21 21:46:03 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 21:46:03 2026 -0700"
      },
      "message": "feat: consolidate S3 client creation and enable ARN role for MSQ export (#19317)"
    },
    {
      "commit": "520978e94e24ce6cd8bde2a4c158c68a61e9cd5d",
      "tree": "4e754063594100cc3fd914ac624c1c78aee0bad7",
      "parents": [
        "791a071452d25477758705350e5562be2f9ea5ce"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu May 21 12:29:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 12:29:41 2026 -0700"
      },
      "message": "feat: Extension point for MSQ InputSpecs. (#19479)\n\nThis patch adds extension points for InputSpecSlicer and InputSliceReader,\nand uses them to implement TableInputSpec. This eliminates and generalizes\nthe \"newTableInputSpecSlicer\" method on the ControllerContext, which was\npreviously needed because the slicing logic differs for tasks and Dart."
    },
    {
      "commit": "791a071452d25477758705350e5562be2f9ea5ce",
      "tree": "aa903d28b5793b503ffc30e22f4f2abdfb7b22bb",
      "parents": [
        "d2736411784b0e2e978d690270b5dc01d8a1c79d"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Thu May 21 21:02:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 21:02:04 2026 +0800"
      },
      "message": "feat: Multi-cluster Kubernetes Task Runner (#19433)\n\n* Multi-K8s task scheduling\n\n* Register multik8s task runner factory\n\n* Support shared executor in Kubernetes task runner\n\n* Build per-cluster Kubernetes runners\n\n* Support task report streaming for multik8s\n\n* Honor shared informers in multik8s factory\n\n* Style changes\n\n* Tighten multik8s tag map test types\n\n* Fix forbidden APIs\n\n* Annotate nullable methods\n\n* Licenses fix\n\n* Propagate pod template selection in multik8s\n\n* Harden multik8s capacity executor\n\n* Docs for multik8s\n\n* Fix multik8s overlord pod source lookup"
    },
    {
      "commit": "d2736411784b0e2e978d690270b5dc01d8a1c79d",
      "tree": "77fab2609d76c0bdc7e9806666022b355fd432d9",
      "parents": [
        "5938d27a3dbb46a9c68491c7c8602e118b9eb3ca"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Thu May 21 01:34:26 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 23:34:26 2026 -0700"
      },
      "message": "minor: Jump to the last ever derby version (#19492)"
    },
    {
      "commit": "5938d27a3dbb46a9c68491c7c8602e118b9eb3ca",
      "tree": "12deab4dc990506fa88bcc8d177bb1d7c0df8384",
      "parents": [
        "c822ac8f04c2ccc08631b21c6e8bbc3db9e1336d"
      ],
      "author": {
        "name": "nuyb",
        "email": "103496262+wlswo@users.noreply.github.com",
        "time": "Thu May 21 15:12:44 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:12:44 2026 +0800"
      },
      "message": "fix: invalid ISO 8601 start_time placeholder in services view fallback (#19488)\n\nThe non-SQL fallback in `ServicesView` builds rows from\n`/druid/coordinator/v1/servers?simple`, which does not return\n`start_time`, so the column is set to a hardcoded epoch placeholder:\n\n    start_time: \u00271970:01:01T00:00:00Z\u0027,\n\nThe date portion uses `:` separators instead of `-`, which makes the\nliteral an invalid ISO 8601 string — `new Date(\u00271970:01:01T00:00:00Z\u0027)`\nreturns `Invalid Date`. The `Start time` column\u0027s `formatDate` cell\nhands the value to `dayjs(...).toISOString()`, which throws on an\ninvalid input; the surrounding `try/catch` then falls through and\nreturns the original string as-is. As a result, clusters where the\nconsole talks to the coordinator without SQL render every row\u0027s\n`Start time` cell as the literal text `1970:01:01T00:00:00Z` rather\nthan a parsed date.\n\nReplace the separators with dashes so the placeholder is a valid ISO\n8601 epoch timestamp, matching every other ISO 8601 string literal in\nthe web console (e.g. `doctor-checks.tsx`, `sampler.mock.ts`)."
    },
    {
      "commit": "c822ac8f04c2ccc08631b21c6e8bbc3db9e1336d",
      "tree": "0ac41673fcd712921a1eb9c9f7f00a84942ae0af",
      "parents": [
        "111e7338113220bc62987062c1c40a55f9365703"
      ],
      "author": {
        "name": "nuyb",
        "email": "103496262+wlswo@users.noreply.github.com",
        "time": "Thu May 21 15:10:21 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:10:21 2026 +0800"
      },
      "message": "docs: fix off-by-one line anchor in docker tutorial DRUID_LOG4J link (#19487)\n\nThe `DRUID_LOG4J` bullet in the Docker tutorial points at line 52 of the\nexample `distribution/docker/environment` file, but that line is empty.\nThe actual `DRUID_LOG4J\u003d` entry is on line 51, so the anchor lands one\nline below the target. Off by one.\n\nUpdate the anchor from `#L52` to `#L51` so the link lands on the\n`DRUID_LOG4J\u003d` row in the current file layout."
    },
    {
      "commit": "111e7338113220bc62987062c1c40a55f9365703",
      "tree": "163c3218ba1b057fb74bb2158b3953275af071fc",
      "parents": [
        "f357a4b86af4cbb2632be49120a80da3a6cfa7c4"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Wed May 20 18:12:12 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 18:12:12 2026 -0700"
      },
      "message": "feat: add realtimeSegmentsMode query context param (#19486)\n\nThis adds the query context parameter realtimeSegmentsMode and deprecates realtimeSegmentsOnly. realtimeSegmentsOnly\u003dtrue maps to realtimeSegmentsOnly\u003dexclusive and realtimeSegmentsOnly\u003dfalse maps to realtimeSegmentsOnly\u003dinclude.\n\nThis is useful when performing things like blue/green deployments and you only want to query new historical replica ASGs and not touch any \"live\" nodes (neither realtime nor historical)."
    },
    {
      "commit": "f357a4b86af4cbb2632be49120a80da3a6cfa7c4",
      "tree": "8cb3249724cc59dd4c61e5b67fd9eb03d6f9fdfe",
      "parents": [
        "e2af6647c43dfa213ff61c3fed08cee9a0446653"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Thu May 21 02:27:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 11:27:58 2026 -0700"
      },
      "message": "fix: Peon metrics emit same value (#19484)\n\nThis PR fixes incorrect Peon sink-level query metric emission in SinkQuerySegmentWalker. This bug exists since v32, introduced by https://github.com/apache/druid/pull/17170.\n\nThe existing code iterated over METRICS_TO_REPORT and used a switch without break statements. Because reportMetric.getValue() is bound to the current metric reporter, fallthrough caused later accumulator values to be reported through the wrong reporter. For example, the query/segment/time reporter could be called with segment time, then wait time, then segment-and-cache time before emit(). Since DefaultQueryMetrics stores metric values by metric name before emission, the last value overwrote earlier ones."
    },
    {
      "commit": "e2af6647c43dfa213ff61c3fed08cee9a0446653",
      "tree": "cf43e9227b16c72053b21d959ba4a8ce641d87b3",
      "parents": [
        "953b505d57ee3a124999706580118fc5f3a09e64"
      ],
      "author": {
        "name": "nuyb",
        "email": "103496262+wlswo@users.noreply.github.com",
        "time": "Wed May 20 13:44:11 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 21:44:11 2026 -0700"
      },
      "message": "docs: use {{DRUIDVERSION}} template in docker tutorial port link (#19485)\n\nThe Docker tutorial links to the `ports` section of `docker-compose.yml`\nto show how to override the console port. The link was hardcoded to the\n0.21.1 release of the file, so readers who follow it land on a four-year\n-old version that no longer reflects the current cluster layout. The\nthree other GitHub links in the same page (lines 51, 84, and 134) use\nthe `{{DRUIDVERSION}}` template variable, which the docs build replaces\nwith the current Druid release tag — this one link looks like it was\njust missed.\n\nReplace `0.21.1` with `{{DRUIDVERSION}}` so the link follows the rest of\nthe file, and update the line anchor from `#L125` to `#L129` to point at\nthe router service\u0027s `ports:` row in the current file layout."
    },
    {
      "commit": "953b505d57ee3a124999706580118fc5f3a09e64",
      "tree": "6de9ff65b97aa933a569545ec167d12b836bf886",
      "parents": [
        "6e2f4726167a18989833bd62be1f1c9982df2c1c"
      ],
      "author": {
        "name": "Jay Kanakiya",
        "email": "jaykanakiya42@gmail.com",
        "time": "Tue May 19 19:50:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 19:50:00 2026 -0700"
      },
      "message": "refactor: add ColumnFormat implementation for string columns (#19410)"
    },
    {
      "commit": "6e2f4726167a18989833bd62be1f1c9982df2c1c",
      "tree": "1adc16f3ca232a051f1f878b695c7447255e329d",
      "parents": [
        "1d87a74ed7d32fe7dab7237f2ad5cb8e3c57f32f"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Tue May 19 16:34:29 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 16:34:29 2026 -0700"
      },
      "message": "refactor: clean up min/max task count limits in streaming task autoscaler (#19369)"
    },
    {
      "commit": "1d87a74ed7d32fe7dab7237f2ad5cb8e3c57f32f",
      "tree": "fc360e894b80008dc53cbe5f48119be5df3bc9a4",
      "parents": [
        "781aba640008cfaca39e413f53c9d2e9de371126"
      ],
      "author": {
        "name": "nuyb",
        "email": "103496262+wlswo@users.noreply.github.com",
        "time": "Wed May 20 01:47:19 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 09:47:19 2026 -0700"
      },
      "message": "fix: add rel\u003d\"noopener noreferrer\" to web console links opening in a new tab (#19483)\n\nSeveral Blueprint MenuItem and AnchorButton usages in the web console\nopen external links in a new tab via target\u003d\"_blank\" but do not set the\ncompanion rel attribute. Unlike the project\u0027s own ExternalLink\ncomponent, Blueprint does not inject rel\u003d\"noopener noreferrer\"\nautomatically (verified against the rendered HTML in about-dialog\u0027s\nsnapshot), so each new tab can reach back into the opener window and\nthe destination receives a Referer header.\n\nAdd rel\u003d\"noopener noreferrer\" to every existing target\u003d\"_blank\" call\nsite that was missing it: the help menu and Explore link in the header\nbar, the \"Visit Druid\" button in the about dialog, the DruidSQL docs\nmenu item in the workbench, the array ingest mode docs menu item in the\nrun panel, the flattenSpec help button in the load-data view, and the\n\"Learn more\" button in the SQL data loader schema step.\n\nSnapshot tests are updated to match the new rendered HTML; no other\nbehavior changes."
    },
    {
      "commit": "781aba640008cfaca39e413f53c9d2e9de371126",
      "tree": "df4b3c8e05be1e1e06913dc6c8bfc4a145d0c776",
      "parents": [
        "a11815339311a56ed1292b1965c4e39ba8bc572a"
      ],
      "author": {
        "name": "Maytas Monsereenusorn",
        "email": "maytasm@apache.org",
        "time": "Mon May 18 22:53:51 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 22:53:51 2026 -0700"
      },
      "message": "perf: Optimize SpillingGrouper to avoid unnecessary disk I/O for small spill runs (#19439)"
    },
    {
      "commit": "a11815339311a56ed1292b1965c4e39ba8bc572a",
      "tree": "ba60204e69e79e6795b2dd3c8e4abb16a895c3f0",
      "parents": [
        "4628e43081bf0ecc5aec4f904e544e03bf4ab7d6"
      ],
      "author": {
        "name": "nuyb",
        "email": "103496262+wlswo@users.noreply.github.com",
        "time": "Tue May 19 14:27:12 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 22:27:12 2026 -0700"
      },
      "message": "fix: web console services card omits most service types without SQL (#19481)\n\nThe home dashboard\u0027s Services card has two code paths: the SQL path\ncounts every node role via sys.servers, while the coordinator-only\nfallback was calling /druid/coordinator/v1/servers?simple — an\ninventory-backed endpoint that only reports segment-loading servers\n(historical, peon, and brokers that hold broadcast segments). As a\nresult, on clusters where the console talks to the coordinator without\nSQL, overlord, coordinator, router, broker, and indexer counts were\nsilently dropped from the card, making the cluster look smaller than it\nactually is."
    },
    {
      "commit": "4628e43081bf0ecc5aec4f904e544e03bf4ab7d6",
      "tree": "69c6f1f13f502b64707901e8b60f518dd0e3dab6",
      "parents": [
        "577dd6a6fcfff7bc12bb992d2279aa5430826192"
      ],
      "author": {
        "name": "Maytas Monsereenusorn",
        "email": "maytasm@apache.org",
        "time": "Mon May 18 22:26:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 22:26:06 2026 -0700"
      },
      "message": "perf: Optimize HLL sketch merge by avoiding unnecessary HLL_8 to HLL_4 conversion (#19482)"
    },
    {
      "commit": "577dd6a6fcfff7bc12bb992d2279aa5430826192",
      "tree": "0217718e0fe706e8f02b8432bab1905f769f9094",
      "parents": [
        "1001b6f5d4bff72876ba730a00f34e5b1bf32631"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Tue May 19 00:12:54 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 22:12:54 2026 -0700"
      },
      "message": "Bump postgres dep due to high vuln (#19474)"
    },
    {
      "commit": "1001b6f5d4bff72876ba730a00f34e5b1bf32631",
      "tree": "98c0465278d829e14b11a1ed21f30e487770f69c",
      "parents": [
        "8308a662874667b49e227a3422742922a08889e3"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Mon May 18 21:34:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 21:34:49 2026 -0700"
      },
      "message": "fix: ensure sequence metadata list accesses are threadsafe in task runner (#19467)"
    },
    {
      "commit": "8308a662874667b49e227a3422742922a08889e3",
      "tree": "435b17f9278cf2b400533893557370e9c8061d68",
      "parents": [
        "b04b349bef32eb0ddc0fd799c5d1e5a57eed034a"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Mon May 18 18:57:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 18:57:43 2026 -0700"
      },
      "message": "perf: Streamline s3 backend (#19394)\n\nS3 achieve strong read-after-write consistency in 2020. The current s3 backend architecture assumes a prior consistency model and therefore does some redundant calls which are both slow and costly."
    },
    {
      "commit": "b04b349bef32eb0ddc0fd799c5d1e5a57eed034a",
      "tree": "0c64e92b815a429e542de6ce755b3c277292b50f",
      "parents": [
        "375dfd128cdc613e8385e71bfefd63df0a932ee0"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Mon May 18 16:23:15 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 14:23:15 2026 -0700"
      },
      "message": "bump bouncy castle due to CVE-2026-5588 (#19473)"
    },
    {
      "commit": "375dfd128cdc613e8385e71bfefd63df0a932ee0",
      "tree": "6395a6e940d9d94de43732797fdebb6a8aa38569",
      "parents": [
        "2a0edc5a8de887155ceff000f58c1fbd2c6ed724"
      ],
      "author": {
        "name": "Vadim Ogievetsky",
        "email": "vadim@ogievetsky.com",
        "time": "Mon May 18 13:17:37 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 13:17:37 2026 -0700"
      },
      "message": "minor: Web console: improve and fix supervisor view (#19475)\n\n* improve and fix supervisor view\n\n* update test\n\n* add aggregate lag label"
    },
    {
      "commit": "2a0edc5a8de887155ceff000f58c1fbd2c6ed724",
      "tree": "663c059a317e34c301bc305540059e610e812473",
      "parents": [
        "f0f69ff521804c9edab9f0a743bfefd9adbcfe46"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Mon May 18 10:23:02 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 10:23:02 2026 -0700"
      },
      "message": "refactor: Make QueryBlocklistRule an interface for extensibility (#19457)\n\n- Convert QueryBlocklistRule from a concrete class to an interface with two methods: getRuleName() and matches(Query\u003c?\u003e).\n- Moves the existing implementation to DefaultQueryBlocklistRule with a default impl on the interface @JsonTypeInfo(defaultImpl \u003d DefaultQueryBlocklistRule.class) so existing JSON configs without a \"type\" field continue to deserialize correctly.\n- Extensions can register new rule types as Jackson subtypes via SimpleModule.registerSubtypes(...) and we can even introduce new union rule types with different logic w/o polluting existing default implementation."
    },
    {
      "commit": "f0f69ff521804c9edab9f0a743bfefd9adbcfe46",
      "tree": "54a9301a904cea29a05a286d5100b32be0412af5",
      "parents": [
        "ad89c3f1afdc19ca9df748d4f274a262708e8b7e"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Mon May 18 09:56:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:56:39 2026 -0700"
      },
      "message": "minor: add fileGroup to V10 segment SegmentFileContainerMetadata, switch default metadata compression to zstd (#19468)"
    },
    {
      "commit": "ad89c3f1afdc19ca9df748d4f274a262708e8b7e",
      "tree": "f78d8bcdf9431db3f30972e06827c8fb46bfa339",
      "parents": [
        "12dcedf55073096160d0b91e24b3ce971b8be6fc"
      ],
      "author": {
        "name": "Lewis",
        "email": "yoman567890@live.co.uk",
        "time": "Mon May 18 17:31:45 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:31:45 2026 -0700"
      },
      "message": "fix: source jvm.config from peon.sh for K8s peon containers (#19364)\n\nFixes #18791.\n\nJVM options declared in a jvm.config ConfigMap are now honored by peons launched via the Kubernetes overlord extension (including when using the customTemplateAdapter). Previously, peon.sh silently ignored jvm.config, causing the peon JVM to fall back to container-aware JDK defaults."
    },
    {
      "commit": "12dcedf55073096160d0b91e24b3ce971b8be6fc",
      "tree": "1c316975163451e9f4092c188b3835e8a4d8bfa1",
      "parents": [
        "47b65f55fc0303368f44db76a1c07d4b0c48c69f"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Mon May 18 21:31:38 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:01:38 2026 -0700"
      },
      "message": "fix: preserve GROUPING SET dimensions with single-value filter  (#19285)\n\nFixes #13204\n\nFixed a bug where a SQL query using GROUPING SETS with a single-value WHERE filter on a grouped dimension would return the filtered value instead of null in subtotal rows that exclude that dimension. For example, WHERE dim2 \u003d \u0027a\u0027 GROUP BY GROUPING SETS ((dim1, dim2), (dim1)) now correctly returns null for dim2 in the (dim1) subtotal rows instead of repeating \u0027a\u0027."
    },
    {
      "commit": "47b65f55fc0303368f44db76a1c07d4b0c48c69f",
      "tree": "1f3acadc4e1d414db16ca557d10b8239a65c8ef3",
      "parents": [
        "6d46c97c11c0f5aebba12710c1b29492c510d87c"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Sun May 17 21:01:49 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 21:01:49 2026 -0700"
      },
      "message": "feat: separate worker disabled state from worker version (#19448)\n\nCurrently, to disable a worker (MM/Indexer), you need to set the version as \"\". This is not ideal, as it\u0027s difficult to see a) what version a disabled worker is and b) write any logic to perform scaling around multi-version worker deployments (for example during a rolling upgrade).\n\nThis ensures the disabled state is tracked separately from the worker version. The change is backwards compatible (to not break existing deployments) and can then be migrated to simply relying on the disabled flag in a subsequent release."
    },
    {
      "commit": "6d46c97c11c0f5aebba12710c1b29492c510d87c",
      "tree": "9b81b58018032747ebd91fffeba1cdde4b5d3616",
      "parents": [
        "6403ab6a98dbc8ada804e376237489832af34ec1"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Mon May 18 09:26:59 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 20:56:59 2026 -0700"
      },
      "message": "Centralise iceberg.core.version in root pom and align embedded-tests on 1.10.0 (#19470)\n\nFixes #19469.\n\nCentralise iceberg.core.version in root pom and align embedded-tests on 1.10.0\nGenericParquetWriter.buildWriter() was removed in Iceberg 1.10.0 in favour of create()."
    },
    {
      "commit": "6403ab6a98dbc8ada804e376237489832af34ec1",
      "tree": "71104270b3254714eeab5296f2eeb1b0c0ca67a0",
      "parents": [
        "a207a6857e0a0ba579f60501b1913bb575df812a"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Sun May 17 10:47:30 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 16 22:17:30 2026 -0700"
      },
      "message": "ci: pre-pull Testcontainers images in worker before unit tests (#19464) (#19465)\n\nFixes #19464.\n\nOnce the image is in the runner\u0027s local Docker daemon cache, KafkaContainer start in KafkaResource becomes a pure container-spinup (~5-15 s) instead of pull+spinup (~30-90 s + Docker Hub variance). The 60 s LatchableEmitter wall now has 4-12× more headroom."
    },
    {
      "commit": "a207a6857e0a0ba579f60501b1913bb575df812a",
      "tree": "e249b4b1fc08f4c492638de2d9ed6beac7e6efb5",
      "parents": [
        "174b3a7d4cc64b19f563e812104c7bffe59c6b6e"
      ],
      "author": {
        "name": "Jiang Wu",
        "email": "contact@jiangwu.eu",
        "time": "Fri May 15 13:24:56 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 19:24:56 2026 +0800"
      },
      "message": "fix: Use FileSystem on getPaths() instead of mapreduce.Job (#19418)\n\n* fix: Use FileSystem on getPaths() instead of mapreduce.Job\n\n* fix: Use FileSystem on getPaths() instead of mapreduce.Job"
    },
    {
      "commit": "174b3a7d4cc64b19f563e812104c7bffe59c6b6e",
      "tree": "f89789f464bcf6929a3f90467f3ab92614d1ce8c",
      "parents": [
        "d67ab01ce150edcae0f7f3f1f5d77a1eaa6143aa"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 15 01:56:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 01:56:23 2026 -0700"
      },
      "message": "feat: clustered segments DataSegment changes and PartialLoadMatcher (#19462)"
    },
    {
      "commit": "d67ab01ce150edcae0f7f3f1f5d77a1eaa6143aa",
      "tree": "ca8cfd4edebb4f5a53576b12c0e1d2e87c1353aa",
      "parents": [
        "fb83544df877746dd336fcb60f6937277750ebb9"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Thu May 14 19:35:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 19:35:17 2026 -0700"
      },
      "message": "feat: coordinator-side reconciliation for partial-load rules (#19461)\n\n\nchanges:\n* adds selective inventory wrapping with `DataSegmentAndLoadProfile` which extends `DataSegment`; full-load slots in `DruidDataSource` / `ImmutableDruidDataSource` stay bare, only partial-loaded slots allocate a wrapper\n* `PartialLoadProfile` records routed through a weak interner so identical profiles across replicas share by reference (the `wrappedLoadSpec` map is the bulk of per-replica heap).\n* `SegmentChangeRequestLoad.forAnnouncement(segment)` detects a `partialProjection` wrapper on the segment\u0027s load spec and stamps the wrapper\u0027s fingerprint plus full segment size as `loadedBytes` — the coordinator reads this as a full-fallback profile, so partial-load rules work end-to-end (modulo no real partial loading yet) without thrashing\n* `BatchDataSegmentAnnouncer` calls new method `forAnnouncement` on all three announcement paths to create the proper announcement depending on partial load profile\n* fingerprint-aware partial reconciler in `StrategicSegmentAssigner`; classifies replicas (matching/stale, loaded/in-flight) via new `PartialSegmentStatusInTier`, applies the load-then-drop swap (stale stays serving until matching has actually loaded), cancels stale in-flight loads and re-targets the freed slots, allows additive reload on stale-loaded servers to mitigate the no-spare-server stuck state\n* `ImmutableDruidServer.getPartialLoadProfile`, `DruidServer.addDataSegment(segment, profile)` with `loadedBytes`-aware `currSize` accounting, `HttpServerInventoryView` threads announcement-side profile through\n* in-flight profile tracking on `ServerHolder.startOperation(action, segment, profile)` and `SegmentHolder.getProfile()` so the reconciler can read in-flight fingerprints.\n* new coordinator stats - `PARTIAL_ASSIGNED`, `PARTIAL_STALE_DROPPED`, `PARTIAL_STALE_CANCELLED`\n* removed `SegmentLoadingCapabilities.supportsPartialLoad` (now unused — per-replica `isFullFallback` is the better signal); coordinator always issues partial-load requests, historical handles via full-fallback until real partial loading lands\n* tests: `StrategicSegmentAssignerPartialTest` (reconciler scenarios), `DruidServerPartialLoadTest` (size accounting), `PartialLoadProfileTest` (interning), `SegmentChangeRequestLoadTest` (forAnnouncement), updates across affected fixtures"
    },
    {
      "commit": "fb83544df877746dd336fcb60f6937277750ebb9",
      "tree": "9fc5d43c718a946addd8d4004f78d57c85101d79",
      "parents": [
        "d602e3acf3e87f7118a9657e75e560667a618eae"
      ],
      "author": {
        "name": "317brian",
        "email": "53799971+317brian@users.noreply.github.com",
        "time": "Thu May 14 10:40:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 10:40:20 2026 -0700"
      },
      "message": "docs: add caution re: schema auto discovery (#19403)\n\nCo-authored-by: Jill Osborne \u003cjill.osborne@imply.io\u003e\nCo-authored-by: Charles Smith \u003ctechdocsmith@gmail.com\u003e"
    },
    {
      "commit": "d602e3acf3e87f7118a9657e75e560667a618eae",
      "tree": "c65a44650c651da8a2a0b3278faeb7141ba22cb2",
      "parents": [
        "b458bf1530b272c1dcb3b9aa58578486f65c1b59"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Thu May 14 09:15:47 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 14 09:15:47 2026 -0700"
      },
      "message": "fix: Make `sys.server_properties` table filterable and resilient to unreachable servers (#19459)\n\n1. Made sys.server_properties filterable, similar to a few other sys tables like SegmentsTable — changed from ScannableTable to ProjectableFilterableTable, enabling Calcite to push down filters (e.g., WHERE server \u003d \u0027...\u0027) and projections to the table scan.\n2. Graceful error handling — Previously, if any server was unreachable or returned an HTTP error, the entire query threw an exception and failed. Now the table returns a row for that server with property/value as null and the new\nerror_message column populated with what went wrong.\n3. New error_message column — this column indicates if properties couldn\u0027t be fetched (e.g., \"Connection refused\", \"HTTP 503: Service Unavailable\"). Null on success."
    },
    {
      "commit": "b458bf1530b272c1dcb3b9aa58578486f65c1b59",
      "tree": "d2062b630966c7ff8adeb1daef3ae512a3143418",
      "parents": [
        "04e4267fc1749033d415a627ae3f6361bfe68fc1"
      ],
      "author": {
        "name": "aho135",
        "email": "andrewho135@gmail.com",
        "time": "Wed May 13 16:18:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 16:18:32 2026 -0700"
      },
      "message": "feat: Bounded Stream Supervisor (#19372)\n\n* Initial implementation for BoundedStreamConfig\n\n* Implement isOffsetAtOrBeyond for Rabbit and Kinesis\n\n* Unit test coverage\n\n* Fix BoundedStreamConfigTest\n\n* Remove unused import\n\n* Remove unneeded tests\n\n* Unit test fix\n\n* Fix import and add coverage for RabbitStreamSupervisor\n\n* Test coverage for validateBoundedStreamConfig\n\n* Re-initialize partition group and reset state after reset\n\n* Handle edge case where startOffset equals endOffset\n\n* Compare Kinesis sequence numbers using BigInteger\n\n* Remove stale test case\n\n* Remove redundant validation of boundedStreamConfig\n\n* Throw DruidException with ADMIN persona for BoundedStreamConfig\n\n* Clean up unused Logger\n\n* javadoc and comment cleanup for isBoundedWorkComplete\n\n* Add embedded test for bounded ingestion\n\n* Add boundedStreamConfig to SeekableStreamDataSourceMetadata for metadata validation\n\n* Revert pendingCompletionGroups check\n\n* Unit test fix\n\n* embedded-test for metadata mismatch\n\n* Remove unused var\n\n* Unit test fix\n\n* Add boundedStreamConfig documentation\n\n* Fix spellcheck\n\n* Increase code coverage\n\n* Increase coverage for BoundedStreamConfig\n\n* Remove unnecessary test\n\n* Simplify completion check in createNewTasks\n\n* Remove unused function\n\n* Unit test bounded supervisor completion\n\n* Improve coverage on RabbitStreamSupervisor\n\n* Unit test coverage\n\n* Unit test for IllegalArgumentException for KafkaSupervisor\n\n* Check if end offsets are exclusive for bounded work completion\n\n* Increase branch coverage\n\n* Increase branch coverage\n\n* Unit test coverage\n\n* Fix import\n\n* Remove use of deprecated function\n\n* Revert to deprecated function since not initialized in mock object\n\n* Fix merge conflict\n\n* Detect metadata mismatch when committed offset \u003e bounded config end\n\n* Clean up redundant tests in BoundedStreamConfigTest and use EqualsVerifier\n\n* Compare Kinesis Sequence numbers using built in comparison\n\n* Clean up docs based on review comments\n\n* Early return before convert for hasTaskGroupReachedBoundedEnd\n\n* Resolve merge conflicts\n\n* Fix KinesisSupervisorTest\n\n* Update KinesisSupervisorTest.java\n\n* Cover case where start \u003e end"
    },
    {
      "commit": "04e4267fc1749033d415a627ae3f6361bfe68fc1",
      "tree": "e3e0bb6dfb856101d52890d839b897602f77f47d",
      "parents": [
        "d4eefcc538ebd4b403d50b17328760f205b69905"
      ],
      "author": {
        "name": "317brian",
        "email": "53799971+317brian@users.noreply.github.com",
        "time": "Wed May 13 14:23:15 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 14:23:15 2026 -0700"
      },
      "message": "docs: catch upgrade notes page up (#19447)\n\n* docs: catch upgrade notes page up\n\n(cherry picked from commit 2ea198c1c8e5df2660590c7244197b917b673d94)\n\n* fixes"
    },
    {
      "commit": "d4eefcc538ebd4b403d50b17328760f205b69905",
      "tree": "81f1bd2ea9ae624d8cd2fd998411fc4983080873",
      "parents": [
        "3ba9977c60afadc6a963b9126d099012b0f86dc3"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Wed May 13 14:32:56 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 17:02:56 2026 +0800"
      },
      "message": "fix: Fix race in LocalIntermediaryDataManager.addSegment  (#19446)\n\n* Fix race in LocalIntermediaryDataManager.addSegment using ConcurrentHashMap + AtomicInteger (#19443)\n\n* Add concurrency unit test for LocalIntermediaryDataManager.addSegment"
    },
    {
      "commit": "3ba9977c60afadc6a963b9126d099012b0f86dc3",
      "tree": "17fee002b8ba7adadf28c54e40f7b9af724c9d07",
      "parents": [
        "eb34e2a8ef19c11474cf547d1712e7719bae62e2"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Wed May 13 00:31:22 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 00:31:22 2026 -0700"
      },
      "message": "feat: Add `now()` to troubleshoot pipeline latencies (#19386)\n\nfeat: Added now() expression function that returns the current system timestamp in milliseconds since epoch. Useful at ingestion time for troubleshooting pipeline delays (e.g., now() - __time). Note: now() is non-deterministic as it evaluates for every row, so it can break idempotency. This can only be added to columns that are not __time."
    },
    {
      "commit": "eb34e2a8ef19c11474cf547d1712e7719bae62e2",
      "tree": "32b6c1b61babf4a443ab6661242b85d5aec8cd06",
      "parents": [
        "630ca9f702482ddf1ad357f5838f780c9c47e1a1"
      ],
      "author": {
        "name": "Shekhar Prasad Rajak",
        "email": "5774448+Shekharrajak@users.noreply.github.com",
        "time": "Wed May 13 07:47:14 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 10:17:14 2026 +0800"
      },
      "message": "build(deps): Kafka client 4.2.0 upgrade (#19441)\n\n* Bump Kafka client to 4.2.0 (#19322)\n\n* Migrate Kafka Consumer.poll(long) to poll(Duration) for Kafka 4.x\n\n* Add EmbeddedKafkaBroker test helper using Testcontainers\n\n* Migrate kafka-indexing-service tests to EmbeddedKafkaBroker; drop TestBroker\n\n* Migrate TestKafkaExtractionCluster to Testcontainers; bump licenses\n\n* Drop unused throws Exception from setupClass in Kafka tests\n\n* Add curator-test test dep to kafka-indexing-service for embedded ZK"
    },
    {
      "commit": "630ca9f702482ddf1ad357f5838f780c9c47e1a1",
      "tree": "c9e5f5af253f13da84dc6147143c4e5d8e2f2c9d",
      "parents": [
        "459c62a6f8b4cf70d9a4148f51a1e60416b43758"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Tue May 12 15:08:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 15:08:10 2026 -0700"
      },
      "message": "fix: Emit publish metrics only when tasks actually publish. (#19395)\n\nWith task replicas, this avoids double-emitting of metrics."
    },
    {
      "commit": "459c62a6f8b4cf70d9a4148f51a1e60416b43758",
      "tree": "babd142efdee03e8e5b9fe7f4554d529ec680c20",
      "parents": [
        "09611d6332ae43fd34b91dabfc94423ff04bdc41"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Tue May 12 12:33:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 12:33:46 2026 -0700"
      },
      "message": "perf: Avoid creating processing buffers beyond what is needed. (#19426)\n\nIn Dart, processing buffers are sliced up from the merge buffer.\nFor stages that do not use all processing threads -- perhaps because\nthey do not have enough inputs -- we can be more efficient with memory\nby slicing the merge buffer based on the actual number of processors,\nnot the number of processing threads.\n\nThis patch addresses it by deferring the choice of how many buffers\nare needed until the stage actually starts executing. At that point,\nit knows how many processors it will create."
    },
    {
      "commit": "09611d6332ae43fd34b91dabfc94423ff04bdc41",
      "tree": "0f0071e2005aa3bcc47c85aa18b1e400a37ad2ad",
      "parents": [
        "f9ae483effc7856e1072ab9a19cdbc19ea305104"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Tue May 12 10:03:21 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 10:03:21 2026 -0700"
      },
      "message": "feat: Metrics tracking storage load begin and end. (#19451)\n\nPrior to this patch, the storage/load/bytes and\nstorage/virtual/load/bytes metrics were measured from the time the space\nis reserved, which can obscure timings of the actual load. This patch\nmakes two changes:\n\n1) Modify storage/load/bytes and storage/virtual/load/bytes to measure\n   once the load is complete, rather than when it starts.\n\n2) Introduce storage/load/begin/bytes and storage/virtual/load/begin/bytes\n   to match what the storage/load/* metrics used to be.\n\nThe same changes are made to the \"count\" metrics that correspond to\nthese \"bytes\" metrics."
    },
    {
      "commit": "f9ae483effc7856e1072ab9a19cdbc19ea305104",
      "tree": "00057e8efb459185804a688387f42408294025ef",
      "parents": [
        "3bb525bc5cef210d1c96fbc1762379034452cf4c"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Tue May 12 09:58:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 09:58:28 2026 -0700"
      },
      "message": "feat: Replace Task.supportsQueries() with finer-grained config. (#19444)\n\nTasks can now declare exactly which resources they need. MSQWorkerTask\ntakes advantage of this to declare that it does not need merge buffers,\nwhich saves some memory."
    },
    {
      "commit": "3bb525bc5cef210d1c96fbc1762379034452cf4c",
      "tree": "6741dcd928a8a050261e9e4c445ab1787e501f07",
      "parents": [
        "4e07a0ebbb89fca3abce4e1d8c5f3150d34f26c4"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Tue May 12 00:03:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 00:03:59 2026 -0700"
      },
      "message": "fix: emit query/node/{bytes/time} metrics even on query failure to data node (#19453)\n\nFailed requests to data nodes (e.g. timeouts) will not log query/node/bytes, query/node/time, nor any backpressure metrics which are all useful in debugging bottlenecks for queries. Make sure these are emitted irrespective of whether the query was successful or not."
    },
    {
      "commit": "4e07a0ebbb89fca3abce4e1d8c5f3150d34f26c4",
      "tree": "4daa8dc429d288419eb918f3c49691b604feb96c",
      "parents": [
        "99c97432ff265eb4892e2cb9eeeac7d73bdd748d"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Mon May 11 16:40:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 16:40:27 2026 -0700"
      },
      "message": "minor: include exception message for supervisor payload deserialization errors (#19452)\n\nInclude the spec parse exception for better traceability when reading spec payloads from db."
    },
    {
      "commit": "99c97432ff265eb4892e2cb9eeeac7d73bdd748d",
      "tree": "af45d82d1cb09f755f04b7f82df94c9b90057acd",
      "parents": [
        "68168f87654d72c373ff146151c10dbed448ec21"
      ],
      "author": {
        "name": "jtuglu1",
        "email": "jtuglu@netflix.com",
        "time": "Mon May 11 15:16:24 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 15:16:24 2026 -0700"
      },
      "message": "perf: batch reset invalid stream offsets in stream supervisor (#19431)\n\nI\u0027ve noticed that recent Druid can be extremely slow to recover from a lagging supervisor (where offsets are invalid and tuningConfig.resetOffsetAutomatically\u003dtrue). For each taskGroup, identify + reset all invalid partition offsets in one go. Once we have established the set of invalid offsets, perform an internal reset, then throw the exception. This reduces the time-to-recovery of a fatally-lagged supervisor from N runInternal() calls to 1 runInternal() call, where N is the # of invalid partition offsets."
    },
    {
      "commit": "68168f87654d72c373ff146151c10dbed448ec21",
      "tree": "54060891f0b45ac4986e62e7a797c688c1d17744",
      "parents": [
        "49a4cdc6b4055e2045b17e59c2ec70af02b33ef1"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Sun May 10 21:48:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 10 21:48:17 2026 -0700"
      },
      "message": "fix: Use optimized aggregators consistently in MSQ GroupBy. (#19445)\n\nRepairs a collision between #19423 and #19397. With cursor-building\nand processing decoupled, both halves of the operation need the\noptimized aggregators."
    },
    {
      "commit": "49a4cdc6b4055e2045b17e59c2ec70af02b33ef1",
      "tree": "e418af526187bdec3ac63410854bb930424aa054",
      "parents": [
        "ad6899ebf644957b606ef67a716400a024290e15"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Sat May 09 23:37:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 10 14:37:56 2026 +0800"
      },
      "message": "test: convert tests in druid-processing to junit5 pt. 8 (#19387)"
    },
    {
      "commit": "ad6899ebf644957b606ef67a716400a024290e15",
      "tree": "bea3d338ccb908f800fae0f60f957510c46791b5",
      "parents": [
        "98ea27ee07230458db69cc55f9055bb01b4e6c1f"
      ],
      "author": {
        "name": "Edwin Ing",
        "email": "edwinji2@illinois.edu",
        "time": "Sat May 09 23:37:44 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 10 14:37:44 2026 +0800"
      },
      "message": "fix: Added all possible exceptions to MySQLInputSourceDatabaseConnectorTest (#18734)\n\n* Added all possible exceptions to tests\n\n* Added dependency to pom.xml"
    },
    {
      "commit": "98ea27ee07230458db69cc55f9055bb01b4e6c1f",
      "tree": "68510fa48bf25170f5a1730f91b3947f16578df5",
      "parents": [
        "4a9cde30903e5ecf872214710faf3c8ecd9927f8"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Sat May 09 14:52:13 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 09 14:52:13 2026 -0700"
      },
      "message": "test: Write embedded test task logs to the main logger. (#19428)\n\nIn production, Indexers write task logs to their own dedicated files\nin order to make them separately uploadable and viewable. In embedded\ntests, it\u0027s better to write task logs to the main log file, to keep\nall logging output for the test run in one place."
    },
    {
      "commit": "4a9cde30903e5ecf872214710faf3c8ecd9927f8",
      "tree": "cf2c78df69addb94675ac1149e4897d7bf5da5c0",
      "parents": [
        "5341f9608585e849f28461bbeb8829a3bd52b59e"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 08 13:53:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 13:53:53 2026 -0700"
      },
      "message": "feat: Wire format and data model for partial-projection load rules (#19409)\n\n* add `PartialProjectionLoadSpec`, a `LoadSpec` wrapper for partial-projection loads with lazy delegate materialization\n* add `PartialLoadSpecModule` and register it in `CoreInjectorBuilder` so historicals always have the wrapper\n* add `supportsPartialLoad` capability flag to `SegmentLoadingCapabilities`; historicals (will eventually) advertise true, coordinator defaults to false for unknown servers\n* add optional `fingerprint` and `loadedBytes` wire fields to `SegmentChangeRequestLoad` for historical partial-load announcements (NON_NULL include)\n* add `PartialLoadProfile` generic data model (wrappedLoadSpec, fingerprint, loadedBytes) with `forRequest` / `forLoaded` / `forFullFallback` factories\n* add `SegmentActionHandler.replicateSegmentPartially` default throwing `UnsupportedOperationException`\n* wire `PartialLoadRule.run()` to route through `replicateSegmentPartially` when the matcher resolves; fall back to `replicateSegment` for FULL_LOAD-on-cannot-match"
    },
    {
      "commit": "5341f9608585e849f28461bbeb8829a3bd52b59e",
      "tree": "953e777af445d0d1de0f3a5198072d061c19bc04",
      "parents": [
        "8ce2f36ce4dcba7420cc47801ec23148854dde9a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri May 08 11:02:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 11:02:38 2026 -0700"
      },
      "message": "build(deps): bump axios from 1.15.0 to 1.15.2 in /web-console (#19430)\n\nBumps [axios](https://github.com/axios/axios) from 1.15.0 to 1.15.2.\n- [Release notes](https://github.com/axios/axios/releases)\n- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)\n- [Commits](https://github.com/axios/axios/compare/v1.15.0...v1.15.2)\n\n---\nupdated-dependencies:\n- dependency-name: axios\n  dependency-version: 1.15.2\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8ce2f36ce4dcba7420cc47801ec23148854dde9a",
      "tree": "ebc157f169df57325d277a4822fd9120f77454de",
      "parents": [
        "12e31b241464dfb6d6feb1cedb6e9e9af1d3b94e"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 08 03:39:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 03:39:31 2026 -0700"
      },
      "message": "feat: add async CursorFactory API and migrate MSQ frame processors to use it (#19397)\n\nchanges:\n* add `AsyncCursorHolder` to manage async loading lifecycle for a cursor holder until ownership of the `CursorHolder` it produces can be transferred to the consumer (see javadoc for details)\n* add `CursorFactory.makeCursorHolderAsync(CursorBuildSpec)` for cursor factories backed by partial downloads can do I/O without blocking processing threads, with a default implementation returning `AsyncCursorHolder.completed(makeCursorHolder(spec))` so existing implementations remain async-correct without changes\n* add `GroupingEngine.makeCursorHolderAsync` returning `AsyncCursorHolder`, and extracting shared `processWithCursorHolder` helper from `GroupingEngine.process()`, so that a caller which can yield and then resume can wait for the `CursorHolder` to be ready and later process it\n* migrate `ScanQueryFrameProcessor.runWithSegment` to call `makeCursorHolderAsync` and yield via `ReturnOrAwait` while the load is pending\n* migrate `GroupByPreShuffleFrameProcessor.runWithSegment` cursor path to call `GroupingEngine.makeCursorHolderAsync` and yield via `ReturnOrAwait` while loading"
    },
    {
      "commit": "12e31b241464dfb6d6feb1cedb6e9e9af1d3b94e",
      "tree": "1313c59e4a717c4bcc007abb238a2a7077050edf",
      "parents": [
        "454c1c6d191273514c46d652d7b26f2ce95b5afc"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Fri May 08 02:23:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 02:23:26 2026 -0700"
      },
      "message": "feat: persist __time min/max in V10 ProjectionMetadata (#19398)\n\nchanges:\n* add nullable `minTime`/`maxTime` Long fields to `ProjectionMetadata` alongside the existing `numRows`\n* track min/max __time in `IndexMergerBase.mergeIndexesAndWriteColumns` via `timestampSelector.getLong()` on each row; surface via `IndexMergeResult` (null when zero rows are walked)\n* `IndexMergerV10` wires the merge result\u0027s values into the base-table `ProjectionMetadata`; aggregate projections leave the new fields null for now, though we can easily add this in future work if useful\n* tracking is done regardless of segment sort order, non-time-sorted segments (`DimensionsSpec.forceSegmentSortByTime` \u003d false) also store these values accurately (just with less utility since we can\u0027t use the information to skip rows, though we could use them to know if there are no rows within the time range)\n* write-side only: fields are persisted but not yet consumed. A follow-up will add a partial V10-aware `TimeBoundaryInspector` that reads them"
    },
    {
      "commit": "454c1c6d191273514c46d652d7b26f2ce95b5afc",
      "tree": "62fe0b84da4d56f8baa463c3de64e1aeea8d56f4",
      "parents": [
        "6bcf7dc183ebee66aed39113bc4a7263f3fa0e56"
      ],
      "author": {
        "name": "Frank Chen",
        "email": "frank.chen021@outlook.com",
        "time": "Fri May 08 09:56:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 09:56:39 2026 +0800"
      },
      "message": "fix: Optimize nullable numeric aggregation for Pooled TopN (#19390)\n\n* Optimize nullable numeric aggregators for no-null columns\n\n* fix: Preserve nullable aggregate semantics outside TopN\n\n* fix: Apply nullable numeric TopN sizing consistently\n\n* Revert stylistic changes\n\n* Add topN Engine Test to test topN selection\n\n* Fix forbidden apis\n\n---------\n\nCo-authored-by: GWphua \u003cphuaguanwei99@gmail.com\u003e"
    },
    {
      "commit": "6bcf7dc183ebee66aed39113bc4a7263f3fa0e56",
      "tree": "d8fac6b229bc12f5d95d454c7657f2a8b1781061",
      "parents": [
        "18610a7a825947f63ae3dc74aedf4f4674270126"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Fri May 08 09:56:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 09:56:26 2026 +0800"
      },
      "message": "Add lock to dependency cache for Dockerfile (#19424)"
    },
    {
      "commit": "18610a7a825947f63ae3dc74aedf4f4674270126",
      "tree": "281718b349c5b3a9d8ce3415aa64ba05b1ba33c9",
      "parents": [
        "7409070f9457478f8ee51805a0f4043d14cf31d5"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Fri May 08 09:56:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 08 09:56:16 2026 +0800"
      },
      "message": "fix: Address issue where Broker upgrade before Overlord causes NPE (#19425)\n\n* Fix bug where Broker upgrade before Overlord causes NPE\n\n* Add comment explaining backward compatibility"
    },
    {
      "commit": "7409070f9457478f8ee51805a0f4043d14cf31d5",
      "tree": "3d6b44ce38fbe077600784b806dba7a532fc271b",
      "parents": [
        "56a10f50e5eeee5dc577692a64706bdda7c7e26a"
      ],
      "author": {
        "name": "Armanit Garg",
        "email": "armanit.garg@gmail.com",
        "time": "Fri May 08 04:22:55 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 17:52:55 2026 -0500"
      },
      "message": "feat: podTemplateSelectionKey context for picking pod templates from task specs (#19419)\n\n* feat: podTemplateSelectionKey context key for picking pod templates from task specs\n\n* runtime prop to allow overrides\n\n* add some logging"
    },
    {
      "commit": "56a10f50e5eeee5dc577692a64706bdda7c7e26a",
      "tree": "fadf20f578c4ca015088a61e4cc35af0b8c33b63",
      "parents": [
        "4378f10333b598ed3d3777f96ccea009fc327bab"
      ],
      "author": {
        "name": "Maytas Monsereenusorn",
        "email": "maytasm@apache.org",
        "time": "Thu May 07 10:58:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 10:58:56 2026 -0700"
      },
      "message": "fix: Optimizes SpillingGrouper for high cardinality dimension(s) GroupBy with large memory footprint aggregators (#19357)"
    },
    {
      "commit": "4378f10333b598ed3d3777f96ccea009fc327bab",
      "tree": "348de0b149678d3879653d0ed0fb5036df751d3d",
      "parents": [
        "a9ca2da52a04067f99feee6db5caff8cb07fbe3d"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Thu May 07 01:13:41 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 01:13:41 2026 -0700"
      },
      "message": "perf: Optimize aggregators for groupBy queries. (#19423)\n\nPreviously aggregators were only optimized for timeseries and topN.\nThis patch adds optimization for groupBy too. It also adds a context\nparameter \"optimizeAggregators\" that can be used to switch off\noptimization, in case this is useful for debugging purposes."
    },
    {
      "commit": "a9ca2da52a04067f99feee6db5caff8cb07fbe3d",
      "tree": "c49144609ea0989c81b889a5ce1b81768edede66",
      "parents": [
        "62b98500a427d5161643ef84dc194ba2433803c4"
      ],
      "author": {
        "name": "Clint Wylie",
        "email": "cwylie@apache.org",
        "time": "Wed May 06 15:19:04 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 15:19:04 2026 -0700"
      },
      "message": "feat: use java virtual threads for virtual storage load on demand thread pool by default (#19396)\n\nchanges:\n* switch default `SegmentLocalCacheManager.virtualStorageLoadOnDemandExec` to virtual threads with a `Semaphore` for backpressure\n* added `SegmentLoaderConfig.virtualStorageUseVirtualThreads` (`druid.segmentCache.virtualStorageUseVirtualThreads`) config that defaults to true, but allows opt-out via setting to false\n* raise default `SegmentLoaderConfig.virtualStorageLoadThreads` default to Math.max(32, 4 * cores), sized as ~4x lookahead per processing thread\n* convert `SegmentCacheEntry` from `synchronized` to `ReentrantLock` so virtual threads park instead of pinning the carrier during mount\n* ensure virtualStorageLoadThreads is greater than 0"
    },
    {
      "commit": "62b98500a427d5161643ef84dc194ba2433803c4",
      "tree": "d274909bf0a12129f970a501432babe48fecaec8",
      "parents": [
        "0920a93559116bfd401618d56854b1c0d5a31f14"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Wed May 06 09:49:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 09:49:32 2026 -0700"
      },
      "message": "fix: Erroneous pruning for non-STRING typed filters. (#19415)\n\nFixes #19408 by skipping pruning for RangeFilter with matchValueType\nother than STRING."
    },
    {
      "commit": "0920a93559116bfd401618d56854b1c0d5a31f14",
      "tree": "4df4f4e5baf8d613d75c4607641d93fa7de6a1d2",
      "parents": [
        "be09fa1040317a2924a330b8337132c4ed655ac5"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Wed May 06 09:49:07 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 09:49:07 2026 -0700"
      },
      "message": "fix: Precedence of taskCount, taskCountStart, taskCountMin. (#19417)\n\nPR #18745 included a discussion of desired behavior of taskCount,\ntaskCountStart, and taskCountMin, but this has not been fully\nimplemented. This patch updates logic to align with the intent."
    },
    {
      "commit": "be09fa1040317a2924a330b8337132c4ed655ac5",
      "tree": "bab66eb1a6850a10a00bfb62f60b795fb223a935",
      "parents": [
        "09e5e93e3e8986d42020250178b7f50bc9063907"
      ],
      "author": {
        "name": "Virushade",
        "email": "phuaguanwei99@gmail.com",
        "time": "Wed May 06 21:20:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 06 21:20:14 2026 +0800"
      },
      "message": "Try to fix docker tests (#19416)"
    },
    {
      "commit": "09e5e93e3e8986d42020250178b7f50bc9063907",
      "tree": "410eb1f08bd8c25a1c71e8a8c8aba9e4899bb745",
      "parents": [
        "d96ecfc12154d3d5a020a540c6f6fec4cfbf1f67"
      ],
      "author": {
        "name": "Gian Merlino",
        "email": "gianmerlino@gmail.com",
        "time": "Tue May 05 20:21:17 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 20:21:17 2026 -0700"
      },
      "message": "perf: Double default loadahead for MSQ. (#19414)\n\nSetting loadahead to double the number of processing threads provides a\nbetter likelihood of keeping the processing threads busy. It also\nmatches the default number of VSF on-demand loading threads."
    },
    {
      "commit": "d96ecfc12154d3d5a020a540c6f6fec4cfbf1f67",
      "tree": "7ce26bb6e23ad144a2d5cc32e7d134bb61f05838",
      "parents": [
        "d836a8f6bdec2a51997acddd16ebab7a2c61588d"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Mon May 04 23:25:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 23:25:10 2026 -0400"
      },
      "message": "perf: update List to Set of muted types for filtered logging request logger (#19404)\n\nUpdate druid.request.logging.mutedQueryTypes to use a Set instead of a List.\nSet lookups are faster than list-based lookups, which can matter at high QPS when filtered logging with multiple muted types is enabled on servers."
    },
    {
      "commit": "d836a8f6bdec2a51997acddd16ebab7a2c61588d",
      "tree": "e9931524f983fcc1b0872db3046563fc7da1cc78",
      "parents": [
        "ad106a84bcbc410183a5bd3878a4ab4a50a88838"
      ],
      "author": {
        "name": "Abhishek Radhakrishnan",
        "email": "abhishek.rb19@gmail.com",
        "time": "Mon May 04 23:24:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 23:24:24 2026 -0400"
      },
      "message": "fix:  Fix unhealthy supervisor when a priority-assigned task dies before discovery (#19405)\n\nWith #19040, when ioConfig.serverPriorityToReplicas is set, a supervisor can get stuck throwing\nDruidException from computeUnassignedServerPriorities, preventing any new\ntask replicas with destined replicas from being created until the old tasks rollover. The\nexception is as follows:\n\nFound unassignedServerPriorities[[]] of size[0] \u003c total replicas[1] for taskGroupId[0].\nTask server priorities[[1, 0]] have already been assigned to tasks[[foo]].\nThe supervisor can remain in this unhealthy state unable to create additional task replicas until tasks eventually rollover. This can happen when a task spuriously fails after it\u0027s created but before it\u0027s discovered in the runInternal() loop.\n\nThis patch removes the additional writer, leaving discoverTasks and removeTask\nas the sole mutators. group.taskIdToServerPriority should now stay in sync with group.tasks.\nThe added unit tests fail on master without the fix."
    },
    {
      "commit": "ad106a84bcbc410183a5bd3878a4ab4a50a88838",
      "tree": "6e20ab7e37c584df9a59f3282e50cd734895a67e",
      "parents": [
        "62afd819c590cc85afad7b3e565e5c827853e11b"
      ],
      "author": {
        "name": "Lucas Capistrant",
        "email": "capistrant@users.noreply.github.com",
        "time": "Sat May 02 14:46:35 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 14:46:35 2026 -0500"
      },
      "message": "feat: Server view improvements for historical detail (decommissioning, turbo segment loading, cloning) (#19253)\n\n* fix bug where clone status not reset when going from N to 0 clone mappings\n\n* Make the services view show if historical is in any mode like turbo or decom or clone\n\n* remove outer catch all on advice of review\n\n* prettier fix\n\n* stop mocking where not necessary\n\nthis was causing NPEs\n\n* Remove more unneeded mocking of clone status manager\n\n* Remove all caps, add aggregated stats, some tidying up of types and error reporting\n\n* better casing and nicer error msg\n\n* fix more unneeded mock locations that were very quietly causing the CI fails.\n\n* uncovered more issues\n\n* checkstyle fix"
    }
  ],
  "next": "62afd819c590cc85afad7b3e565e5c827853e11b"
}
