Commit graph

16318 commits

Author SHA1 Message Date
Mayur Singal
60a2e6546e
Migrate Databricks from sqlalchemy-databricks to databricks-sqlalchemy (#26896)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* Update Databricks Dependency to databricks-sqlalchemy

* Update generated TypeScript types

* address comments and pyformat

* pyformat

* fix log filtering

* address comments

* fix static unit tests

* fix rule for static type

* pyformat

* update baseline

* revert basepyright changes

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Aniket Katkar <aniketkatkar97@gmail.com>
2026-05-04 18:53:24 +05:30
Sriharsha Chintalapani
8cec97b52c
Containers: FQN-driven hierarchy listings + cascade-delete orphan fix (#27878)
* Containers: FQN-driven hierarchy listings + cascade-delete orphan fix

Stops `?root=true&service=...` and `/containers/.../children` from leaking
deeply-nested orphans, fixes the source bug that produced them, and corrects
the 1.13.0 fqnHash pattern index opclass.

Listing path
- ListFilter.getFqnPrefixCondition now binds both <param>Hash and
  <param>HashChild ('<hash>.%' and '<hash>.%.%') so depth-aware listings
  can require "exactly one segment below the prefix" via a single LIKE +
  NOT LIKE pair on fqnHash. Same shape works at any tree depth.
- ContainerDAO.listRoot{Before,After,Count} swap the NOT EXISTS anti-join
  on entity_relationship for fqnHash NOT LIKE :serviceHashChild. The FQN
  is the canonical hierarchy in OpenMetadata; the relationship table is
  no longer consulted for hierarchical listings.
- ContainerRepository.listChildren rewritten: no parent-by-name lookup, no
  findToWithOffset/countFindTo on entity_relationship, no second-hop
  hydration. Single SQL roundtrip + slim projection via
  listDirectChildSummariesByParentHash. Orphans whose parent CONTAINS row
  is missing are now correctly placed under their FQN-implied parent.
- Both endpoints honour ?include=non-deleted|all|deleted; ChildrenPageCache
  key includes the include tag so toggling the UI Deleted switch doesn't
  return a stale page from the other side.
- ContainerResource.listChildren accepts ?include= for parity with the
  root listing.

Cascade-delete orphan source (EntityRepository.processDeletionBatch)
- Removed the redundant pre-batch-delete of relationships and the
  swallow-all try/catch in the per-child loop. cleanup() per entity now
  owns row removal AND relationship deletion atomically; exceptions
  propagate so the loop stops on first failure with per-child atomicity.
  Stops the orphan-without-relationships pattern that the listing change
  defends against.

Migration correction (1.13.0 postgres fqnHash pattern indexes)
- Recreate 23 idx_*_fqnhash_pattern indexes with text_pattern_ops instead
  of varchar_pattern_ops. The planner casts the column to text when the
  LIKE RHS is text-typed (every JDBC setString call), so
  varchar_pattern_ops doesn't match the resulting (fqnhash)::text ~~
  expression. Confirmed via EXPLAIN ANALYZE on a 580k-row table: the same
  query drops from ~470ms cold (Parallel Seq Scan) to <1ms (Index Scan).

Tests
- ListFilterTest: 3 unit tests covering both binds, dotted/quoted service
  name special-char handling, and include= flowing through alongside the
  service prefix.
- ContainerResourceIT: 8 integration tests covering depth correctness at
  every level (5-level chain), orphan exclusion at root, orphan
  discoverability under FQN-implied parent, sibling subtree isolation,
  the include toggle on both endpoints, and large-batch hard-delete
  leaving no orphan rows or relationships.

Closes #27870 (subset of its listing-side intent shipped here as a single
FQN-depth predicate; PR's cascade fix and both new tests picked up
verbatim).

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

* Address review comments on #27878

- ContainerDAO.listRoot* override now defaults :serviceHashChild to '%.%.%'
  via rootListingParams() when ?service= is absent. Previous code
  unconditionally referenced the bind, so ?root=true without a service
  filter crashed at runtime with a missing-named-parameter error.
- Migration 1.13.0/postgres/schemaChanges.sql now DROP INDEX CONCURRENTLY
  IF EXISTS before each CREATE so already-upgraded environments (which
  have the original varchar_pattern_ops indexes) get the index recreated
  with text_pattern_ops on next deploy. Fresh installs see the DROP as
  a no-op. Comment block updated to record the recreate intent.
- ChildrenPageCache include tag for ALL changed from "all" to "a" so the
  CacheKeys.childrenPage Javadoc's "1-2 char" promise holds (now nd/a/d
  are all <=2 chars).
- ContainerRepository.includeToBindString Javadoc corrected: it described
  the SQL as a CASE expression, but listDirectChildSummariesByParentHash
  actually uses a three-branch OR chain.
- ListFilterTest: added test_noServiceFilter_doesNotBindServicePatterns
  as a regression guard for the missing-bind bug.

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

* Fix java style

* Address second review pass on #27878

- EntityRepository.processDeletionBatch wraps per-child cleanup exceptions
  with entityType + entityId context before re-throwing. The exception
  still propagates (so the loop still stops, failure-semantics contract
  unchanged); operators now get a stack trace that names the row that
  blocked a large recursive delete instead of an opaque error.
- CacheKeys.childrenPage Javadoc now lists the actual include tags
  ("nd" / "a" / "d") and points at ChildrenPageCache.includeTag as the
  authoritative source. Earlier comment still mentioned "all" after the
  switch to single-letter tags.

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

* Test: ?root=true without service filter end-to-end (#27878 review)

Adds test_rootListing_withoutServiceFilter_returnsRootsAcrossAllServices
to ContainerResourceIT. Creates two distinct storage services, each with
a root container and a child container, then asserts that GET
/containers?root=true (no service filter):

- Succeeds (rootListingParams() defaults :serviceHashChild to '%.%.%' so
  the SQL has its bind even when ListFilter.getServiceCondition didn't
  add it).
- Includes root containers from both services (cross-service listing
  works without a service prefix narrowing the candidate set).
- Excludes child containers from either service (depth check still
  applied via the default bind).

Regression guard for the bug Copilot's review pass flagged at
CollectionDAO.java:784: 'GET /containers?root=true (no service) crashes
at runtime due to a missing named parameter.'

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

* Use generated name column instead of JSON extract in container summary queries

storage_container_entity has 'name' as a STORED generated column derived
from json->>'name' (see bootstrap/sql/schema/postgres.sql). Both slim
projection queries (findContainerSummaryRows and listDirectChildSummariesByParentHash)
were redundantly extracting it via JSON_UNQUOTE(JSON_EXTRACT(...)) on MySQL
and json->>'name' on Postgres — work the database had already done at insert
time.

Reading 'name' as a column directly:
  - Saves one JSON op per row on every page fetch
  - Lets ORDER BY name sort on the indexed generated column rather than a
    per-row JSON-extracted expression

displayName, fullyQualifiedName, and description stay as JSON extracts —
they aren't generated columns. (description in particular shouldn't be:
free-text fields can be many KB and a STORED generated column would
double the row size on disk.)

Row mapper unchanged — column labels in the SELECT list still match.

* Fix inaccurate ListFilterTest comment and Javadoc link to private method

ListFilterTest: the prefix-pattern comment said the LIKE patterns 'exclude'
direct/grandchildren — patterns themselves match, the SQL's NOT LIKE is
what excludes. Rewrote to show how ContainerDAO.listRoot* combines LIKE
and NOT LIKE on the two binds.

CacheKeys.childrenPage: the @link pointed at ChildrenPageCache#includeTag
which is private static; Javadoc tooling renders that as an unresolved
link. Redirected to the public Include enum the tag is derived from.

* Log original exception in recursive batch delete catch before wrapping

Wrapping the caught RuntimeException into a new one (with entity context
in the message) preserves the original via the cause chain, but the outer
exception mapper sees the wrapper and renders a generic 500 — the original
type information doesn't surface to operators investigating a failed
delete.

Adds a LOG.error before the wrap so the original exception (with full type
and stack) lands in the logs adjacent to the entity context, giving
operators enough signal to diagnose what actually blocked the delete.

* Restore failure-semantics comment block on recursive batch delete wrap

* use Entity.SEPARATOR instead of hard-coding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix check style

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: sonika-shah <58761340+sonika-shah@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-05-04 18:44:42 +05:30
Rohit Jain
f486f15e9e
Fix aut failures (#27882)
* Fixed AUT failures

* lint fix

* minor fix
2026-05-04 17:47:54 +05:30
Himanshu Khairajani
e07f03334d
Patching error message verbosity (#27692)
* patching error message

* fix: resolve unresolved merge conflict in patch_mixin.py

Keep the patch_body in the warning log; the main side dropped it.

* fix(patch): replace full body dump with op:path summary on patch failure

Avoid leaking patch values (descriptions, sample data, tags) in WARNING
logs. The Jackson server message in 'Reason:' still carries the offending
value for the failing field, which is enough to debug deserialization
errors without dumping every field being changed.
2026-05-04 14:15:51 +02:00
Anujkumar Yadav
6a8cf4417f
Removed task workflow from oss (#27881) 2026-05-04 14:43:30 +05:30
Sid
ca2d0122db
test(playwright): add nightly SAML session renewal coverage (#27619)
* test(playwright): add nightly SAML session renewal spec

Covers OM's JWT refresh behavior for SAML sessions end-to-end against
the local Keycloak fixture: silent refresh after expiry, concurrent
401s queuing behind a single refresh call, and forced re-login when
the server-side SAML HttpSession is gone.

Reuses the snapshot/restore mechanism and keycloak-azure-saml provider
helper introduced in #27164; shortens samlConfiguration.security.token
Validity to 10s so the suite observes multiple expiry cycles in <60s.

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

* Update openmetadata-ui/src/main/resources/ui/playwright/utils/sessionRenewal.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* test(playwright): drop expiry wait from refresh-on-reload SSO specs

The reactive 401 refresh path races with the AuthProvider useEffect that
wires tokenService.renewToken from authenticatorRef — if the 401 from
/users/loggedInUser lands before that effect commits the populated ref,
refreshToken() returns null and the user is logged out instead of refreshed.

With tokenValidity=10s (< EXPIRY_THRESHOLD_MILLES=60s), the UI's proactive
timer in startTokenExpiryTimer fires immediately on every mount, so
/auth/refresh is exercised on each reload regardless of expiry state.
Assertions on token rotation and session continuity still cover "silent
refresh works end-to-end".

The SAML-session-gone case still waits for expiry — it needs to.

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

* test(playwright): trigger refresh via SPA nav in SSO renewal specs

page.reload() remounts React and re-races the axios interceptor setup
in AuthProvider — the useEffect that wires authenticatorRef.renewIdToken
onto TokenService has a ref-typed dependency that doesn't reliably
re-run, so the first 401 after reload sometimes finds renewToken=null
and the interceptor silently logs the user out instead of refreshing.

Click the Explore sidebar link instead. The click triggers authenticated
API calls while staying inside the already-mounted React tree, so the
interceptor always reaches the wired TokenService. Spec now passes
10/10 locally.

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

---------

Co-authored-by: Siddhant <siddhant@MacBook-Pro-621.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-05-04 11:48:45 +05:30
Chirag Madlani
d095413ed1
fix(ci): nightly workflow running stale project getting failed [skip-ci] (#27849)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
2026-05-04 10:53:16 +05:30
Rohit Jain
1a8e94e14e
fix: serve .md files as static assets instead of SPA fallback (#27860) 2026-05-04 10:33:10 +05:30
Sriharsha Chintalapani
fb597301ea
Reindex observability + correct attribution for column-search migration (#27872)
* feat(ui): show wall-clock latency and throughput on AppLogsViewer overall card

The Overall Stats card on the Logs view used `jobStats.totalTimeMs` as the
basis for "Latency · throughput", but that field is never populated — stage
timings are recorded per-stage and never aggregated up to the job level.
The result was a misleading "<1 ms · >85k r/s" display that gave operators
the impression a reindex was running far faster than it actually was.
2026-05-03 17:30:53 -07:00
Harsh Vador
a93bfcf3f1
ui: Fix flaky product tour startup on slow /tour render (#27820)
Some checks are pending
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
* ui: Fix flaky product tour startup on slow /tour render

* simplify code
2026-05-03 15:10:12 +05:30
Sriharsha Chintalapani
5620121e50
SearchIndex: tunable index settings + per-stage latency metrics (#27865)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* SearchIndex: configurable index settings + per-stage latency metrics

Adds two diagnostic and operational improvements to the distributed search
indexing pipeline so operators can both tune cluster behavior per
installation and pinpoint where reindex latency is being spent.

Configurable index settings (per-installation, no code changes needed)
- New SearchIndexing app config fields: liveIndexSettings (post-promote),
  bulkIndexSettings (during reindex), and per-entity overrides.
- DefaultRecreateHandler applies bulk overrides on staged-index creation
  (e.g. refresh=-1, replicas=0, async translog) and reverts to live values
  before alias swap. Optional force-merge before swap.
- Safety revert ensures the promoted index never inherits a disabled
  refresh interval, even if the admin only configured bulk overrides.
- Live UX is preserved: refresh defaults to 1s so users and agents that
  read-after-write see near-real-time results.
- New IndexManagementClient methods (updateIndexSettings, forceMerge)
  with implementations for OpenSearch and Elasticsearch.

Per-stage latency metrics (consumer-vs-producer attribution)
- StageStatsTracker accumulates per-stage wall-clock time alongside
  existing counters; added timing-only addStageTime() so per-record
  callbacks and per-batch wall-clock don't double-count.
- DB migration 1.13.0 adds readerTimeMs / processTimeMs / sinkTimeMs /
  vectorTimeMs columns to search_index_server_stats. Existing rows get
  DEFAULT 0; aggregation queries SUM the new columns.
- Reader timing wraps PartitionWorker.readEntitiesKeyset (DB latency).
  Process timing wraps the doc-build join in OpenSearch and Elasticsearch
  bulk sinks (CPU/serialization). Sink timing wraps client.indices().bulk
  (pure search-cluster latency), attributed per participating tracker.
- DistributedJobStatsAggregator surfaces totalTimeMs on each StepStats so
  the UI can compute avg latency = totalTimeMs / successRecords and
  throughput = successRecords / (totalTimeMs / 1000) on every WebSocket
  push without server-side derivation.
- New per-server aggregation query (getStatsByServer) for distributed
  visibility, fed into SearchIndexJob.ServerStats with timing fields.

UI: each of the four stage cards (Reader / Process / Sink / Vector) shows
"Latency: X ms · Y r/s" when timing is available; per-entity table gains
Sink avg + Sink throughput columns. Docs panel updated. New SearchIndexing
config section added with sane defaults that preserve current behavior.

Tests: 6 new StageStatsTracker timing tests, new aggregator test that
asserts StepStats.totalTimeMs is populated at job and per-entity level.
All existing tests updated for new arg shapes; 60 unit tests pass.

The pattern operators see: Reader avg climbing means DB-side issue
(cache/autovacuum); Sink avg climbing means OS-side issue (segments/
back-pressure); only one entity's row climbing identifies the offender.
2026-05-02 20:11:06 -07:00
Sriharsha Chintalapani
2a11bd53b0
test: cover glossary CSV typed relations across unit, IT, Playwright (#27740)
* test: cover glossary CSV typed relations across unit, integration, and Playwright

Add round-trip and validation coverage for typed glossary term relations
(synonym, broader, narrower, custom types from settings) in CSV
import/export. Unit tests in CsvUtilTest exercise addTermRelations
serialization edge cases. Integration tests in GlossaryCsvRelationTypesIT
add a true export-reimport round-trip, mixed-format per-term API
verification, asymmetric relation visibility from both sides, and a
custom-relation-type round-trip via GlossaryTermRelationSettings.
Playwright specs in GlossaryImportExport.spec.ts drive the UI bulk
import/export flow with typed relations and assert the validation
surface rejects unknown relation types.
2026-05-02 18:08:56 -07:00
Sriharsha Chintalapani
72e528c695
Fix flaky IT tests: incident-id tracking + GlossaryOntologyExportIT isolation (#27867)
* Fix flaky IT tests by snapshotting create/update/patch responses in SDK
2026-05-02 17:50:11 -07:00
Sriharsha Chintalapani
b118a87df2
Add text_pattern_ops index on entity-table fqnHash for Postgres listings (#27868)
* Add text_pattern_ops index on entity-table fqnHash for Postgres listings

Service-filtered listings (`?service=` / `?database=` / `?databaseSchema=` /
`?parent=` / `?apiCollection=` / `?spreadsheet=` / `?testSuite=`) compile
to `<table>.fqnHash LIKE 'prefix%'` via ListFilter.getFqnPrefixCondition.
The unique B-tree on `fqnHash` uses default `text_ops` opclass and the
column inherits the database default collation (`en_US.UTF-8` on managed
Postgres / RDS), neither of which lets the planner satisfy LIKE prefix
from the index. Cold count(*) and the page query both fall back to a
parallel seq scan over the JSONB heap — measured at ~3s on a ~580k-row
storage_container_entity even after VACUUM/ANALYZE tuning and an RDS
upsize. The unfiltered listing (`?limit=15`) clears the same dataset in
~215ms because it uses `idx_storage_container_entity_deleted_name_id`
from 1.8.2, which the LIKE predicate cannot.

Append a `text_pattern_ops` partial index on `fqnHash` for every entity
table that hits getFqnPrefixCondition (24 tables: chart_entity through
worksheet_entity). The `text_pattern_ops` opclass supports LIKE prefix
regardless of column collation, switching the cold count(*) plan from
parallel seq scan to bitmap index scan.

MySQL is unaffected: every entity-table `fqnHash` column already ships
with `CHARACTER SET ascii COLLATE ascii_bin`, a binary collation that
lets the existing unique B-tree answer LIKE prefix predicates directly.
The MySQL counterpart gets a documentation-only comment explaining the
asymmetry so the next migration audit doesn't have to re-derive it.
2026-05-02 17:25:56 -07:00
Sriharsha Chintalapani
620d1b6ad9
Cache audit fixes: tag rename + relationship invalidation, bundle warmup (#27864)
* Cache audit fixes: tag rename invalidation, relationship invalidation, bundle warmup

Fix two write-through cache correctness bugs and enhance the warmup app:

Bug A — Tag/Glossary/Classification rename now invalidates the cached entity
JSON for every entity tagged with the renamed tag. Adds
invalidateCacheForTaggedEntities helpers in EntityRepository that use the
search index (same source updateClassificationTagByFqnPrefix already uses) to
enumerate affected entities, then call invalidateCacheForEntity for each.
Wired into TagRepository, ClassificationRepository, and both rename + parent-
move paths in GlossaryTermRepository.

Bug B — Direct addRelationship/deleteRelationship and bulk variants now
invalidate the cached bundle/owners/domains on both sides. Bot/Domain/Data
Product (already in UNCACHED_ENTITY_TYPES) short-circuit in
invalidateCacheForEntity so cascade-heavy delete paths don't pay for Redis
ops on keys that were never written.

Warmup enhancements — new BundleWarmupBatcher pre-warms the per-entity bundle
cache (tags + certification) using batched tag_usage queries; relations stay
lazy. CacheWarmupApp adds per-entity-type checkpoint resume, opt-in
SETNX-based distributed claim for multi-instance deploys, and per-entity-type
cache.warmup.coverage / cache.warmup.bundle.coverage gauges. CacheProvider
gains scanCount; CacheMetrics gains coverage gauges and a completed_runs
counter. cacheWarmupAppConfig.json drops dead consumerThreads/queueSize and
adds warmBundles + enableDistributedClaim flags.

Tests — BundleWarmupBatcherTest covers the batcher with mocked DAO/cache.
TagRenameCacheIT and RelationshipCacheInvalidationIT cover the bug fixes
end-to-end under the cache-tests / postgres-os-redis profile.


* Update generated TypeScript types

* Address PR review: claim ownership, config wiring, coverage, keyspace

Six follow-ups against PR #27864:

- releaseClaim now does a compare-and-delete: GET the owner first and only
  DEL when it matches our instanceId. Previously a 10-min TTL could expire
  mid-warm, another instance could claim, and we'd blindly delete its lock.
- warmBundles / enableDistributedClaim are now read from the user-supplied
  app config map (matching the cacheWarmupAppConfig.json schema fields)
  instead of being JVM-system-property-only. System properties remain a
  fallback for bootstrap / unedited records.
- Per-entity-type checkpoint and claim keys now embed cacheConfig.redis
  .keyspace so two environments sharing one Redis with different keyspaces
  no longer collide on warmup metadata.
- reportCoverage now prefers scanCount over current-run success delta when
  available, so resumed runs report end-state coverage instead of the
  artificially low partial number.
- CacheWarmupApp class Javadoc updated to reflect that bundle pre-warm is
  on by default; intentionally-not-done text was stale.
- RelationshipCacheInvalidationIT Javadoc clarifies that the assertion is
  on the cacheable table side; Domain itself is in UNCACHED_ENTITY_TYPES.
- CacheProvider.scanCount Javadoc documents the O(DBSIZE) cost so callers
  don't drop it on the request path.
- EntityRepository.invalidateCacheForTaggedEntities Javadoc strengthens
  the search-lag tradeoff section with the actual fallback (entity TTL).

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

* PR review: accept string and Boolean forms for warmup config flags

readAppConfigFlags previously only accepted Boolean.TRUE / Boolean.FALSE.
Depending on how the app config arrives (typed POJO, raw JSON, YAML
env-var override, API string body) the same logical value can land as a
"true"/"false" string — and the instanceof Boolean check would silently
ignore it and fall back to the JVM system property. Operators setting the
flag in the UI would see no effect. Added a small parseBooleanFlag helper
that handles both shapes.
2026-05-02 14:50:01 -07:00
Rohit Jain
41c6ff5d83
Increased the api polling timout for ActivityApI spec (#27863)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* Increased the api polling timout for ActivityApI spec

* lint fix
2026-05-02 13:32:20 -07:00
Sriharsha Chintalapani
bf23776721
Fix container listing 504s: reapply 1.8.2 indexes + cache list counts (#27859)
* Reapply 1.8.2 indexes in 1.13.0 + cache listing counts in Redis

Production tenants are timing out (504) on
GET /api/v1/containers?fields=id&limit=1 against ~580k container tables.
Root cause: the 1.8.2 entity-table indexing pass partially applied —
only 9 of 20 audited entity tables have idx_<table>_deleted_name_id and
none of the legacy 1.4.0 (fqnHash, deleted) indexes were dropped. The
list count(*) falls back to a parallel seq scan over a 1.5 GB JSONB heap
that intermittently runs into 100s under cold-cache + concurrent load.

Three changes:

1.  Append 1.8.2's entity-table index DDL verbatim to 1.13.0 schema
    changes (postgres + mysql). The native runner already deduplicates
    by per-statement SHA-1, so on tenants where 1.8.2 succeeded each
    statement is a no-op, and on tenants where it didn't the missing
    indexes get created and the legacy ones dropped on next deploy.
    No new migration version, no schema branching.

2.  Carry forward the ?root=true container listing rewrite from
    container_redis_cache: replace LEFT JOIN + er.toId IS NULL with a
    correlated NOT EXISTS, plus the supporting
    idx_er_fromentity_toentity_relation_toid covering index. Lets the
    planner anti-join via index instead of materializing the
    container-to-container child-edge set.

3.  Read-through cache for paginated listing totals (ListCountCache).
    Single Redis hash per entity type, one field per ListFilter
    variant; HGET on read, HSET on populate, DEL on invalidate.
    Atomic per-entityType invalidation — every filter variant clears
    in one op. Wired into postCreate / postCreate(List) / postDelete /
    restoreEntity, so paging.total reflects state changes within a
    round-trip rather than waiting out the TTL window. Routine
    updates (description / tags / owners) deliberately do not
    invalidate; they don't change the count and over-invalidation
    would defeat the cache on heavy editing workloads. Default TTL
    60s, configurable via CacheConfig.listCountTtlSeconds.

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

* Test: pin ?root=true and other ListFilter variants to distinct cache keys

Walks the (entityType, ListFilter) -> Redis-hash-field mapping that
ListCountCache builds. Confirms that ?root=true, ?root=false, the
root-absent baseline, different service values, and different Include
values all hash to different cache fields — so root listings get cached
independently from base listings under the same per-entityType hash, and
a single DEL on lifecycle events still clears every variant atomically.
Also pins query-param-order independence so the canonicalization stays
sort-stable.

Promotes hashFilter from private to package-private with a comment
explaining why; the only intent is test access.

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

* Drop leading comment blocks from 1.13.0 1.8.2-reapply to fix dedup

Test bootstrap was failing on MySQL with "Duplicate key name
'idx_thread_type_resolved_createdAt'" when migrations ran 1.8.2 then
1.13.0 in sequence on a fresh DB.

Root cause: Flyway's MySQL parser was attaching the leading multi-line
comment block to the first CREATE INDEX statement when computing the
SQL text. The runner hashes that text to dedup against previously-run
statements (SERVER_MIGRATION_SQL_LOGS), so:

  hash(1.8.2: "CREATE INDEX idx_thread_type_resolved_createdAt ...")
    != hash(1.13.0: "-- Reapply ... \n\n CREATE INDEX idx_thread_..."),

dedup missed, MySQL then ran the CREATE INDEX, found the index already
existed from when 1.8.2 ran moments earlier in the same bootstrap, and
threw. The whole reapply pass relies on byte-identical statement text
to ride the runner's hash dedup; comments break that.

Fix: drop both comment blocks. The full rationale lives in the PR
description and commit message, not in the SQL file. The remaining
statements are byte-identical to 1.8.2/{postgres,mysql}/schemaChanges.sql,
so the dedup picks them up cleanly on tenants where 1.8.2 already ran
and applies them where it didn't.

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

* Defer MCP table creation to 2.0.0; skip MCP in 1.7.0 lineage migration

MCP services aren't actually shipping in 1.13.0 — table creation got
checked into 1.13.0/schemaChanges.sql by mistake. Move all the MCP
DDL (mcp_service_entity, mcp_server_entity, mcp_execution_entity, plus
the McpApplicationBot allowImpersonation flag and the bot's role
assignment) to 2.0.0/schemaChanges.sql for both Postgres and MySQL.

Test bootstrap was failing because v170.MigrationUtil's
getAllServicesForLineageExcludingDrive iterates every ServiceType in
the enum and calls listAll on each. ServiceType.MCP is in the enum,
so the 1.7.0 data-migration step was trying to query
mcp_service_entity — which doesn't exist until 2.0.0 runs.

Add MCP to the exclusion list alongside DRIVE / SECURITY / LLM (each
already excluded for the same "didn't exist at v1.7.0 schema" reason).

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

* Drop 1.8.2 reapply from 1.13.0; the runner can't dedup it cross-version

The plan was to ship the 1.8.2 entity-table indexing pass appended to
1.13.0 so any tenant that received 1.8.2 only partially would self-heal
on next deploy. Relied on the migration runner's per-statement hash
dedup (SERVER_MIGRATION_SQL_LOGS) ensuring byte-identical statements
got skipped if 1.8.2 had logged them.

That doesn't work. parseSQLFiles is called for ALL migration files at
loadMigrations(), before any version executes — so when 1.13.0 parses
its content, 1.8.2 hasn't run yet and its hashes aren't in
SERVER_MIGRATION_SQL_LOGS. The dedup misses 100% of the time on a fresh
DB, the 1.13.0 statements get queued, and then collide with the indexes
1.8.2 just created moments later. Both Postgres and MySQL IT bootstrap
fail with "already exists" / "Duplicate key name".

Confirmed via local IT run on both dialects.

Two real options:
  1. Make the SQL idempotent at language level (Postgres IF NOT EXISTS
     and a stored procedure for MySQL since it has no IF NOT EXISTS on
     CREATE INDEX). ~150+ extra lines of MySQL.
  2. Drop the reapply; ops applies the 1.8.2 SQL by hand on the slow
     tenant; document the runbook.

Going with (2). The slow tenant is reachable, the SQL is in the PR
description, and the migration runner's parse-time-dedup limitation
makes (1) noticeably more complex than it's worth for a single
known-affected tenant. If we discover more tenants in the same partial
state, we ship a proper idempotent remediation as its own migration
version (2.0.2 or later) where we can verify in isolation.

Keeps everything else from this PR:
  - ContainerDAO ?root=true NOT EXISTS rewrite
  - idx_er_fromentity_toentity_relation_toid (genuinely new for the
    rewrite, unique to 1.13.0)
  - ListCountCache + lifecycle invalidation hooks
  - MCP DDL moved 1.13.0 → 2.0.0
  - ServiceType.MCP excluded from v170 lineage migration

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

* Revert "Defer MCP table creation to 2.0.0; skip MCP in 1.7.0 lineage migration"

This reverts commit 7a3c999ffd.

* Skip ServiceType.MCP in v1.7.0 lineage migration

MigrationUtil.getAllServicesForLineageExcludingDrive iterates every
ServiceType.values() and calls listAll on each. The exclusion list
already drops DRIVE / SECURITY / LLM for the same reason — they
weren't in the schema at v1.7.0's release. MCP belongs in the same
list: the table is created in v1.13.0, so a fresh test bootstrap that
runs migrations in order hits the v1.7.0 data-migration step before
mcp_service_entity exists, and 1.7.0's listAll explodes with
"relation mcp_service_entity does not exist".

This is a test-bootstrap-only failure mode — production tenants ran
v1.7.0 long ago and won't re-run that data migration when 1.13.0
deploys. But test bootstrap runs every migration from scratch in one
pass, so it needs the same anticipatory exclusion the other newer
service types already get.

One-line change. MCP DDL stays in v1.13.0 schemaChanges where it was.

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

* Address PR #27859 review feedback

ListCountCache (5 review notes):

1. Hash now uses StandardCharsets.UTF_8 explicitly. The default charset
   varies by JVM/platform; without this, the same filter produced
   different cache fields on different nodes, splitting hit-rate in
   multi-instance deployments.

2. Canonical filter string is built ONLY from filter.getInclude() +
   sorted queryParams. Previously prepended filter.getCondition(),
   which iterates an unordered HashMap and isn't guaranteed stable
   across JVM iterations. Same-shape filters now hash deterministically.

3. Class-level Javadoc + test docstring now spell out that the field
   key is the first 16 hex chars of SHA-1, not a full digest. Truncation
   gives 64 bits — birthday collision around 2^32 distinct filters per
   entity type, well above realistic load. The 16-hex-char width is also
   pinned by a new test (`hashIs16HexChars`).

4. NumberFormatException on a corrupt cached value now triggers HDEL
   on the bad field. Previously the corrupt value sat in Redis until
   TTL expiry, causing repeated parse failures. Eviction lets the next
   caller repopulate cleanly.

5. Class Javadoc now documents the @Transaction commit-ordering
   trade-off: invalidate fires inside the transaction, so a concurrent
   reader can race-cache the pre-write count for up to the TTL.
   Listing data is unaffected (always live); only paging.total can be
   briefly stale. Bounded by listCountTtlSeconds (default 60s).
   Restructuring to fire invalidation post-commit is a separate change
   touching every transactional repository method — out of scope here.

MySQL idempotency (1 review note):

idx_er_fromentity_toentity_relation_toid creation now goes through the
information_schema.statistics + PREPARE/EXECUTE pattern this file
already uses for the entity_usage usageDate index. MySQL has no
IF NOT EXISTS for CREATE INDEX, so without this guard the migration
fails on any tenant where the index was added by a prior partial run
or manual repair, and the runner's checksum log doesn't know about it.

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

* Drop information_schema guard around idx_er_fromentity index

The migration runner already swallows per-statement failures (logs the
error, continues to the next statement). On the rare path where this
index already exists outside the runner's checksum log, the bare
CREATE INDEX is fine — it'll error once at deploy time and be skipped.
The PREPARE/EXECUTE pattern was overkill.

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

* Address PR #27859 round 2 review feedback

- Refactor getOrCompute: extract readCachedCount / evictCorruptField /
  writeCachedCount helpers so nesting depth stays at 3 levels (was
  try → if → try → try). Behavior unchanged.

- hashFilter ignores derived bind params with the `Hash` suffix.
  ListFilter.getCondition() side-effect-mutates queryParams (e.g.
  serviceHash, databaseSchemaHash) when called via dao.listAfter /
  listBefore. EntityRepository.listBefore calls dao.listBefore BEFORE
  ListCountCache.getOrCompute, so the hash there saw a different
  queryParams shape than listAfter (which counts before listAfter
  runs). Same logical filter now hashes to the same field regardless
  of which paginated endpoint hits the cache first. New test
  hashIgnoresDerivedHashSuffixedParams pins the invariant.

- NoSuchAlgorithmException fallback in hashFilter now throws
  IllegalStateException instead of returning a variable-length
  Integer.toHexString(hashCode()). SHA-1 is mandated by every Java SE
  implementation; if it's missing the JVM is broken in a way the
  previous fallback would have masked while silently breaking the
  documented 16-char invariant.

- Test uses statically imported assertEquals/assertTrue rather than
  the FQN org.junit.jupiter.api.Assertions.* form — matches the file's
  existing style.

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

* Resolve remaining PR #27859 review comments

ThreadLocal SHA-1 digester (Copilot perf nit):

  Cache MessageDigest in a ThreadLocal so the per-call cost on hot list
  endpoints drops to a HashMap lookup + reset() instead of going through
  the security provider registry on every request. SHA-1 is mandated by
  every Java SE provider, so the failure case throws at ThreadLocal
  init rather than per-call — same fail-loud behavior as before.

Clarify @Transaction "race" in class Javadoc (Copilot ×2 race comments):

  EntityRepository subclasses are instantiated with `new ...()` and
  registered via Entity.registerEntity(...). They are NOT obtained via
  jdbi.onDemand / jdbi.attach, so the JDBI SqlObject proxy that would
  honor the @Transaction annotation on those methods is never applied.
  The annotation is decorative on EntityRepository — only methods on
  actual SqlObject DAO interfaces (CollectionDAO and friends) get the
  transactional wrap. Each underlying DAO call auto-commits
  independently, and ListCountCache.invalidate runs after those commits.
  The window between a DAO commit and the Redis DEL is sub-millisecond;
  any concurrent reader that races in caches the post-commit count, not
  pre-commit. The original review concern assumed a transaction
  boundary that doesn't exist in this code path.

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

* Fix ListCountCache hash collision on user-supplied *Hash params

Earlier round: hashFilter filtered out queryParam keys ending in 'Hash'
to keep the same logical filter from hashing differently across
listAfter (count first) vs listBefore (count after dao.listBefore had
mutated queryParams). That filter is wrong in both directions:

- Drops user-supplied entityFQNHash (a real filter param —
  ListFilter.getEntityFQNHashCondition uses it). Two listings with
  different entityFQNHash values would collide on one cache field and
  return the wrong paging.total.

- Misses derived bind params that don't end in Hash: ownerIdParam,
  serviceNameParam, assigneeIdParam, mentionedUserParam, tierParam,
  databaseSchemaHashExact, etc.

Adopt the reviewer's original suggestion: compute the hash BEFORE the
mutation. Move ListCountCache.getOrCompute call ahead of dao.listBefore
in EntityRepository.listBefore (mirroring the listAfter /
listAfterWithOffset ordering, where count is already first). Drop the
endsWith("Hash") filter; user-set queryParams now influence the hash
correctly regardless of suffix.

Update Javadoc to spell out the contract: hashFilter must be invoked
before any code path that calls filter.getCondition() (which is the
function that mutates queryParams with derived bind params). The three
EntityRepository list methods now all follow this ordering.

Tests:
- userSuppliedEntityFqnHashAffectsHash — pins that two filters
  differing only in entityFQNHash hash differently.
- derivedBindParamsThatLeakIntoFilterDoChangeHash — documents that
  if the ordering contract is violated and a derived bind param ends
  up in queryParams pre-hash, the hash WILL change. Cache hit rate
  suffers but correctness doesn't.

The previous hashIgnoresDerivedHashSuffixedParams test was based on
the wrong premise and is removed.

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

* Format ListCountCacheTest: collapse single-line statements

spotless / formatter pass — same assertions, no behavior change.

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

* Address PR #27859 review 4213358213 — collision + TTL semantics

Comment 1 (line 203): hash-canonicalization separator collision.

  String-concat with `|` / `=` separators meant a user value containing
  those characters could craft a canonical identical to a different
  filter map. E.g. {nameFilter: "foo|service=bar"} canonicalized to the
  same string as {nameFilter: "foo", service: "bar"}.

  Switch to length-prefixed digest feeds: each key and value goes to
  the digest as [4-byte BE length][UTF-8 bytes]. No value can be
  confused with a separator regardless of content. New
  `userValuesContainingSeparatorCharsDoNotCauseCollisions` test pins
  the invariant against both `|` injection and `=` injection.

Comment 2 (line 135): TTL semantics overstated; high-cardinality risk.

  CacheProvider.hset applies EXPIRE on the whole hash, not per-field,
  so any write refreshes TTL for every field. On a busy entity type
  the hash effectively never expires via TTL — invalidate hooks are
  the sole steady-state staleness bound. The earlier Javadoc claimed
  TTL was the upper bound; that was only true when no other writes
  happen during the window.

  Update the class-level Javadoc to spell this out honestly, with a
  separate bullet on the unbounded-field-growth concern for
  high-cardinality user filters (nameFilter, *Regex). In practice OM
  listings filter on low-cardinality keys (service / database /
  domain), so the working set stays bounded — worth monitoring but
  doesn't warrant the versioned-key refactor today. That refactor
  (bump a `lcver:<entityType>` counter on invalidate; cache under
  `lc:<entityType>:v<ver>`; old hashes age out naturally) is a
  follow-up if real workloads show the working set growing
  unboundedly. It costs an extra GET per read so isn't free.

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

* Rename ContainerDAO root-only SQL methods to avoid override collision

Root cause of the auto-classification regression on this PR: the
NOT EXISTS rewrite added an SQL @SqlQuery method named `listAfter` /
`listBefore` / `listCount` on ContainerDAO with the same Java signature
as EntityDAO's default 6-arg counterparts:

    List<String> listAfter(String table, Map<String,?> params,
                           String cond, int limit,
                           String afterName, String afterId);

JDBI / Java pick the override at virtual dispatch — so even when our
`listAfter(ListFilter, ...)` wrapper said "if (!root) return
EntityDAO.super.listAfter(...)", super's default impl internally called
`listAfter(table, params, cond, ...)` which then resolved to the
@SqlQuery override and dragged the NOT EXISTS predicate into every
non-root listing as well.

Pre-#27836 the override existed too, but its SQL used a LEFT JOIN
without `er.toId IS NULL` in the static SQL string, so the spurious
non-root invocation was a no-op. The rewrite to NOT EXISTS made the
predicate unconditional, which silently filtered out every child
container from generic `?service=...` listings (and from the
StorageProfilerSource's `metadata.list_all_entities(Container, ...)`
that drives auto-classification — hence the 11 failing PII tag tests).

Fix: give the root-only @SqlQuery methods distinct names so they no
longer override the base. The dispatcher methods (`listAfter`,
`listBefore`, `listCount` on ListFilter) now route to the renamed
`listRootAfter` / `listRootBefore` / `listRootCount` only when
`root=true`.

Verified locally: `?service=foo` now returns all containers (bucket +
children) again, `?service=foo&root=true` correctly returns only roots,
and the previously-failing
test_container_pii_classification_csv passes against the rebuilt
server.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* fix checkstyle

* ListCountCache: drop writeCachedCount to 5 params per project guidelines

Compute the TTL Duration at the call site and pass it directly instead of
threading CacheConfig through. entityType was only used for the debug log
message; hashKey already carries it (`<ns>:lc:<entityType>`), so the
diagnostic stays identifiable.

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 07:05:03 -07:00
Rohit Jain
9ba288566c
Fixed service doc panel falky spec (#27857)
Some checks are pending
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
2026-05-02 12:38:36 +05:30
Rohit Jain
4169b728dc
Fix: DataContract entity endpoint fails with 400 for entities without dataProducts field (#27861)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
2026-05-01 18:54:53 -07:00
Sriharsha Chintalapani
ecc4b17579
Redis caching for container ancestors and children-page (#27858)
* Cache resolved ancestor chains in Redis

The /containers/name/{fqn}/ancestors endpoint runs on every detail-page
render to populate breadcrumbs. The resolution itself is one indexed
findReferencesByFqns call (already slim) plus FQN string walking, but the
DB round-trip and JSON deserialization are repeated for every navigation.
Bundle this behind Redis with the same shape as CachedReadBundle.

Cache key: om:anc:container:{fqnHash} → JSON List<EntityReference>, TTL =
entityTtlSeconds (default 5 min).

Invalidation:
- Writer drops its own key on update/delete (EntityRepository.invalidateCache)
- Cross-instance: the existing CacheInvalidationPubSub handler now also
  drops the ancestors key for the published FQN.
- Renames are self-healing: the new FQN is a different key, the old key
  TTL-expires.
- Display-name drift on a remote ancestor is bounded by TTL — acceptable
  since breadcrumb metadata is cosmetic.

The cache is wired into ContainerRepository.getAncestors only — generalising
to other hierarchical entity types is straightforward when more /ancestors
endpoints land.
2026-05-01 18:52:15 -07:00
Teddy
457afabcf0
MINOR - React and Java telemetry (#27773)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* chore: added sentry for UI

* chore: added sentry for UI

* chore: added sentry for UI

* chore: added sentry for UI and backend

* chore: move setup to config

* Update generated TypeScript types

* chore: addressed CI comments

* chore: handle no ui startup in IndexResource

---------

Co-authored-by: IceS2 <pablo.takara@getcollate.io>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-05-01 11:36:17 -07:00
Mohit Tilala
0fb695421d
Fixes #27842: Fix unitycataog error when httpPath is missing (#27844)
* Fix unitycataog error when httpPath is missing

* py_format

* Drop redundant restoration test
2026-05-01 18:52:58 +05:30
Sriharsha Chintalapani
ad9e1b7823
Containers: batch container data-model column tag retrieval to avoid subtree fan-out (#27836)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* Containers with deep nesting causing performance issues due to tag fetch

* Batch derived-tag fetch across data-model columns

populateDataModelColumnTags previously called addDerivedTagsGracefully
once per flattened column, which internally batches across that column's
own tags but issues a separate derived-tag DB lookup for every column.
On data models with many columns (or struct types with deep nesting)
this becomes an N+1 pattern.

Refactor:
- Pre-compute Map<String, Column> hashToColumn once (LinkedHashMap to
  preserve column order) so we no longer hash each FQN twice — once
  for the target-hash list and again on lookup.
- After fetching tags by target hash, flatten all returned TagLabels
  into a single list and call TagLabelUtil.batchFetchDerivedTags(...)
  once for the whole data model.
- Per column, use addDerivedTagsWithPreFetched(columnTags, derivedMap)
  to avoid further DB lookups.
- Fall back to the per-column addDerivedTagsGracefully path if the
  batch derived-tag fetch raises, preserving existing semantics.

Net effect: total derived-tag DB queries drop from O(N) to 1 regardless
of column count or nesting depth.


Co-authored-by: sonika-shah <58761340+sonika-shah@users.noreply.github.com>
2026-04-30 20:55:55 -07:00
Rohit Jain
56a3cb7a5a
Fixed User spec flakiness (#27848)
Some checks are pending
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Chirag Madlani <12962843+chirag-madlani@users.noreply.github.com>
2026-04-30 21:12:32 +00:00
sonika-shah
4a2f42f1d3
Add source filter and indexed hash prefix to cert tag batch query (#27847)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* Add source filter and use indexed hash prefix in cert tag batch query

The certification tag batch query (TagUsageDAO.getCertTagsInternalBatch)
was hitting ~12 seconds per call on instances with deep classification
hierarchies — fired ~5,800 times per Data Insights run, contributing
~19 hrs of cumulative DB time per DI run.

Two missing index-friendly predicates caused the slowness:
1. No `source = ?` filter — couldn't use idx_tag_usage_target_exact
   (source, targetFQNHash, state) INCLUDE (tagFQN, labelType) whose
   covering INCLUDE has tagFQN.
2. `tagFQN LIKE 'Certification.%'` on the raw column — there's no
   LIKE-friendly index on raw tagFQN, only on tagfqn_lower text_pattern_ops
   and tagFQNHash. The LIKE always ran as a post-filter on every row the
   IN clause returned.

Fix:
- Add `source = :source` filter (Certifications are always Classification
  source = 0).
- Switch `tagFQN LIKE :tagFQNPrefix` → `tagFQNHash LIKE :tagFQNHashPrefix`,
  with the hash prefix pre-computed via FullyQualifiedName.buildHash so the
  query hits the indexed hash column.

Same SQL on MySQL and Postgres — no @ConnectionAwareSqlQuery split needed.

Also a correctness improvement: the `source = 0` filter excludes glossary
terms (source = 1) that happen to have FQNs starting with "Certification.".
Previously such glossary terms could be incorrectly returned as
certifications; now they're excluded as expected.

Test:
- Added test_certBatch_bulkFetchReturnsCorrectCertsPerEntity in
  TagResourceIT — exercises the bulk fetch path with three schemas
  (cert-tagged / untagged / non-cert-tagged) and asserts each gets
  the right certification (or null) in the listed response. Locks in
  source-filter correctness and prevents future regressions where a
  non-cert tag could leak into the certification field.

* Fix duplicate schema names in cert batch test, trim verbose comments

* Update EntityRepositoryCertificationTest mocks for new getCertTagsInternalBatch signature

* fix check style
2026-05-01 00:07:18 +05:30
Karan Hotchandani
8e398d3a3b
chore(ui): add playwright for count comparison (#27817)
* add playwright

* Update ExploreAggregationCountsMatching.spec.ts

* fix test

* Update ExploreAggregationCountsMatching.spec.ts
2026-04-30 18:58:02 +05:30
Ram Narayan Balaji
368fae160b
Revert "Feature #18173: Version API Improvements" (#26307) (#27837)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* Revert "Feature #18173: Version API Improvements, Last x versions order by desc, versions from specific timeline, versions for specific metadata changes, sdk support and UI integration (#26307)"

This reverts commit e4d3e423e1.

* fix: apply ruff formatting after conflict resolution in Python files
2026-04-30 11:23:42 +00:00
Aniket Katkar
97146ca193
Chore(UI): Knowledge graph improvements (#27823)
* Fix knowledge graph issues

* Fix checkstyle

* Fix the performance issue

* work on comment

* Worked on comments

* Fix the nodes not highlighting on hover or selection

Co-authored-by: Copilot <copilot@github.com>

* Fix checkstyle

* worked on comment

---------

Co-authored-by: Copilot <copilot@github.com>
2026-04-30 16:36:21 +05:30
shrabantipaul-collate
3504ef84cc
Fix missing ER_DIAGRAM tab in Table and Database Schema customize page tests (#27840)
Co-authored-by: Shrabanti Paul <shrabantipaul@Shrabantis-MacBook-Pro.local>
2026-04-30 15:44:11 +05:30
shrabantipaul-collate
75c3ad2e67
Fix owner search retry hanging on Container entities (#27828)
Co-authored-by: Shrabanti Paul <shrabantipaul@Shrabantis-MacBook-Pro.local>
2026-04-30 13:50:34 +05:30
Mohit Tilala
663e4d98d0
fix(ingestion): pin dbt-extractor>=0.5.0 to keep ARM resolver off sdist (#27777)
Pre-0.5 dbt-extractor wheels skip cp310-manylinux_2_17_aarch64. When pip
backtracks dbt-core into the 1.0-1.6 range on ARM runners, it lands on
dbt-extractor 0.4.x and tries to build from sdist, requiring a Rust/Cargo
toolchain we don't ship. 0.5+ ships cp38-abi3 wheels for all platforms.
Floor only — future upgrades pass through unchanged.

Co-authored-by: IceS2 <pablo.takara@getcollate.io>
2026-04-30 08:51:49 +02:00
Rohit Jain
0bd108b966
fix: resolve .keyword suffix in hyperlink workflow rules and Tags/Tier field display ambiguity in check condition (#27799)
* fix: resolve .keyword suffix in hyperlink workflow rules and Tags/Tier field display ambiguity in check condition

* fixed .keyword issue for table cp

* removed irrelavent .keyword suffix

* fixed unit test
2026-04-30 12:00:10 +05:30
IceS2
8291e06ba0
fix(profiler): make MySQL median deterministic (#27815)
* fix(profiler): make MySQL median deterministic

The MySQL MedianFn returned non-deterministic values across runs on
identical data. Two bugs:

1. ROW_NUMBER() OVER () lacked a window ORDER BY, so row numbers were
   assigned in implementation-defined storage order, unrelated to the
   sorted column position the median needs.

2. The (SELECT @counter := COUNT(*) FROM tbl) t_count cross-join relied
   on user-variable side-effect ordering, which MySQL explicitly leaves
   undefined for expressions involving user variables.

Replaced with ROW_NUMBER() OVER (ORDER BY {col}) + COUNT(*) OVER () AS
total_count, matching the pattern Doris and SQLite dialects in this
same file already use. Both correlated (dimension_col) and
non-correlated branches updated symmetrically.

Transitive impact: firstQuartile, thirdQuartile, and
interQuartileRange all reuse MedianFn via PercentilMixin and become
deterministic on MySQL as a side effect.

Bug present since #10962 (2023-04-11). The original PR noted "Tested
only external to OM" — no in-tree integration test against actual
median values, so the 6 existing unit tests (which assert SQL strings)
all passed against the broken impl.

Verified locally: 10/10 sequential runs returned median=680 for
[600,650,680,720,750] post-fix; 3/3 returned mixed 680/650/650 pre-fix.

* test(profiler): add MySQL median integration test (regression sentinel)

Mirrors the existing test_median_mariadb.py shape — testcontainers spins
up a real MySQL 8.0 container, seeds 10 rows across 2 categories, then
asserts MedianFn returns the correct percentile-discrete value across
all six combinations (p=0.25/0.50/0.75 × non-correlated/dimension_col).

Two extra regression sentinels guarding against the pre-fix bugs:

- test_compiled_sql_uses_window_order_by — asserts ROW_NUMBER() OVER
  (ORDER BY ...) is in the generated SQL and the broken `OVER ()`
  pattern is absent.

- test_compiled_sql_avoids_user_variable_counter — asserts @counter
  is absent and COUNT(*) OVER () is present.

Plus a 10x determinism check (test_median_non_correlated_deterministic_
across_runs) that would have flagged the original bug from #10962 had
it existed at the time.

The MySQL median is percentile-discrete (picks a row at ROUND(p*N))
whereas MariaDB's PERCENTILE_CONT interpolates — same seed data
produces different expected values across the two dialects, both
documented inline in the test.

Wait strategy uses LogMessageWaitStrategy("ready for connections")
.with_startup_timeout(120) — testcontainers' default regex expects
the message twice (which only MariaDB emits) and times out at 10s
before MySQL 8 finishes initializing.

* style(profiler): apply ruff format to MySQL median test

Single-line set comprehension per `make py_format` (CI checkstyle).
2026-04-30 07:36:24 +02:00
Rohit Jain
70fc7cbccc
Fixed flaky entity data steward spec (#27829)
* Fixed entity data steward spec

Co-authored-by: Copilot <copilot@github.com>

* fixed all the utils function

---------

Co-authored-by: Copilot <copilot@github.com>
2026-04-30 11:06:03 +05:30
Rohit Jain
01936b6db7
Fixed flaky entity spec (#27833) 2026-04-30 11:05:53 +05:30
IceS2
4bb35731ac
fix(ingestion): silence basedpyright McpConnection union narrowing flake (#27834)
The static-checks job intermittently fails with ~35
reportAttributeAccessIssue errors of the form "Cannot access attribute X
for class McpConnection" (or CustomDriveConnection). Root cause:
basedpyright's --baselinemode=discard matches baseline entries by
per-file diagnostic stream order with no line numbers, so any schema
regen that shifts a Union arm's narrowing cascade-misaligns downstream
baseline matches and surfaces them as new errors.

Defer the architectural fix and silence the flake at source:

* Pin basedpyright to ==1.39.3 (was ~=1.39.0) so CI no longer pulls a
  different patch version with a different typeshed bundle on each run.
* Add # pyright: ignore[reportAttributeAccessIssue] on the 35 access /
  assign sites surfaced by the failing CI run. Inline ignores delete
  the diagnostic from the per-file stream entirely, so they're immune
  to ordering shifts.

reportUnnecessaryTypeIgnoreComment is already disabled in pyproject.toml,
so the ignores are inert on platforms where the union narrowing collapses
differently and the errors don't fire (macOS arm64).

Tableau pipeline client.py library-export errors deferred to that PR's
owner; unrelated to this flake.
2026-04-30 07:35:06 +02:00
Harsh Vador
048a15e818
(playwright)ui: Fix session flakiness in Users Playwright spec (#27814)
* (playwright)ui: Fix session flakiness in Users Playwright spec

* address comment

* fix checkstyle
2026-04-30 09:26:33 +05:30
Aniket Katkar
7e7ed3b243
Chore(UI): Break down the custom property tests for columns in small pieces (#27818)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
* break down the custom property tests for columns in small pieces

* work on comment
2026-04-29 21:53:08 +05:30
Mohit Yadav
8b0f4a7b30
fix(search): resolve entity-specific aliases to canonical index names (#27813)
Closes #27761.

Background. When the UI started passing the alias `index=table` (instead
of the legacy `index=table_search_index`), every search for tables also
returned column docs. Root cause: ES alias expansion is bidirectional
through the parent/child graph in indexMapping.json. column_search_index
is created with `table` as one of its aliases (because tableColumn lists
"table" in parentAliases), so when ES sees alias `table` it expands it
to both `table_search_index` and `column_search_index`. The same shape
exists for every alias whose entities also act as a parent for some
other entity (testCase, testSuite, database, …).

Fix. Resolve entity-specific aliases at the API boundary into their
canonical `*_search_index` names so we send literal index names to ES,
bypassing alias expansion entirely. Compound aliases (`all`,
`dataAsset`) have no canonical index — they pass through unchanged so
ES expands them natively, preserving the "everything under the
data-asset umbrella" use case the UI's MyData / CuratedAssets / search-
bar widgets rely on.

The change is one method, `SearchRepository.getIndexOrAliasName(String)`:

  * entity-specific alias (`"table"`)         → `"<cluster>_table_search_index"`
  * compound alias (`"dataAsset"`, `"all"`)   → `"<cluster>_dataAsset"` (passes through)
  * canonical name (`"table_search_index"`)   → `"<cluster>_table_search_index"` (legacy callers)
  * already cluster-prefixed                  → returned unchanged (idempotent)
  * empty token from `"table,"` / `","`       → dropped, with all-empty input preserved

All four search/export/preview/NLQ resource paths already call this
method; `searchByField`, `aggregate`, and `getEntityTypeCounts` already
call it inside the ES/OS managers. So the fix takes effect across every
endpoint that accepts an `index` parameter without changing the public
API surface — no new query params, no schema changes, no signature
churn.

No caller passes an entity-specific alias and expects child entity types
back: UI sites with `SearchIndex.TABLE`/`TOPIC`/etc. all want only that
type (asset-type filter chips, advanced-search builders, lineage
selection, alert rule scoping). UI sites that DO want mixed entity
types use `SearchIndex.ALL` or `SearchIndex.DATA_ASSET`, which are
compound aliases that this change leaves unchanged. Internal Java
callers (RBAC, propagation, DataInsightSystemChartRepository) pass
entity-specific aliases for entity-specific operations — no leakage
expected there either.

Tests pin: entity-alias → canonical resolution; compound-alias passes
through; idempotent prefix; comma-separated input; empty-token
handling; existing canonical-name behavior unchanged.
2026-04-29 17:04:10 +02:00
Satender K
6adbe28820
Fixes <2370>: made required changes to accommodate tempLineageTable in the Lineage grapgh Tab (#27709)
* added necessary changes to accomodate tempLineageTables nodes

* updated code as per comments from Gitar

---------

Co-authored-by: Satender <sommy@Satenders-MacBook-Pro.local>
2026-04-29 15:03:11 +00:00
Sid
7e33fd3b3c
test(playwright): mark Data Products suite as slow (#27805)
Triples the timeout for the Data Products E2E suite to reduce flakiness
on the longer-running tests (asset management, pagination with 30
fixtures, etc.).

Co-authored-by: Siddhant <siddhant@MacBook-Pro-621.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 12:36:00 +00:00
Sid
440b24c44f
fix(ui): restore cover image preview in COVER_IMAGE_UPLOAD field (#27790)
* fix(ui): restore cover image preview in COVER_IMAGE_UPLOAD field

The AddDomainForm refactor (#26951) switched to the core-components
COVER_IMAGE_UPLOAD field, which only emitted a FileTrigger button and
filename hint — losing the image preview, replace, and remove
affordances that the legacy MUICoverImageUpload provided.

Add a CoverImageUploadField in core-components that renders the
preview (blob URL for File, raw url for backend strings), with hover
Replace and Remove controls. Expose a renderPreview slot so consumers
that need richer UX (e.g. drag-to-reposition) can override the default
preview without further core changes. Authenticated URL resolution
stays consumer-side.

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

* feat(ui): port UntitledUI FileUploadDropZone, add reposition + dimension validation

Add a `FileUploadDropZone` component to core-components, ported from
UntitledUI's open-source React components — gives us their official
dropzone visuals (FeaturedIcon + "Click to upload" / "or drag and
drop" + format hint, plus drag-and-drop, accept-type filtering, and
size limit handling).

Wire it into `CoverImageUploadField` as the empty state, and expand
the field to restore the missing reposition flow and dimension/size
validation that the legacy MUICoverImageUpload handled:

- Drag-to-reposition (mouse, touch, keyboard) with Save / Cancel /
  Reset Position controls. Repositionable detection uses the image's
  scaled height vs. configurable previewHeight.
- Size validation via the underlying FileUploadDropZone (maxSize in
  bytes, derived from maxSizeMB) with onSizeLimitExceed → consumer
  toast.
- Dimension validation in the wrapper using natural width/height,
  with onValidationError callback for the consumer toast.
- New props: maxSizeMB, maxDimensions, validationMessages,
  onValidationError, repositionable, coverImageLabels, previewHeight.
  All threaded through FieldPropsMap.

`AddDomainForm` now passes the 5MB / 800x400 limits, i18n strings for
all labels and errors, and shows validation toasts via notistack.

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

* fix(ui): cover image — pre-measure dims, reset position on replace, blob URL useEffect

Three fixes to CoverImageUploadField; the FileUploadDropZone stays as
the pristine UntitledUI port.

- Pre-measure image dimensions inside acceptFile via a measureImage
  helper instead of the prior validate-only pass. The natural width
  and height are written into state alongside the form value, so the
  Reposition button reads the new image's dims on the same render the
  preview swaps in — no flicker through stale state.
- Drop the carry-over of the previous file's percentage offset when
  accepting a replacement; new files start at default position.
- Switch previewSrc from useMemo to useState + useEffect so the
  URL.createObjectURL side effect runs in commit phase, not render.
  Discarded concurrent renders no longer leak unrevoked blob URLs.

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

* fix(ui): cover image — re-enable Reposition on first upload

isImageRepositionable was a useMemo whose recompute keyed off the
image's natural dimensions. On the very first upload, those dimensions
land before the preview <div> mounts, so getScaledImageHeight reads a
null containerRef and returns 0. The button then stayed disabled
because nothing later triggered a recompute.

Track the container width in state via a callback ref. The mount
itself now schedules a re-render; getScaledImageHeight reads from
state instead of poking offsetWidth mid-render. Replace already worked
because the ref was attached by the time dimensions changed.

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

* fix(ui): cover image — don't recreate blob URL on position-only changes

The previewSrc useEffect depended on the whole value object. Saving a
reposition mints a new value with the same File but a different
position, so the effect was revoking and re-minting a blob URL for
the same File on every save — wasted work plus a brief <img> flicker.

Depend on stable file/url primitives extracted from value; position
changes leave both untouched, so the effect no longer runs.

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

* chore(ui): apply organize-imports to AddDomainForm

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

* chore(ui): apply core-components eslint + prettier fixes

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

---------

Co-authored-by: Siddhant <siddhant@MacBook-Pro-621.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 17:45:43 +05:30
Anujkumar Yadav
b68e7445cf
test: fix CSV import Playwright test timeout by awaiting WebSocket completion before grid render (#27806) 2026-04-29 11:18:25 +00:00
Anujkumar Yadav
fd466b804b
test: rewrite TaskWorkflowApproval to fix CI race condition (#27810)
* test: rewrite TaskWorkflowApproval to fix CI race condition

* fix lint issue

* nit

* fix lint issue
2026-04-29 11:10:46 +00:00
Sid
2cd827dd70
fix(playwright): stabilize TagSuggestion select + scope tag-chip assertions (#27811)
* fix(playwright): stabilize TagSuggestion select + scope tag-chip assertions

- selectTagInTagSuggestion now resolves the listbox via the combobox's
  aria-controls attribute instead of grabbing the first [role="listbox"]
  on the page, which races with stale dropdowns left open by previous
  combobox interactions and caused click() to hang until test timeout.
- Scope post-select assertions to tags-container so they no longer match
  the still-rendered dropdown option in addition to the chip, which was
  triggering strict-mode violations.
- DataProducts spec now dismisses the domain dropdown before opening the
  tags dropdown so the two listboxes don't overlap.

* fix(playwright): simplify selectTagInTagSuggestion to anchor on tag-option testId

Drop the listbox/aria-controls indirection in favour of the unique
tag-option-${fqn} testId. click()'s actionability check covers what the
explicit visibility/scroll waits were doing, and tag option testIds are
unique across comboboxes so listbox scoping wasn't pulling its weight.
2026-04-29 11:04:54 +00:00
harshsoni2024
5b935df7b9
Fix: datalake parse array type nested strcuture fields inside json file (#27798) 2026-04-29 11:01:28 +00:00
Anujkumar Yadav
2c262b9abe
Added filter data in relation tab for terms (#27803)
Some checks are pending
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Waiting to run
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Blocked by required conditions
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Waiting to run
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Blocked by required conditions
Java Checkstyle / java-checkstyle (push) Waiting to run
Maven Collate Tests / maven-collate-ci (push) Waiting to run
OpenMetadata Service Unit Tests / Detect Changes (push) Waiting to run
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (mysql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (postgresql) (push) Blocked by required conditions
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Blocked by required conditions
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Blocked by required conditions
Publish Package to Maven Central Repository / publish-maven-packages (push) Waiting to run
2026-04-29 07:36:52 +00:00
Harish Kotra
169cc867b9
Fixes #27549: Respect from/size pagination in /search/fieldQuery (#27590)
* Add scheduled workflow to sync fork main with upstream

* Remove fork upstream sync workflow

* Fix fieldQuery pagination by propagating from and size

* Avoid truncating ingestion pipelines in DataInsights lookup

---------

Co-authored-by: Mohit Yadav <105265192+mohityadav766@users.noreply.github.com>
Co-authored-by: Pere Miquel Brull <peremiquelbrull@gmail.com>
2026-04-29 08:28:34 +02:00
shrabantipaul-collate
0fdb82d611
fix nls icon for safari (#27783)
Co-authored-by: Shrabanti Paul <shrabantipaul@Shrabantis-MacBook-Pro.local>
2026-04-29 10:45:50 +05:30
miriann-uu
7b01731754
GEN-5164: Add cherry pick matrix (#27674) 2026-04-29 10:39:31 +05:30