Skip to content

RDF, cleanup relations and remove unnecessary bindings, add distributed mode for RDF reindex#26902

Merged
harshach merged 68 commits intomainfrom
rdf_v2
Apr 14, 2026
Merged

RDF, cleanup relations and remove unnecessary bindings, add distributed mode for RDF reindex#26902
harshach merged 68 commits intomainfrom
rdf_v2

Conversation

@harshach
Copy link
Copy Markdown
Collaborator

@harshach harshach commented Apr 1, 2026

Describe your changes:

Fixes

I worked on ... because ...

Type of change:

  • Bug fix
  • Improvement
  • New feature
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: I updated the migration scripts or explained why it is not needed.

Summary by Gitar

  • RDF Resource improvements:
    • Added graph depth clamping (min 1, max 5) in exploreEntityGraph and exportEntityGraph methods
    • New clampGraphDepth utility method to constrain user-provided depth parameters
  • Distributed RDF Index fixes:
    • Fixed completedAt timestamp assignment to always set current time for terminal job states
  • Test coverage:
    • Added tests for depth clamping in entity graph operations
    • Added test for completedAt initialization in DistributedRdfIndexCoordinator

This will update automatically on new commits.

@harshach harshach requested review from a team, akash-jain-10 and tutte as code owners April 1, 2026 03:03
Copilot AI review requested due to automatic review settings April 1, 2026 03:03
@github-actions github-actions bot added backend safe to test Add this label to run secure Github workflows on PRs labels Apr 1, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

✅ TypeScript Types Auto-Updated

The generated TypeScript types have been automatically updated based on JSON schema changes in this PR.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the RDF knowledge graph/reindexing feature set by adding UI/schema support for RDF indexing configuration (including distributed mode), improving runtime behavior around app pages, and wiring RDF job status updates through WebSockets.

Changes:

  • Added a new RDF indexing application schema and made application-run configuration UI resilient to missing schemas.
  • Extended RDF graph explore API types/params to support entity/relationship filtering and filter options in responses.
  • Added an RDF WebSocket broadcast channel and subscribed the App Runs History UI to RDF job status updates; optimized Airflow status fetching based on route.

Reviewed changes

Copilot reviewed 42 out of 43 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
openmetadata-ui/src/main/resources/ui/src/utils/ApplicationSchemas/RdfIndexApp.json New UI schema for RDF indexing configuration (incl. distributed options).
openmetadata-ui/src/main/resources/ui/src/rest/rdfAPI.ts Adds typed graph filter params/options and updates entity-graph API signature.
openmetadata-ui/src/main/resources/ui/src/components/KnowledgeGraph/KnowledgeGraph.interface.ts Adds filter option types to KnowledgeGraph data model.
openmetadata-ui/src/main/resources/ui/src/context/AirflowStatusProvider/AirflowStatusProvider.tsx Skips Airflow status fetch on routes where it’s not needed.
openmetadata-ui/src/main/resources/ui/src/context/AirflowStatusProvider/AirflowStatusProvider.test.tsx Adds route-aware tests via MemoryRouter and validates skipping behavior.
openmetadata-ui/src/main/resources/ui/src/constants/constants.ts Adds RDF_INDEX_JOB_BROADCAST_CHANNEL socket event constant.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppSchedule/AppScheduleProps.interface.ts Makes jsonSchema optional to support apps without a schema.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.interface.ts Makes jsonSchema optional to support schema-less runs/history UI.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.component.tsx Disables config UI when schema missing and subscribes to RDF job WebSocket updates.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppRunsHistory/AppRunsHistory.test.tsx Adds WebSocket mocking, schema-unavailable test, and RDF channel subscription test.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppDetails/AppDetails.component.tsx Handles missing schema imports by clearing schema and showing a toast.
openmetadata-ui/src/main/resources/ui/src/components/Settings/Applications/AppDetails/ApplicationsClassBase.test.ts Verifies RDF schema import works and includes new distributed fields.
openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexCoordinator.java Implements distributed RDF indexing coordinator flow (partition claim/aggregate refresh).
openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java Registers the distributed RDF job participant at application startup.

Comment on lines +1136 to +1138
CollectionDAO collectionDAO = jdbi.onDemand(CollectionDAO.class);
RdfDistributedJobParticipant participant = new RdfDistributedJobParticipant(collectionDAO);
environment.lifecycle().manage(participant);
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The catch block logs only ex.getMessage() and drops the stack trace, which makes diagnosing startup failures in distributed RDF job participant registration difficult. Log the exception object as well (e.g., LOG.warn(..., ex)) or rethrow if registration is required for correctness.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot apply changes based on this feedback

Comment on lines +112 to +120
try {
const schema = await applicationsClassBase.importSchema(fqn);
setJsonSchema(schema);
} catch (_) {
setJsonSchema(undefined);
showErrorToast(
t('message.no-application-schema-found', { appName: fqn })
);
}
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The schema import error is swallowed (catch (_)) and always shows the generic "no schema" toast. If the dynamic import fails for other reasons (e.g., chunk load error), this message can be misleading and makes debugging harder. Consider capturing the error and either passing it to showErrorToast (with the fallback message) or at least logging it for diagnosis.

Copilot uses AI. Check for mistakes.
Comment on lines +82 to +88
]
},
"default": [
"all"
],
"uiFieldType": "treeSelect",
"uniqueItems": true
Copy link

Copilot AI Apr 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

entities.items.enum does not include the value "all", but entities.default is set to ["all"]. This makes the default invalid against the schema and can break form defaults/validation. Either add "all" to the enum or change the default to valid enum values.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 63%
63.88% (59795/93601) 43.64% (31322/71768) 46.73% (9414/20143)

Copilot AI review requested due to automatic review settings April 1, 2026 20:37
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 74 changed files in this pull request and generated 4 comments.

Comment on lines +1 to +6
package org.openmetadata.service.apps.bundles.rdf.distributed;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This new test file is missing the standard Apache 2.0 license header that other service test classes include. Please add the project license header block at the top to keep licensing checks and file headers consistent.

Copilot uses AI. Check for mistakes.
Comment on lines +51 to +57
public List<RdfIndexPartition> calculatePartitions(UUID jobId, Set<String> entityTypes) {
List<RdfIndexPartition> partitions = new ArrayList<>();
for (String entityType : entityTypes) {
partitions.addAll(calculatePartitionsForEntity(jobId, entityType));
}
return partitions;
}
Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RdfPartitionCalculator currently creates partitions without enforcing an upper bound on total partition count. Search-index partitioning enforces a MAX_TOTAL_PARTITIONS safety limit to avoid overwhelming the DB/job tables at extreme scale; consider adding a similar guard here (or otherwise bounding/streaming partition creation) to prevent creating an unbounded number of rdf_index_partition rows.

Copilot uses AI. Check for mistakes.
Comment on lines +499 to +501
return buffer.toString(StandardCharsets.UTF_8);
}

Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BufferedServletResponseWrapper tracks a configurable characterEncoding, but getCapturedBody() always decodes the buffer using UTF-8. If a handler sets a different encoding (or writes via getWriter() with a different encoding), the captured error body can be garbled in logs/exceptions. Decode using the wrapper’s current characterEncoding instead of hardcoding UTF-8.

Suggested change
return buffer.toString(StandardCharsets.UTF_8);
}
return buffer.toString(getCurrentCharset());
}
private Charset getCurrentCharset() {
return characterEncoding == null
? StandardCharsets.UTF_8
: Charset.forName(characterEncoding);
}

Copilot uses AI. Check for mistakes.
Comment on lines 19 to 24
isRunLoading: boolean;
isDeployLoading: boolean;
};
jsonSchema: RJSFSchema;
jsonSchema?: RJSFSchema;
onSave: (cron: string) => Promise<void>;
onDemandTrigger: () => Promise<void>;
Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now that jsonSchema is optional, please ensure downstream consumers properly react when it transitions from undefined → defined (schema import is async). For example, AppSchedule memoizes the AppRunsHistory element but doesn’t include jsonSchema in its useMemo dependency list, which can cause the config UI to stay disabled even after the schema loads.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 74 changed files in this pull request and generated 1 comment.

Comment on lines +5 to +14
$$section
### entities $(id="entities")

$$

$$section
### Recreate RDF Store $(id="recreateIndex")

Clear the RDF store before indexing.

Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The markdown doc’s entities section is currently empty (it opens/close the section without any descriptive text). Since this file is user-facing documentation for the app schema, please add a short description for what the entities field does (and how an empty selection behaves) so the rendered schema docs aren’t blank for this field.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 75 out of 76 changed files in this pull request and generated 2 comments.

Comment thread docker/development/docker-compose-fuseki.yml
Comment thread docs/rdf-local-development.md Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 94 out of 95 changed files in this pull request and generated no new comments.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 94 out of 95 changed files in this pull request and generated no new comments.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 94 out of 95 changed files in this pull request and generated 1 comment.

}

public RdfPartitionCalculator(int partitionSize) {
this.partitionSize = Math.clamp(partitionSize, MIN_PARTITION_SIZE, MAX_PARTITION_SIZE);
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Math.clamp(...) is not a valid JDK 21 API, so this will not compile. Replace with explicit min/max clamping (or a local helper) to bound partitionSize between MIN_PARTITION_SIZE and MAX_PARTITION_SIZE.

Suggested change
this.partitionSize = Math.clamp(partitionSize, MIN_PARTITION_SIZE, MAX_PARTITION_SIZE);
this.partitionSize = Math.max(MIN_PARTITION_SIZE, Math.min(partitionSize, MAX_PARTITION_SIZE));

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 98 out of 99 changed files in this pull request and generated 2 comments.

Comment on lines +35 to 36
root: 'tw:focus-visible:outline-2 tw:focus-visible:outline-offset-2 tw:relative tw:overflow-hidden tw:rounded-xl tw:transition tw:duration-100',
},
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cardStyles.common.root dropped tw:outline-focus-ring, while other interactive components in ui-core-components consistently include it with focus-visible:outline-*. Without it, the Card focus indicator may become inconsistent or lose the intended theme styling. Consider adding tw:outline-focus-ring back to cardStyles.common.root (or ensuring an equivalent focus-ring utility is applied).

Copilot uses AI. Check for mistakes.
Comment on lines 38 to 69
default: {
root: 'tw:ring-1 tw:ring-inset tw:ring-secondary tw:bg-primary',
root: 'tw:border-1 tw:border-secondary tw:bg-primary',
},
elevated: {
root: 'tw:ring-1 tw:ring-inset tw:ring-secondary tw:bg-primary tw:shadow-md',
root: 'tw:border-1 tw:border-secondary tw:bg-primary tw:shadow-md',
},
outlined: { root: 'tw:ring-2 tw:ring-inset tw:ring-primary tw:bg-primary' },
outlined: { root: 'tw:border-2 tw:border-primary tw:bg-primary' },
ghost: { root: 'tw:bg-transparent' },
},
colors: {
default: { root: '' },
brand: {
root: 'tw:bg-utility-brand-50 tw:ring-1 tw:ring-inset tw:ring-utility-brand-200',
root: 'tw:bg-utility-brand-50 tw:border-1 tw:border-utility-brand-200',
},
error: {
root: 'tw:bg-utility-error-50 tw:ring-1 tw:ring-inset tw:ring-utility-error-200',
root: 'tw:bg-utility-error-50 tw:border-1 tw:border-utility-error-200',
},
warning: {
root: 'tw:bg-utility-warning-50 tw:ring-1 tw:ring-inset tw:ring-utility-warning-200',
root: 'tw:bg-utility-warning-50 tw:border-1 tw:border-utility-warning-200',
},
success: {
root: 'tw:bg-utility-success-50 tw:ring-1 tw:ring-inset tw:ring-utility-success-200',
root: 'tw:bg-utility-success-50 tw:border-1 tw:border-utility-success-200',
},
},
interactive: { root: 'tw:cursor-pointer' },
interactiveVariants: {
default: { root: 'tw:hover:bg-primary_hover tw:hover:ring-primary' },
default: { root: 'tw:hover:bg-primary_hover tw:hover:border-primary' },
elevated: { root: 'tw:hover:bg-primary_hover tw:hover:shadow-lg' },
outlined: { root: 'tw:hover:bg-secondary tw:hover:ring-primary' },
outlined: { root: 'tw:hover:bg-secondary tw:hover:border-primary' },
ghost: {
root: 'tw:hover:bg-secondary tw:hover:ring-1 tw:hover:ring-inset tw:hover:ring-secondary',
root: 'tw:hover:bg-secondary tw:hover:border-1 tw:hover:border-inset tw:hover:border-secondary',
},
Copy link

Copilot AI Apr 14, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The card styles introduce Tailwind classes like tw:border-1 and tw:hover:border-inset. border-inset is not a standard Tailwind utility (Tailwind supports ring-inset, but not border-inset), and border-1 is typically border/border-[1px]. If these utilities aren't defined, the card border/hover styles will silently not apply. Consider switching to standard utilities (e.g., tw:border or tw:border-[1px], and remove/replace tw:hover:border-inset).

Copilot uses AI. Check for mistakes.
outlined: { root: 'tw:hover:bg-secondary tw:hover:border-primary' },
ghost: {
root: 'tw:hover:bg-secondary tw:hover:ring-1 tw:hover:ring-inset tw:hover:ring-secondary',
root: 'tw:hover:bg-secondary tw:hover:border-1 tw:hover:border-inset tw:hover:border-secondary',
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Bug: Mechanical ring→border replace produces invalid border-inset class

The ghost card hover style was changed from tw:hover:ring-inset to tw:hover:border-inset. In Tailwind CSS, ring-inset is a valid utility that renders box-shadow rings inward, but border-inset maps to border-style: inset which produces a 3D beveled border — not the intended visual effect. This appears to be a mechanical find-and-replace error during the ring→border migration.

Since borders don't need an "inset" modifier (they are always part of the box model), the tw:hover:border-inset class should simply be removed.

Suggested fix:

ghost: {
  root: 'tw:hover:bg-secondary tw:hover:border-1 tw:hover:border-secondary',
},

Was this helpful? React with 👍 / 👎 | Reply gitar fix to apply this suggestion

}
};

// The main effect that initializes the graph after data is loaded and whenever
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Quality: Truncated comment on useEffect — sentence ends mid-thought

The comment on line 304 reads: // The main effect that initializes the graph after data is loaded and whenever — the sentence is incomplete. This was likely cut off during editing. Please finish the thought (e.g., "...and whenever the layout, depth, or filters change.").

Was this helpful? React with 👍 / 👎 | Reply gitar fix to apply this suggestion

@sonarqubecloud
Copy link
Copy Markdown

@gitar-bot
Copy link
Copy Markdown

gitar-bot bot commented Apr 14, 2026

Code Review ⚠️ Changes requested 30 resolved / 32 findings

Refactors RDF indexing and cleanup while adding distributed mode, addressing 30 concurrency, security, and configuration issues. Action is required to fix the invalid border-inset class and complete the truncated comment on line 304.

⚠️ Bug: Mechanical ring→border replace produces invalid border-inset class

📄 openmetadata-ui-core-components/src/main/resources/ui/src/components/base/card/card.tsx:68

The ghost card hover style was changed from tw:hover:ring-inset to tw:hover:border-inset. In Tailwind CSS, ring-inset is a valid utility that renders box-shadow rings inward, but border-inset maps to border-style: inset which produces a 3D beveled border — not the intended visual effect. This appears to be a mechanical find-and-replace error during the ring→border migration.

Since borders don't need an "inset" modifier (they are always part of the box model), the tw:hover:border-inset class should simply be removed.

Suggested fix
ghost: {
  root: 'tw:hover:bg-secondary tw:hover:border-1 tw:hover:border-secondary',
},
💡 Quality: Truncated comment on useEffect — sentence ends mid-thought

📄 openmetadata-ui/src/main/resources/ui/src/components/KnowledgeGraph/KnowledgeGraph.tsx:304

The comment on line 304 reads: // The main effect that initializes the graph after data is loaded and whenever — the sentence is incomplete. This was likely cut off during editing. Please finish the thought (e.g., "...and whenever the layout, depth, or filters change.").

✅ 30 resolved
Bug: Distributed worker loop can spin indefinitely with no backoff

📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:186-195
In workerLoop() (line 177-199), when claimNextPartition() returns null (no claimable partitions), the worker sleeps for only 1 second before retrying. There's no check for whether all partitions are actually completed — only whether the job is terminal. If partition status updates are delayed (e.g., network latency to DB), multiple workers can busy-loop with 1-second intervals, repeatedly querying the database. Consider adding an exponential backoff or checking countPendingPartitions() to determine if work remains.

Security: SPARQL injection via unsanitized entityType in query construction

📄 openmetadata-service/src/main/java/org/openmetadata/service/rdf/RdfRepository.java:771 📄 openmetadata-service/src/main/java/org/openmetadata/service/rdf/RdfRepository.java:1524-1538 📄 openmetadata-service/src/main/java/org/openmetadata/service/resources/rdf/RdfResource.java:241-255
The entityType query parameter from the REST API is concatenated directly into SPARQL query strings without sanitization or validation. In RdfRepository.getEntityGraph(), the entityType is used to construct a URI that is embedded into SPARQL via buildEntityGraphBatchQuery(). Similarly, buildLineageQuery() directly interpolates entityType into SPARQL strings. While these endpoints require admin authorization, a compromised or malicious admin account could inject arbitrary SPARQL, potentially reading or modifying the entire RDF store.

Suggested fix: Validate entityType against a whitelist of known entity types (e.g., from Entity.getEntityList()) before using it in query construction. Additionally, ensure all URI components are properly escaped/encoded.

Bug: activeWorkers list has unsynchronized concurrent access

📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:34 📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:36 📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:129-131 📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:165-166
activeWorkers is declared as a plain ArrayList (line 34) but is written to in runWorkers() (line 165) and iterated in stop() (line 129). Since stop() can be called from any thread while runWorkers() is still adding workers, this is a classic concurrent modification race condition that can throw ConcurrentModificationException or silently skip workers during shutdown.

Additionally, currentJob (line 36) is accessed from multiple threads (worker threads via getJobWithFreshStats at line 179, main thread) without synchronization or volatile declaration, risking torn reads.

Bug: COORDINATED_JOBS not cleaned up on createJob/execute errors

📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:85-97 📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/rdf/distributed/DistributedRdfIndexExecutor.java:201-215
In execute() (line 91), the job ID is added to the static COORDINATED_JOBS set. However, if an exception occurs during startCoordinatorThreads() or runWorkers() before finalizeCoordinatorJob() is reached, the job ID is never removed from COORDINATED_JOBS. This permanently prevents participants from joining this job ID (line 84 in RdfDistributedJobParticipant), effectively leaking the entry for the lifetime of the JVM.

Bug: FailedTestCaseSampleData uses rowKey="name" but rows lack a name field

The Table component uses rowKey="name" but the data rows are constructed dynamically from column names (line 146-153). Unless one of the table's columns happens to be called "name", every row will have an undefined key, causing React duplicate-key warnings and potential rendering bugs when rows are added/removed.

...and 25 more resolved from earlier reviews

🤖 Prompt for agents
Code Review: Refactors RDF indexing and cleanup while adding distributed mode, addressing 30 concurrency, security, and configuration issues. Action is required to fix the invalid `border-inset` class and complete the truncated comment on line 304.

1. ⚠️ Bug: Mechanical ring→border replace produces invalid `border-inset` class
   Files: openmetadata-ui-core-components/src/main/resources/ui/src/components/base/card/card.tsx:68

   The ghost card hover style was changed from `tw:hover:ring-inset` to `tw:hover:border-inset`. In Tailwind CSS, `ring-inset` is a valid utility that renders box-shadow rings inward, but `border-inset` maps to `border-style: inset` which produces a 3D beveled border — not the intended visual effect. This appears to be a mechanical find-and-replace error during the ring→border migration.
   
   Since borders don't need an "inset" modifier (they are always part of the box model), the `tw:hover:border-inset` class should simply be removed.

   Suggested fix:
   ghost: {
     root: 'tw:hover:bg-secondary tw:hover:border-1 tw:hover:border-secondary',
   },

2. 💡 Quality: Truncated comment on useEffect — sentence ends mid-thought
   Files: openmetadata-ui/src/main/resources/ui/src/components/KnowledgeGraph/KnowledgeGraph.tsx:304

   The comment on line 304 reads: `// The main effect that initializes the graph after data is loaded and whenever` — the sentence is incomplete. This was likely cut off during editing. Please finish the thought (e.g., "...and whenever the layout, depth, or filters change.").

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@sonarqubecloud
Copy link
Copy Markdown

@github-actions
Copy link
Copy Markdown
Contributor

🔴 Playwright Results — 1 failure(s), 45 flaky

✅ 3610 passed · ❌ 1 failed · 🟡 45 flaky · ⏭️ 84 skipped

Shard Passed Failed Flaky Skipped
🔴 Shard 1 473 1 6 4
🟡 Shard 2 640 0 5 7
🟡 Shard 3 643 0 10 1
🟡 Shard 4 617 0 9 22
🟡 Shard 5 609 0 3 42
🟡 Shard 6 628 0 12 8

Genuine Failures (failed on all attempts)

Pages/SearchIndexApplication.spec.ts › Search Index Application (shard 1)
Error: �[2mexpect(�[22m�[31mreceived�[39m�[2m).�[22mtoEqual�[2m(�[22m�[32mexpected�[39m�[2m) // deep equality�[22m

Expected: �[32mStringMatching /success|activeError/g�[39m
Received: �[31m"failed"�[39m
🟡 45 flaky test(s) (passed on retry)
  • Features/DataAssetRulesDisabled.spec.ts › Verify the ApiEndpoint entity item action after rules disabled (shard 1, 1 retry)
  • Flow/Tour.spec.ts › Tour should work from welcome screen (shard 1, 1 retry)
  • Flow/Tour.spec.ts › Tour should work from URL directly (shard 1, 1 retry)
  • Pages/AuditLogs.spec.ts › should deny export access for non-admin users (shard 1, 1 retry)
  • Pages/Customproperties-part1.spec.ts › Sql Query (shard 1, 1 retry)
  • Pages/UserCreationWithPersona.spec.ts › Create user with persona and verify on profile (shard 1, 1 retry)
  • Features/BulkEditEntity.spec.ts › Glossary (shard 2, 1 retry)
  • Features/BulkImportWithDotInName.spec.ts › Bulk edit existing entity with dot in service name (shard 2, 1 retry)
  • Features/ChangeSummaryBadge.spec.ts › AI badge should NOT appear for manually-edited descriptions (shard 2, 1 retry)
  • Features/DataQuality/TestLibrary.spec.ts › should cancel form and close drawer (shard 2, 1 retry)
  • Features/DataQuality/TestLibrary.spec.ts › should display test platform badges correctly (shard 2, 1 retry)
  • Features/Permission.spec.ts › Permissions (shard 3, 1 retry)
  • Features/Permissions/EntityPermissions.spec.ts › Metric deny common operations permissions (shard 3, 1 retry)
  • Features/Permissions/GlossaryPermissions.spec.ts › Team-based permissions work correctly (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 2 retries)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 2 retries)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RTL.spec.ts › Verify Following widget functionality (shard 3, 1 retry)
  • Flow/PersonaDeletionUserProfile.spec.ts › User profile loads correctly before and after persona deletion (shard 3, 1 retry)
  • Pages/Customproperties-part2.spec.ts › entityReferenceList shows item count, scrollable list, no expand toggle (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for Dashboard (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for DashboardDataModel (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for ApiEndpoint (shard 4, 1 retry)
  • Pages/DataContractsSemanticRules.spec.ts › Validate Description Rule Is_Not_Set (shard 4, 1 retry)
  • Pages/DomainAdvanced.spec.ts › Filter assets by domain from explore page (shard 4, 1 retry)
  • Pages/Domains.spec.ts › Multiple consecutive domain renames preserve all associations (shard 4, 1 retry)
  • Pages/DomainUIInteractions.spec.ts › Add expert to domain via UI (shard 4, 1 retry)
  • Pages/Entity.spec.ts › Glossary Term Add, Update and Remove (shard 4, 1 retry)
  • ... and 15 more

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend safe to test Add this label to run secure Github workflows on PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants