Skip to content

reverse merge#155

Open
deepthi912 wants to merge 747 commits into
deepthi912:upserts-pruningfrom
apache:master
Open

reverse merge#155
deepthi912 wants to merge 747 commits into
deepthi912:upserts-pruningfrom
apache:master

Conversation

@deepthi912

Copy link
Copy Markdown
Owner

No description provided.

yashmayya and others added 30 commits May 29, 2026 01:25
…SHOW CREATE / DROP (#18544)

Adds Pinot-native SQL DDL for managing materialized views end to end,
served through the same POST /sql/ddl endpoint as plain-table DDL.

Supported statements:

    CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]name [(<column list>)]
    [REFRESH EVERY 'period']
    PROPERTIES ('timeColumnName' = 't', 'bucketTimePeriod' = '1d', ...)
    AS <Pinot SELECT>

    SHOW MATERIALIZED VIEWS [FROM db]
    SHOW CREATE MATERIALIZED VIEW [db.]name
    DROP MATERIALIZED VIEW [IF EXISTS] [db.]name

CREATE MATERIALIZED VIEW supports two forms:

  - Explicit column list: every column is declared in the DDL.
  - Inferred column list: the column list is omitted and the storage
    schema is derived from the AS <SELECT>. Data type comes from
    Calcite's validated row type; the time column is pinned to canonical
    TIMESTAMP with `1:MILLISECONDS:TIMESTAMP` format; recognised
    aggregations from MaterializedViewAggregationCatalog use the
    catalog's storage type (load-bearing BYTES override for raw-sketch
    aggregations).

Both forms produce identical materialized-view storage from the data
plane's perspective. SHOW CREATE MATERIALIZED VIEW always renders the
canonical form with an explicit column list, so the round-trip through
DDL is stable in either case.

Validation:

  - The MV analyzer (pinot-materialized-view) rejects malformed task
    knobs (bucketTimePeriod, bufferTimePeriod, maxNumRecordsPerSegment,
    maxTasksPerBatch, stalenessThresholdMs) at CREATE time.
  - The MV consistency manager's reverse-index rebuild skips orphan
    definition znodes whose TableConfig is missing or non-MV, with a
    WARN log — preventing ghost MVs after a partial DROP.
  - DROP TABLE / DROP MATERIALIZED VIEW restore task schedules when
    deleteTable rejects the drop (e.g. blocked by a dependent MV).
  - CREATE MATERIALIZED VIEW IF NOT EXISTS race-catch paths verify
    isMaterializedView() before returning 200; a concurrent plain
    OFFLINE create surfaces as 409, not a silent success.
  - The HTTP-header database is threaded into the compile context so
    the inferer resolves source-table references under the operator's
    intended database.
  - POST /sql/ddl no longer wraps RuntimeException as 400 — programmer
    errors propagate to JAX-RS as 500 so monitoring fires.

Signed-off-by: Hongkun Xu <xuhongkun666@163.com>
Co-authored-by: Xiang Fu <xiangfu@startree.ai>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* [Query Resource Isolation] Use Reflection for Custom Class registration (#70)

* Interface

* Interface framework

* Interface framework

* QRI minor improvements (#73)

* Fix canAdmitQuery (#84)

* [Query Resource Isolation] Misc fixes and additions (#83)

* startup budget

* startup

* Integ test

* review comments

* Fix canAdmitQuery

* review comments on debug api

* QRI Metrics for Broker/Server (#91)

* workload metric

* review comments

* Add Getter in WorkloadBudgetManager (#93)

* getter

* getter

* [Query Resource Isolation]  Refresh workload budget for tables/tenant (#95)

* Qri refresh API

* refresh on broker and server update

* Fix null workload (#100)

* Support External HTTPS Port in InstanceConfig for SSL-Terminated Controllers (#101)

* https port

* empty

* [QRI] Optimize Query Workload Propagation with Batching and Deduplication (#111)

* Qri refresh API

* refresh on broker and server update

* review comments

* Optimize QRI refresh messaging

* http direct instance call

* executor

* async request

* Executor

* remove executor

* assign instance

* async client improvements

* workload propagation client

* review comments 2

* Async (#115)

* Move workload config fetch to background thread to avoid blocking main-thread during startup       (#124)

* fix blocking

* fix blocking

* metrics

* Admin Port for broker (#138)

* admin port

* admin port

* Style fix
The /tables/{name}/pauseStatus endpoint returned only a boolean pauseFlag
with no information about which topics were individually paused via the
topic-level pause API. This change surfaces the list of inactive topic
indices already stored in PauseState so callers can see per-topic pause
state without inspecting ZooKeeper directly.

Changes:
- PauseStatusDetails: add indexOfInactiveTopics field with proper
  @JsonProperty binding in @JsonCreator for correct round-trip
  serialization; return List.copyOf to avoid aliasing PauseState internals;
  annotate getter @nullable since the field is omitted when empty
- PinotLLCRealtimeSegmentManager.getPauseStatusDetails: pass
  pauseState.getIndexOfInactiveTopics() through to PauseStatusDetails,
  removing the TODO comment
- Tests: add round-trip JSON test and getPauseStatusDetails unit test
  covering the inactive-topics code path
Co-authored-by: wolfkill <27876473+wolfkill@users.noreply.github.com>
Co-authored-by: wolfkill <27876473+wolfkill@users.noreply.github.com>
Co-authored-by: wolfkill <27876473+wolfkill@users.noreply.github.com>
Co-authored-by: wolfkill <27876473+wolfkill@users.noreply.github.com>
* Fix MinionSubTaskHighWaitTime alert to self-resolve using gauge

Replace ControllerTimer.SUBTASK_WAITING_TIME (histogram) with a new
MAX_SUBTASK_WAIT_TIME_MS gauge in TaskMetricsEmitter.

The timer's _Max stat retains its peak value across emission cycles and
does not decay when the queue drains, causing the alert to stay firing
after all subtasks have finished. The new gauge is written every cycle
with the current max wait time across waiting subtasks for each
(table, taskType) pair, defaulting to 0 when no subtasks are waiting,
so the alert self-resolves on the next emit cycle.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Remove unused SUBTASK_WAITING_TIME timer — replaced by MAX_SUBTASK_WAIT_TIME_MS gauge

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Replace SUBTASK_RUNNING_TIME timer with MAX_SUBTASK_RUNNING_TIME_MS gauge

Timer histograms retain peak _Max values across emit cycles and never decay,
preventing alerts from self-resolving. Replace with a per-table gauge that
writes the current max running time each cycle (0 when no running subtasks),
matching the same approach used for MAX_SUBTASK_WAIT_TIME_MS.

Also removes the now-unused SUBTASK_RUNNING_TIME ControllerTimer entry and
its imports from TaskMetricsEmitter.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ndler (#18639)

Adds a MaterializedViewDdlHandler extension point so CREATE MATERIALIZED VIEW
can target an alternative engine / minion task type. The default handler targets
the single-stage engine (re-compiles the AS-clause as a single-stage Pinot query,
rejecting JOIN / multi-source, routes under MaterializedViewTask); a downstream
distribution can register an MSE handler that accepts joins and stamps its own
task type. The handler — installed via DdlCompiler.setMaterializedViewDdlHandler —
owns engine-specific verification (validateDefinedQuery) and whether projection
schema inference is allowed (supportsSchemaInference). DdlCompiler fails fast with
a clear message if a handler returns a null/unstamped task type.

MaterializedViewPropertyRouter.apply gains a taskType-parameterized overload, and
the "MV's own task type" matching is generalized from the hard-coded
MaterializedViewTask to that task type so task.<taskType>.* knobs route correctly
(and are not dropped) for custom task types.

Documents the extension-point contract: a handler stamping a non-built-in task type
owns that type's complete runtime including definition-metadata persistence and
consistency tracking. The built-in controller-side MV machinery
(MaterializedViewDefinitionMetadata persistence + MaterializedViewConsistencyManager)
keys on MaterializedViewTask and now intentionally and explicitly skips MVs stamped
with a different task type (logged at INFO, not WARN), leaving freshness/consistency
to the owning task type.

Behavior is unchanged when no alternative handler is registered. All pinot-sql-ddl
tests pass.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* adding new configs in controllercong

* adding constructors for cron expression acceptance

* adding constructors for cron expression acceptance

* adding quartz scheduler for cron job scheduling

* fixing issues

* fixing tests

* fixing tests

* unit tests for cron changes

* removing unnecessary comments

* fixing issues

* fixing issues

* fixing issues

* fixing minor issues

* fixing minor issues

* fixing minor issues

* improving code quality

* resolving comments

* fixing checkstyle violations

* Delete pinot-controller/src/main/java/org/apache/pinot/controller/cursors/ResponseStoreCleaner.java

* addressing comments

* resolving comments

* addressing comments

* addressing comments

* resolving comments

* resolving comments

* fixing failing CI
…18502)

Step toward removing the long-deprecated TimeFieldSpec (#2756).

1. Formal deprecation
   - Add the @deprecated annotation to TimeFieldSpec (it had only Javadoc
     @deprecated before) and to Schema#getTimeFieldSpec so the compiler
     and IDE actually warn on call sites.
   - Narrow @SuppressWarnings("deprecation") on internal SPI bridges that
     intentionally keep handling TimeFieldSpec for backward-compat JSON
     deserialization (FieldSpec @JsonSubTypes, Schema#addField, the
     _timeFieldSpec field, getSpecForTimeColumn, convertToDateTimeFieldSpec)
     so the SPI module stays warning-clean.

2. Block new TimeFieldSpec schema creation
   - Reject schemas with fieldType=TIME in the REST-driven overload
     SchemaUtils.validate(schema, tableConfigs, isIgnoreCase). POST,
     PUT, and /schemas/validate all uniformly reject and point users at
     DateTimeFieldSpec and #2756.
   - The check is deliberately NOT placed in the single-arg
     SchemaUtils.validate(schema) used by server-side schema loading
     (RealtimeTableDataManager, TableConfigsRestletResource,
     SchemaValidator) so existing legacy schemas in ZK keep loading.
   - Migrate the shared integration-test schema fixtures
     (On_Time_*, test_null_handling, upsert_upload_segment_test,
     dedupIngestionTestSchema, kinesis/airlineStats_data_reduced) from
     TimeFieldSpec to DateTimeFieldSpec.

Rolling-upgrade note: during a mixed-version controller deployment,
newer controllers reject schemas containing TimeFieldSpec via the REST
API while older controllers still accept them. Existing schemas in ZK
and segment generation continue to work on both versions.

A follow-up PR will add a controller rewrite step to migrate the
remaining legacy schemas in ZK automatically.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
… assignment (#18645)

Subclasses can already customize multi-stage worker selection by overriding getCandidateServers / getCandidateServersForReplicatedLeaf, but the per-worker segment assignment is finalized internally with no extension point. This adds two protected no-op hooks invoked once the assignment is built: filterLeafStageSegments (from updateContextForLeafStage, covering the non-partitioned, partitioned and logical-table paths) and filterReplicatedLeafStageSegments (from setSegmentsForReplicatedLeafFragment). A subclass can rewrite DispatchablePlanMetadata's worker/replicated segment maps via the existing setters. Both default to no-ops, so behavior is unchanged.
Bumps [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/typetools/checker-framework/releases)
- [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md)
- [Commits](typetools/checker-framework@checker-framework-4.1.0...checker-framework-4.2.0)

---
updated-dependencies:
- dependency-name: org.checkerframework:checker-qual
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps software.amazon.awssdk:bom from 2.44.14 to 2.46.0.

---
updated-dependencies:
- dependency-name: software.amazon.awssdk:bom
  dependency-version: 2.46.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [org.jline:jline](https://github.com/jline/jline3) from 4.1.2 to 4.1.3.
- [Release notes](https://github.com/jline/jline3/releases)
- [Commits](jline/jline3@4.1.2...4.1.3)

---
updated-dependencies:
- dependency-name: org.jline:jline
  dependency-version: 4.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [com.nimbusds:nimbus-jose-jwt](https://bitbucket.org/connect2id/nimbus-jose-jwt) from 10.9 to 10.9.1.
- [Changelog](https://bitbucket.org/connect2id/nimbus-jose-jwt/src/master/CHANGELOG.txt)
- [Commits](https://bitbucket.org/connect2id/nimbus-jose-jwt/branches/compare/10.9.1..10.9)

---
updated-dependencies:
- dependency-name: com.nimbusds:nimbus-jose-jwt
  dependency-version: 10.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…mplementations (#18640)

* Move partial-upsert resolveComparisonTies from base wrapper into subclasses

The base addOrReplaceSegment wrapper in BasePartitionUpsertMetadataManager
existed only to call resolveComparisonTies for partial-upsert before delegating
to the subclass-specific doAddOrReplaceSegment. This made the abstract
doAddOrReplaceSegment signature redundant with its only caller.

Inline the wrapper: callers now invoke doAddOrReplaceSegment directly, and the
resolveComparisonTies call moves into ConcurrentMapPartitionUpsertMetadataManager
and ConcurrentMapPartitionUpsertMetadataManagerForConsistentDeletes (the only
two non-abstract subclasses). Removes one virtual call per segment add/replace
and eliminates a layer of indirection.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Fix Checkstyle line-length violation in BasePartitionUpsertMetadataManager

Line 661 was 121 chars; wrap argument list so each line stays ≤120.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
xiangfu0 and others added 30 commits July 5, 2026 11:55
Rebased onto master; resolves review feedback on #18869: markdown javadoc + UuidKey extracted to its own class + dropped per-value null checks and the defensive byte[] copy in UuidUtils; UUID placed right after its stored type BYTES in the enum/switches and dropped the fragile ordinal-append hack; removed the FieldSpec default-null defensive copy; restored fromUUIDBytes null-on-exception (back-compat); PinotDataType STRING->UUID now trims; added UUID version/timestamp/generator tests.

Part 1/8 of splitting #18140 (logical UUID type).
Bumps software.amazon.awssdk:bom from 2.46.20 to 2.46.21.

---
updated-dependencies:
- dependency-name: software.amazon.awssdk:bom
  dependency-version: 2.46.21
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps `log4j.version` from 2.26.0 to 2.26.1.

Updates `org.apache.logging.log4j:log4j-bom` from 2.26.0 to 2.26.1
- [Release notes](https://github.com/apache/logging-log4j2/releases)
- [Changelog](https://github.com/apache/logging-log4j2/blob/2.x/RELEASE-NOTES.adoc)
- [Commits](apache/logging-log4j2@rel/2.26.0...rel/2.26.1)

Updates `org.apache.logging.log4j:log4j-1.2-api` from 2.26.0 to 2.26.1

---
updated-dependencies:
- dependency-name: org.apache.logging.log4j:log4j-bom
  dependency-version: 2.26.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: org.apache.logging.log4j:log4j-1.2-api
  dependency-version: 2.26.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…18842)

mergeDataTablesOnly reused getIndexedTable, which unconditionally called
indexedTable.finish(true, true). For a GROUP BY query with an OBJECT-typed
intermediate aggregate (DISTINCTCOUNT, DISTINCTCOUNTHLL, etc.), that
storeFinalResult=true call:
- mutated DataSchema._columnDataTypes from OBJECT to the final-result type
  in place (IndexedTable.java:170-174), and
- replaced each row's value with extractFinalResult(value) (Set → Integer
  for DISTINCTCOUNT) at IndexedTable.java:195.

The subsequent buildIntermediateDataTable read DataSchema's cached
_storedColumnDataTypes — populated earlier from the pre-finalize OBJECT
schema and never invalidated by finish — so the OBJECT branch fired and
handed the now-Integer value into
BaseDistinctAggregateAggregationFunction.serializeIntermediateResult(Set),
which threw ClassCastException.

Fix: move finish() out of getIndexedTable and let each caller pick the
right mode. reduceResult keeps finish(true, true) (downstream consumers
expect final scalars). mergeDataTablesOnly calls finish(true, false) so
aggregate values stay as intermediates and round-trip through
buildIntermediateDataTable correctly.

Adds a testGroupByDistinctCountObjectRoundTrip regression: server emits
intermediate OBJECT-encoded Sets, merge produces a re-injectable
intermediate DataTable, and reducing that intermediate matches a direct
reduce of the same servers.
#18927)

Establish a consistent internal/external representation for the UUID type:

- PinotDataType: java.util.UUID is the external form and byte[] the internal
  form. UUID.convert / UUID_ARRAY.convert return UUID / UUID[], while toInternal
  returns byte[] / byte[][]. UUID.convert delegates to sourceType.toUUID, and
  every single-value type now defines toUUID so an unsupported conversion (e.g.
  INT -> UUID) throws a descriptive "Cannot convert value from INT to UUID"
  instead of a confusing "There is no single-value type" error. The JSON->UUID
  parsing moves into JSON.toUUID. Removes the now-unused toUuidBytesArray.

- FieldSpec.DataType: UUID values are represented uniformly as byte[], matching
  the BYTES stored type. equals / hashCode / compare / toString drop the
  toBytesValue helper and operate on byte[] directly. Adds enum-level Javadoc
  documenting the in-memory value representation per type.

- UuidUtils.toBytes(String) accepts the dashless 32-char hex form in addition to
  the canonical string, so byte[] default null values (stringified as raw hex)
  round-trip back through FieldSpec.getDefaultNullValue.
* Fix realtime segment cleanup after ERROR transition

* Scope stale stop-consumed mitigation
* Add peer download fallback to PredownloadScheduler

When a segment download from deep storage fails in the predownload
container, fall back to downloading from peer servers if peer download
is enabled. This improves predownload reliability when deep storage is
temporarily unavailable or experiencing issues.

Changes:
- Accept peerDownloadEnabled flag in PredownloadScheduler constructor
- Extract deep store download logic into downloadFromDeepStore()
- Add downloadFromPeers() method that discovers ONLINE peer servers
  via ExternalView and downloads the segment from a shuffled peer list
- Add getPeerServerURIs() to PredownloadZKClient to discover peers
  without requiring HelixManager
- Add tests for peer download fallback and ZK peer discovery

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Read peerDownloadEnabled from properties instead of constructor parameter

The upstream StartServer now sets pinot.server.peer.download.enabled
in properties, so the constructor no longer needs the boolean parameter.
This simplifies the API and keeps configuration in one place.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Address review comments: sanitize peer download scheme and fix Javadoc

1. Sanitize _peerDownloadScheme similar to BaseTableDataManager:
   lowercase the value and validate it's http or https.
2. Remove "excluding the current instance" from getPeerServerURIs
   Javadoc — predownload runs before server starts, so the current
   instance is never in ExternalView.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add peer download and deep store metrics for predownload

- PREDOWNLOAD_DEEPSTORE_DOWNLOAD_COUNT: deep store success counter
- PREDOWNLOAD_PEER_SEGMENT_DOWNLOAD_COUNT: peer download success counter
- PREDOWNLOAD_PEER_SEGMENT_DOWNLOAD_FAILURE_COUNT: peer download failure
  counter with segment name as key for per-segment tracking
- PEER_DOWNLOAD_SPEED: gauge for peer download speed (MB/s)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add tests for peer download and deep store metrics

- testDeepStoreSuccessEmitsDeepStoreMetric: verifies deepStoreSegmentDownloaded()
  is called on deep store success, peer metrics not called
- testPeerDownloadSuccessEmitsPeerMetrics: verifies peerSegmentDownloaded(true)
  and segmentDownloaded(true) both called on peer fallback success
- testPeerDownloadFailureEmitsSegmentLevelMetric: verifies
  peerSegmentDownloaded(false, segmentName) called with segment name on failure

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add streaming-untar support for peer download in predownload

When streaming download-untar is enabled and the segment is not encrypted,
peer download now uses the streaming path (fetchAndStreamUntarToLocal)
instead of download-then-untar, matching the existing deep store behavior.

Framework changes:
- Add fetchUntarSegmentToLocalStreamed(segmentName, uriSupplier, dest, rateLimit)
  to SegmentFetcher interface, BaseSegmentFetcher (with retry), and HttpSegmentFetcher
- Add corresponding SegmentFetcherFactory.fetchAndStreamUntarToLocal overload

Tests added for HttpSegmentFetcher, SegmentFetcherFactory, and
PredownloadScheduler streaming peer fallback path.

* Address review comments: metric naming, config constant, guard refactor

- Rename PEER_DOWNLOAD_SPEED to PEER_DOWNLOAD_SPEED_MBPS with unit "mbps"
- Remove segmentName from failure metric to avoid high cardinality
- Move hardcoded "pinot.server.peer.download.enabled" to
  CommonConstants.Server.CONFIG_OF_PEER_DOWNLOAD_ENABLED
- Move peer download enabled/scheme guard into downloadFromPeers
- On peer download failure, throw the original deep store exception

---------

Co-authored-by: psinghnegi <psinghnegi@uber.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Initialize ServerMetrics in PredownloadScheduler for predownload container

The PredownloadScheduler runs in a separate predownload container that
starts before the main Pinot server. Previously, it only initialized
PredownloadMetrics but did not set up the ServerMetrics registry. This
caused PredownloadMetrics (which internally depends on ServerMetrics)
to silently fall back to the NOOP metrics instance, resulting in no
server-level metrics being emitted from the predownload container.

This change initializes ServerMetrics via PinotMetricUtils in the
initializeMetricsReporter() method. The initialization is wrapped in a
try-catch so that if the underlying metrics factory cannot be created
(e.g., because a vendor-specific metrics client is not yet available
in the predownload lifecycle), the predownload process continues with
the default NOOP ServerMetrics rather than crashing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add tests for ServerMetrics initialization in PredownloadScheduler

Three test cases covering the initializeMetricsReporter() change:

1. testInitializeMetricsReporterRegistersServerMetrics - verifies that
   ServerMetrics is properly initialized and registered when the
   metrics factory is available

2. testInitializeMetricsReporterFallsBackOnFailure - verifies that
   when PinotMetricUtils throws (e.g., vendor metrics client not
   ready), the scheduler continues with the NOOP ServerMetrics
   instance instead of crashing

3. testInitializeMetricsReporterAlwaysCreatesPredownloadMetrics -
   verifies that PredownloadMetrics is always created and registered
   regardless of whether ServerMetrics initialization succeeds or fails

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Address review comments: narrow catch to Exception, log register result

- Changed catch(Throwable) to catch(Exception) to avoid swallowing
  JVM-level Errors like OutOfMemoryError
- Check ServerMetrics.register() return value and log success or
  error if an instance was already registered

* Extract shared ServerMetricsInitUtils for ServerMetrics construction/registration

Deduplicates ServerMetrics construction + registration logic between
BaseServerStarter (real server) and PredownloadScheduler (predownload
container). Registration failure now throws IllegalStateException from
the shared method; PredownloadScheduler's existing try/catch keeps
predownload's graceful-degradation behavior unchanged.

* Trigger CI re-run

* Make ServerMetrics registration idempotent to fix integration tests

ServerMetricsInitUtils.initServerMetrics() previously threw
IllegalStateException when ServerMetrics was already registered.
This broke integration tests where multiple servers start in the
same JVM via ClusterTest.startOneServer, causing 38 test failures.

Now returns the existing instance instead of throwing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: psinghnegi <psinghnegi@uber.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bumps software.amazon.awssdk:bom from 2.46.21 to 2.47.0.

---
updated-dependencies:
- dependency-name: software.amazon.awssdk:bom
  dependency-version: 2.47.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#18896)

The updateSchema endpoint in PinotSchemaRestletResource was catching
SchemaBackwardIncompatibleException but only returning a generic message
("Only allow adding new columns") without including the actual reason
from the exception. This made it difficult for users to understand why
their schema update was rejected.

Now the error response includes e.getMessage() which contains detailed
incompatibility information (missing columns, incompatible field types,
primary key changes, and fix suggestions).
The 4-argument splitPart overload previously allocated a full String[]
via StringUtils.splitByWholeSeparator on every call, even when only a
single element was needed. This is wasteful in hot query paths where
splitPart is invoked per-row.

Replace the array-based implementation with index-based forward scanning
that extracts only the requested field without materializing all split
parts. The new implementation:

- Skips leading separators
- Collapses consecutive separators (matching splitByWholeSeparator semantics)
- Handles trailing separators (producing one empty trailing token)
- For positive indices: single forward scan, O(index) work
- For negative indices: two passes (count then extract) but still no
  String[] allocation

Falls back to the array-based path only for null/empty delimiters
(whitespace splitting) where the rules are complex.

All existing unit tests (172 cases including randomized fuzz) pass
unchanged, confirming behavioral equivalence.
Bumps software.amazon.awssdk:bom from 2.47.0 to 2.47.1.

---
updated-dependencies:
- dependency-name: software.amazon.awssdk:bom
  dependency-version: 2.47.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/google-cloud-java) from 26.84.0 to 26.85.0.
- [Release notes](https://github.com/googleapis/google-cloud-java/releases)
- [Changelog](https://github.com/googleapis/google-cloud-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-cloud-java/commits/libraries-bom/v26.85.0)

---
updated-dependencies:
- dependency-name: com.google.cloud:libraries-bom
  dependency-version: 26.85.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) from 2.22.0 to 2.22.1.
- [Commits](FasterXML/jackson-bom@jackson-bom-2.22.0...jackson-bom-2.22.1)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson:jackson-bom
  dependency-version: 2.22.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…(and fix routing-filter construction bugs it surfaces) (#18941)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.