Skip to content

fix(search): treat stale parentOf as warning during time-series reindex (#27417)#27800

Open
mohityadav766 wants to merge 18 commits intomainfrom
fix-testcaseresolutionstatus
Open

fix(search): treat stale parentOf as warning during time-series reindex (#27417)#27800
mohityadav766 wants to merge 18 commits intomainfrom
fix-testcaseresolutionstatus

Conversation

@mohityadav766
Copy link
Copy Markdown
Member

@mohityadav766 mohityadav766 commented Apr 28, 2026

Summary

  • Fixes Search Indexing Exception: testCaseResolutionStatus missing parentOf relationship to testCase #27417 — search-indexing failures when processing testCaseResolutionStatus entities whose parentOf entity_relationship row to a testCase is missing.
  • During time-series reindex, EntityRepository.ensureSingleRelationship raises "... does not have expected relationship parentOf to/from entity type testCase" (via CatalogExceptionMessage.entityRelationshipNotFound). PaginatedEntityTimeSeriesSource was returning these as failures, killing the batch. The orphans themselves originate from the 1.4.0 migrateTestCaseResolution migration (MigrationUtil.java:80–124), which silently skips rows with a null testCaseReference or that hit any per-row exception — leaving the time-series row in place with no entity_relationship PARENT_OF row.
  • Mirrors the warning-vs-failure split already used by PaginatedEntitiesSource and broadens it to also catch the relationship-not-found message.

Changes

  • ReindexingUtil: extract shared isEntityNotFoundError matcher (now matches "expected relationship" in addition to "not found", "instance for", "does not exist", "entitynotfoundexception"); add partitionErrors helper.
  • PaginatedEntitiesSource: replace local matcher copy with the shared helper. Same behavior for entities, plus the broader matcher.
  • PaginatedEntityTimeSeriesSource: apply the warning-vs-failure split to read, readWithCursor, and readNextKeyset. Adds filterStaleRelationshipErrors, sets result.setWarningsCount(...) (already consumed by SearchIndexExecutor and PartitionWorker), and adds a 3-arg updateStats(success, failed, warnings) overload to record warnings on the source's StepStats.

Why this is safe

  • Stale parentOf rows are classified as warnings, never silently dropped — they show up in warningRecords and in DEBUG logs, so they remain observable.
  • Real reader failures (JSON parse errors, DB issues, anything not matching the matcher) still increment failedRecords and still set lastFailedCursor so the failure cursor is preserved.
  • No public API change. No schema change. warningRecords already exists in eventPublisherJob.json and is already populated by PaginatedEntitiesSource.

Follow-up not in this PR

  • Worth a separate one-shot cleanup migration that deletes orphaned testCaseResolutionStatus rows (those whose entity_relationship parentOf row is missing AND whose JSON testCaseReference is null) to actually shrink the orphan set in production. This PR just stops them from failing reindex.

Test plan

  • ReindexingUtilStaleRelationshipTest — 5 tests covering matcher + partitioning, including the exact ensureSingleRelationship message format
  • PaginatedEntityTimeSeriesSourceStaleRelationshipTest — 4 tests covering readNext and readWithCursor with stale-only, mixed (stale + real), and exception cases; asserts result.getWarningsCount(), result.getErrors(), and source StepStats
  • Existing EntityReaderLifecycleTest (8), SearchIndexExecutorControlFlowTest (60), PartitionWorkerTest (30) all still pass
  • mvn spotless:apply clean
  • Verify on a cluster with known orphans: trigger SearchIndexingApplication for testCaseResolutionStatus, confirm warningRecords > 0, failedRecords == 0, and run completes

🤖 Generated with Claude Code


Summary by Gitar

  • Search Indexing Resilience:
    • Cap reader error logs in PaginatedEntityTimeSeriesSource to MAX_ERROR_DETAILS_LOGGED to prevent log flooding.
    • Normalize result.getErrors() in filterStaleRelationshipErrors to ensure non-null list for downstream processing.
  • Reindexing Stability:
    • Update ReindexingUtil.isStaleReferenceError to use Locale.ROOT for case-insensitive string matching to ensure locale-stability.
  • Job Timing Reliability:
    • Improve OmAppJobListener.fillTerminalTimings to independently compute executionTime if endTime is already present.

This will update automatically on new commits.

…ex (#27417)

Time-series records (testCaseResolutionStatus, testCaseResult, ...) whose
parentOf entity_relationship row is missing surface as
"does not have expected relationship parentOf to/from entity type ..."
from EntityRepository.ensureSingleRelationship and were failing the entire
reindex batch. Mirror the warning-vs-failure split already used for
EntityInterface sources: extract isEntityNotFoundError into ReindexingUtil,
broaden it to match the relationship-not-found message, and apply the same
partitioning to PaginatedEntityTimeSeriesSource.read/readWithCursor/
readNextKeyset so orphaned rows are counted as warnings via
result.getWarningsCount() instead of failing the job.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings April 28, 2026 17:46
@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Apr 28, 2026
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

Fixes time-series reindex batches failing on orphaned testCaseResolutionStatus records by reclassifying “stale relationship / missing entity” reader errors as warnings (instead of fatal failures), aligning behavior with existing entity reindexing.

Changes:

  • Centralizes stale/missing-entity error matching in ReindexingUtil.isEntityNotFoundError and adds partitionErrors helper.
  • Updates PaginatedEntityTimeSeriesSource to filter stale relationship errors into warnings (setting warningsCount) for offset and keyset reads.
  • Updates PaginatedEntitiesSource to use the shared matcher and adds focused regression tests for both the matcher and time-series reader behavior.

Reviewed changes

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

Show a summary per file
File Description
openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/ReindexingUtil.java Adds shared stale/missing-entity matcher and error partitioning helper for reindex readers.
openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/PaginatedEntitiesSource.java Reuses shared matcher (removes local duplicate) to keep stale relationship errors as warnings.
openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/PaginatedEntityTimeSeriesSource.java Filters stale relationship errors into warnings for time-series reads and tracks warning counts.
openmetadata-service/src/test/java/org/openmetadata/service/workflows/searchIndex/ReindexingUtilStaleRelationshipTest.java Adds unit tests covering matcher behavior and partitioning.
openmetadata-service/src/test/java/org/openmetadata/service/workflows/searchIndex/PaginatedEntityTimeSeriesSourceStaleRelationshipTest.java Adds tests ensuring stale relationship errors become warnings (not failures) for time-series reads.

Comment on lines +87 to +96
public static List<EntityError> partitionErrors(
List<EntityError> errors, List<EntityError> warningsOut) {
if (CommonUtil.nullOrEmpty(errors)) {
return new ArrayList<>();
}
List<EntityError> realErrors = new ArrayList<>(errors.size());
for (EntityError error : errors) {
if (isEntityNotFoundError(error)) {
warningsOut.add(error);
} else {
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

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

partitionErrors assumes warningsOut is non-null and mutable; passing null (or an unmodifiable list) will throw at warningsOut.add(error). Since this is a public utility, consider either validating warningsOut (e.g., initialize when null / throw an explicit IllegalArgumentException) or documenting/annotating it as non-null to avoid surprising NPEs at runtime.

Copilot uses AI. Check for mistakes.
Address PR #27800 review:
- Drop bare "not found" from isEntityNotFoundError; add "entity not found"
  so we still match EntityNotFoundException's "Entity not found:" form but
  no longer misclassify "Column 'foo' not found in result set" or
  "SSL certificate not found" as warnings.
- Call updateStats(success, failed, warnings) in readWithCursor and
  readNextKeyset so the source's StepStats.warningRecords reflects warnings
  for cursor- and keyset-based reads (was already correct in read()).
- partitionErrors: requireNonNull(warningsOut) and document the contract.
- Tests: cover the new bare-"not found" exclusion, the "Entity not found:"
  inclusion, the readWithCursor stats propagation, and the null-warningsOut
  guard.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mohityadav766
Copy link
Copy Markdown
Member Author

Thanks for the review — addressed all three findings in 91bbdc1:

1. readWithCursor / readNextKeyset not updating warning stats (gitar) — fixed. Both now call updateStats(success, failed, warnings) after filterStaleRelationshipErrors, so source-level StepStats.warningRecords reflects warnings for offset-cursor and keyset paths (was previously only correct in read()).

2. Overly broad "not found" matcher (gitar) — fixed. Dropped bare "not found" and added "entity not found", so we still catch EntityNotFoundException's "Entity not found:" form (e.g. EntityRepository.java:9102) and the canonical "%s instance for %s not found" (via the existing "instance for" marker), but "Column 'status' not found in result set" and "SSL certificate not found" are now correctly classified as failures. Audited every not found message in CatalogExceptionMessage to confirm we don't lose legitimate coverage.

3. partitionErrors null-safety (Copilot) — fixed. Objects.requireNonNull(warningsOut) plus a Javadoc note that both lists must be mutable.

Tests updated to cover all three: the new bare-"not found" exclusion, the "Entity not found:" inclusion, readWithCursor stats propagation, and the null-warningsOut guard. Existing tests (EntityReaderLifecycleTest, SearchIndexExecutorControlFlowTest, PartitionWorkerTest — 98 total) still pass.

pmbrull
pmbrull previously approved these changes Apr 28, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 28, 2026

🟡 Playwright Results — all passed (8 flaky)

✅ 3990 passed · ❌ 0 failed · 🟡 8 flaky · ⏭️ 86 skipped

Shard Passed Failed Flaky Skipped
✅ Shard 1 299 0 0 4
🟡 Shard 2 750 0 4 8
✅ Shard 3 746 0 0 7
✅ Shard 4 775 0 0 18
🟡 Shard 5 686 0 1 41
🟡 Shard 6 734 0 3 8
🟡 8 flaky test(s) (passed on retry)
  • Features/ActivityAPI.spec.ts › Activity event is created when description is updated (shard 2, 1 retry)
  • Features/ActivityAPI.spec.ts › Activity event shows the actor who made the change (shard 2, 1 retry)
  • Features/Glossary/GlossaryWorkflow.spec.ts › should start term as Draft when glossary has reviewers (shard 2, 2 retries)
  • Features/Glossary/MUIGlossaryMutualExclusivity.spec.ts › MUI-ME-R01: Children of ME parent should render Radio buttons (shard 2, 1 retry)
  • Pages/Entity.spec.ts › Inactive Announcement create & delete (shard 5, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify lineage schema filter selection (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab IS visible for supported type: searchIndex (shard 6, 1 retry)
  • Pages/ServiceEntity.spec.ts › Announcement create, edit & delete (shard 6, 1 retry)

📦 Download artifacts

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

Copilot AI review requested due to automatic review settings May 4, 2026 05:58
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 6 out of 6 changed files in this pull request and generated 2 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 17 out of 17 changed files in this pull request and generated 3 comments.

Comment on lines 131 to 133
// Always recreate
true,
Boolean.TRUE.equals(jobData.getAutoTune()),
Comment on lines 123 to +127
LOG.debug(
"[PaginatedEntitiesSource] Batch Stats :- %n Submitted : {} Success: {} Failed: {}",
batchSize, result.getData().size(), result.getErrors().size());
"[PaginatedEntityTimeSeriesSource] Batch Stats :- Submitted: {} Success: {} Failed: {} Warnings: {}",
batchSize,
result.getData().size(),
result.getErrors().size(),
Comment on lines +159 to +163
int warningsCount = filterStaleRelationshipErrors(result);

if (!result.getErrors().isEmpty()) {
LOG.warn(
"[PaginatedEntityTimeSeriesSource] Real errors found: {}", result.getErrors().size());
Copilot AI review requested due to automatic review settings May 4, 2026 12:09
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 18 out of 18 changed files in this pull request and generated 3 comments.

Comment on lines 299 to 303
keysetCursor,
cachedTotalCount,
true,
Entity.getFields(entityType, fields));
Entity.getOnlySupportedFields(entityType, fields));

Comment on lines +131 to +132
// Always recreate
true,
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 18 out of 18 changed files in this pull request and generated 5 comments.

Comment on lines +573 to +577
LOG.warn(
"Skipping reader failure record for entityType={}: entityId is null, message={}",
entityType,
entityError.getMessage());
continue;
Comment on lines +88 to +92
String message = error.getMessage().toLowerCase();
return message.contains("instance for")
|| message.contains("entity not found")
|| message.contains("does not exist")
|| message.contains("entitynotfoundexception")
Address two review concerns on PR #27800:

1. The stale-reference matcher missed EntityNotFoundException's primary
   factory messages — byId ("Entity with id [...] not found."), byName
   ("Entity with name [...] not found."), byVersion ("Entity with id
   [...] and version [...] not found."), and byParserSchema ("Parser
   schema not found ..."). These would have been classified as real
   failures instead of warnings. Add specific contains() patterns
   ("entity with id", "entity with name", "parser schema not found")
   that match each factory's exact prefix without reintroducing the
   over-broad bare "not found" check. byFilter ("Entity not found for
   query params [...]") was already covered by "entity not found".

2. PartitionWorker.recordReaderFailures emitted WARN per error when
   entityId was null. EntityTimeSeriesRepository builds EntityError
   with only a message (no entity reference), so every time-series
   error hit that branch — log spam under load. Downgrade to DEBUG
   with a comment explaining why the id is absent.

Tests: ReindexingUtilStaleRelationshipTest now exercises every
EntityNotFoundException factory message.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mohityadav766
Copy link
Copy Markdown
Member Author

Both concerns addressed in 0601641.

1. Missed EntityNotFoundException formats — confirmed by reading EntityNotFoundException.java:

Factory Message Caught before? Caught now?
byId Entity with id [%s] not found. ✓ via "entity with id"
byName Entity with name [%s] not found. ✓ via "entity with name"
byVersion Entity with id [%s] and version [%s] not found. ✓ via "entity with id"
byParserSchema Parser schema not found for entity with id [%s]. ✓ via "parser schema not found"
byFilter Entity not found for query params [%s]. ✓ via "entity not found"
CatalogExceptionMessage.entityNotFound %s instance for %s not found ✓ via "instance for"
ensureSingleRelationship ... does not have expected relationship ... ✓ via "expected relationship"

Specific patterns instead of bare "not found" so we still don't false-positive on "Column 'x' not found" / "SSL certificate not found". New unit test isStaleReferenceError_recognisesEveryEntityNotFoundExceptionFactory exercises every factory.

2. WARN log spam in PartitionWorker.recordReaderFailuresEntityTimeSeriesRepository.getEntityList builds EntityError with only withMessage(...), no entity ref. Every time-series error hit the null-id branch and emitted WARN. Downgraded to DEBUG with a comment explaining why null is expected for time-series readers (per-entity recording isn't possible without an id, but it's also not a real anomaly worth a WARN).

…adoc

Address remaining Copilot comments on PR #27800:

1. EntityTimeSeriesRepository.getResultList(...) returns ResultList with
   errors=null on the success path. PaginatedEntityTimeSeriesSource was
   reading result.getErrors().size() / .isEmpty() right after, which would
   NPE on the common no-error path. Normalize errors to an empty list
   inside filterStaleRelationshipErrors so callers can rely on non-null.

2. ReindexingUtil.isStaleReferenceError now lowercases with Locale.ROOT
   instead of the platform default — avoids Turkish-locale style edge
   cases where 'I' lowercases differently and substring matches fail.

3. PaginatedEntityTimeSeriesSource.read() was logging every real reader
   error message at WARN. For large failed batches this floods logs.
   Switch to a single WARN with the error count plus the first 5 message
   details at DEBUG (gated by isDebugEnabled).

4. OmAppJobListener.fillTerminalTimings Javadoc claimed "does nothing if
   endTime is already set" but the body still backfills executionTime in
   that case. Rewrite to accurately describe the per-field idempotency.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@mohityadav766
Copy link
Copy Markdown
Member Author

Addressed 4 more Copilot comments in eac76b6:

  1. NPE on result.getErrors()EntityTimeSeriesRepository.getResultList(...) leaves errors=null on the success path. filterStaleRelationshipErrors now normalizes to an empty list before any of the callers (logging, updateStats, the if (!result.getErrors().isEmpty()) branch) read it.
  2. Locale.ROOT for toLowerCase — switched in isStaleReferenceError so substring matching is locale-stable (Turkish-locale 'I' edge case etc.).
  3. WARN spam in read() — was logging every real error message at WARN. Now logs a single WARN with the error count and dumps the first 5 message details at DEBUG (gated by isDebugEnabled).
  4. fillTerminalTimings Javadoc — rewrote to match the implementation: endTime and executionTime are filled independently and only when null, so callers that pre-populated endTime (e.g. DistributedJobStatsAggregator from job.getCompletedAt()) still get an accurate executionTime.

Skipping the tags in COMMON_REINDEX_FIELDS / cursor-reader-fields concern (#5 in my list above) per @mohitdeuex — that touches commits outside the issue #27417 scope and will be handled separately.

109/109 tests still pass.

@gitar-bot
Copy link
Copy Markdown

gitar-bot Bot commented May 4, 2026

Code Review 👍 Approved with suggestions 2 resolved / 3 findings

Refactors search reindexing logic to classify stale parentOf relationship errors as warnings rather than failures, preventing batch interruptions. Consider updating the "Always recreate" comment to explain the reasoning behind the forced recreation.

💡 Quality: Comment explains "what" not "why" for forced recreateIndex

📄 openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/searchIndex/ReindexingConfiguration.java:131-132

The comment // Always recreate restates the code (true). Per the project's self-documenting-code guideline, comments should explain why a non-obvious decision was made — here, the rationale is that reindexing without recreation leads to stale mappings/data, so recreation is always required for correctness. A brief "why" prevents a future contributor from reverting this to respect jobData.getRecreateIndex() thinking the hardcoding was accidental.

Suggested fix
// Recreation is always required to ensure index mappings
// stay consistent; the user-facing flag is intentionally ignored.
true,
✅ 2 resolved
Bug: readWithCursor and readNextKeyset never update warning stats

📄 openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/PaginatedEntityTimeSeriesSource.java:117-131 📄 openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/PaginatedEntityTimeSeriesSource.java:229-241
The read() method correctly calls updateStats(success, failed, warningsCount) on both the error and success paths (lines 171, 180), so StepStats.warningRecords is incremented. However:

  1. readWithCursor() (line 106-142) calls filterStaleRelationshipErrors which strips warnings from the error list and sets result.warningsCount, but never calls updateStats. The source's internal StepStats will never reflect warnings for batches read through this path.

  2. readNextKeyset() (line 214-259) also computes warningsCount from filterStaleRelationshipErrors but never calls updateStats. The EntityReader.readKeysetBatches caller also doesn't update the source's stats.

This means warnings are silently lost in the source's StepStats for cursor-based and keyset-based read paths. Although result.getWarningsCount() is set on the returned ResultList, the aggregate stats reported at the end of a reindex job will under-report warnings.

Edge Case: isEntityNotFoundError matcher is overly broad for 'not found'

📄 openmetadata-service/src/main/java/org/openmetadata/service/workflows/searchIndex/ReindexingUtil.java:79-84
The isEntityNotFoundError matcher (ReindexingUtil:80) uses message.contains("not found") which will match any error message containing that substring — for example "Column 'status' not found in result set" (a real DB schema error) or "SSL certificate not found" would be misclassified as a stale-relationship warning and silently swallowed instead of treated as a real failure.

This is the pre-existing behavior inherited from PaginatedEntitiesSource, but since this PR centralizes and expands the matcher to a new code path (PaginatedEntityTimeSeriesSource), it's worth noting the risk.

🤖 Prompt for agents
Code Review: Refactors search reindexing logic to classify stale parentOf relationship errors as warnings rather than failures, preventing batch interruptions. Consider updating the "Always recreate" comment to explain the reasoning behind the forced recreation.

1. 💡 Quality: Comment explains "what" not "why" for forced recreateIndex
   Files: openmetadata-service/src/main/java/org/openmetadata/service/apps/bundles/searchIndex/ReindexingConfiguration.java:131-132

   The comment `// Always recreate` restates the code (`true`). Per the project's self-documenting-code guideline, comments should explain *why* a non-obvious decision was made — here, the rationale is that reindexing without recreation leads to stale mappings/data, so recreation is always required for correctness. A brief "why" prevents a future contributor from reverting this to respect `jobData.getRecreateIndex()` thinking the hardcoding was accidental.

   Suggested fix:
   // Recreation is always required to ensure index mappings
   // stay consistent; the user-facing flag is intentionally ignored.
   true,

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

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 18 out of 18 changed files in this pull request and generated 2 comments.

Comment on lines 56 to 72
/**
* Relationship/enrichment fields fetched by {@code EntityRepository.setFields} that every search
* document populates via {@link #populateCommonFields(Map, EntityInterface, String)}. Stored-JSON
* fields (name, displayName, description, service, entity-native counts) are NOT in this set —
* they live on the entity row and need no extra fetch.
*/
Set<String> COMMON_REINDEX_FIELDS =
Set.of(
"owners",
"domains",
"reviewers",
"followers",
"votes",
"extension",
"tags",
"certification",
"dataProducts");
Comment on lines +69 to +86
/**
* Returns true when an EntityError represents a stale reference — either a missing entity
* (canonical {@code EntityNotFoundException}) or a missing entity_relationship row (raised by
* {@code EntityRepository.ensureSingleRelationship} as "does not have expected relationship
* ..."). Both are expected during reindexing of long-lived records: e.g. a
* {@code testCaseResolutionStatus} migrated without a corresponding {@code parentOf} row, or
* an entity hard-deleted out-of-band leaving its relationship rows behind. Such records
* cannot be meaningfully indexed and are reported as warnings rather than failing the entire
* batch.
*
* <p>The patterns are deliberately specific so we do not misclassify unrelated errors that
* happen to contain {@code "not found"} (e.g. {@code "Column 'foo' not found in result set"}
* or {@code "SSL certificate not found"}). They cover every {@code EntityNotFoundException}
* factory message ({@code byId}, {@code byName}, {@code byFilter}, {@code byVersion},
* {@code byParserSchema}) plus the legacy {@code CatalogExceptionMessage.entityNotFound}
* format and the relationship-not-found shape.
*/
public static boolean isStaleReferenceError(EntityError error) {
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 4, 2026

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.

Search Indexing Exception: testCaseResolutionStatus missing parentOf relationship to testCase

4 participants