Skip to content

fix(search): filter _source in column tag/glossary search to prevent serving-time OOM - #29502

Open
mohityadav766 wants to merge 2 commits into
mainfrom
fix/column-aggregator-source-filter
Open

fix(search): filter _source in column tag/glossary search to prevent serving-time OOM#29502
mohityadav766 wants to merge 2 commits into
mainfrom
fix/column-aggregator-source-filter

Conversation

@mohityadav766

@mohityadav766 mohityadav766 commented Jun 26, 2026

Copy link
Copy Markdown
Member

Fixes #29501

Problem

The column tag/glossary search (OpenSearchColumnAggregator / ElasticSearchColumnAggregatorfetchColumnsWithTagsFromSource) fetches up to 10,000 data-asset documents with their full _source and scans column tags in Java (flat ES/OS mapping can't filter "column X has tag Y" at query time). Full _source carries table descriptions, sample data, profiles and every column sub-field, so a single fetch can be tens of MB. Buffering + Jackson-parsing it produces multi-MB G1 humongous allocations; under concurrent load this causes Full-GC churn and stop-the-world stalls that can leave the liveness probe unanswered → pod SIGKILL (exit 137).

Fix

Restrict the fetch to exactly the fields the extractor reads, via a shared ColumnAggregator.TAG_SOURCE_FETCH_INCLUDES (_source include-filter; no OS/ES duplication). Behavior is unchanged — the extractor reads the same fields, just from a lean document.

Evidence

  • Same size=10000 fetch over a real ~20k-entity dataset: 25.1 MB → 4.1 MB (6.2× smaller); far larger reductions on data with big descriptions.
  • Reproduced the failure: 16 concurrent large-_source requests pin the heap, ~900–1140 G1 humongous regions, repeated Full GCs.
  • Verified this is distinct from the reindex path (reindex is batched and stays memory-flat — 0 humongous / 0 Full GC at both 2 GB and 4 GB heaps).

Type of change

  • Bug fix (non-breaking change which fixes an issue)

Testing

  • ColumnAggregatorTest green (9/9), incl. a new regression test asserting the include list covers every extractor-read field and never re-broadens to full _source.
  • Full openmetadata-service compiles clean (mvn -pl openmetadata-service -am clean install -DskipTests → BUILD SUCCESS).
  • Empirical size reduction measured against a live OpenSearch as above.

Backport

Please backport to the active release branch(es).

🤖 Generated with Claude Code

Greptile Summary

This PR applies an _source include-filter (TAG_SOURCE_FETCH_INCLUDES) to the tag/glossary column-search fetch in both the ElasticSearch and OpenSearch column aggregators, reducing response size from ~25 MB to ~4 MB per 10k-entity fetch and preventing G1 humongous allocations that caused Full-GC churn and OOM kills under concurrent load.

  • Core fix: adds TAG_SOURCE_FETCH_INCLUDES (a shared constant on the ColumnAggregator interface) listing exactly the 13 fields that the tag-extractor reads, and wires it as _source.filter.includes in both ElasticSearchColumnAggregator.fetchColumnsWithTagsFromSource and OpenSearchColumnAggregator.fetchColumnsWithTagsFromSource.
  • Test: adds tagSourceFetchIncludes_coverFieldsTheExtractorReads to assert the constant covers all extractor-read fields and guards against future widening back to full _source.

Confidence Score: 4/5

Safe to merge for the common table and dashboardDataModel entity types, but the ES aggregator's tag/glossary search will silently return zero results for topic, searchIndex, and container entities — a regression that was not present before the source filter was applied.

The fix achieves its goal and is safe for the default entity type (table). However, ElasticSearchColumnAggregator.INDEX_CONFIGS maps topic, searchIndex, and container to non-columns field paths (messageSchema.schemaFields, fields, dataModel.columns), none of which appear in TAG_SOURCE_FETCH_INCLUDES. After the filter is applied, getNestedJsonNode returns null for those paths and the extractor silently produces an empty result — a behavioral regression for those entity types in the ES path.

openmetadata-service/src/main/java/org/openmetadata/service/search/ColumnAggregator.java — the TAG_SOURCE_FETCH_INCLUDES list needs the additional field paths for topic, searchIndex, and container entities to restore correct behavior in the ES aggregator.

Important Files Changed

Filename Overview
openmetadata-service/src/main/java/org/openmetadata/service/search/ColumnAggregator.java Adds TAG_SOURCE_FETCH_INCLUDES with 13 column-path entries; the list only covers columns.* paths and is missing messageSchema.schemaFields.*, fields.*, and dataModel.columns.* needed by ES INDEX_CONFIGS for topic, searchIndex, and container entity types (already flagged in prior review thread).
openmetadata-service/src/main/java/org/openmetadata/service/search/elasticsearch/ElasticSearchColumnAggregator.java Wires TAG_SOURCE_FETCH_INCLUDES into fetchColumnsWithTagsFromSource; the fix is correct for table/dashboardDataModel entities but silently drops topic/container/searchIndex results because INDEX_CONFIGS maps those to non-columns paths not included in the filter (covered in prior thread).
openmetadata-service/src/main/java/org/openmetadata/service/search/opensearch/OpenSearchColumnAggregator.java Wires TAG_SOURCE_FETCH_INCLUDES into fetchColumnsWithTagsFromSource; correct for OS because the OS tag-filter query and extractor are already hardcoded to the columns path, so the include list is consistent with what is actually read.
openmetadata-service/src/test/java/org/openmetadata/service/search/ColumnAggregatorTest.java Adds a regression test asserting TAG_SOURCE_FETCH_INCLUDES covers all extractor-read fields and prohibits */description/sampleData; guards against accidental widening of the filter.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Client
    participant ColumnAggregator
    participant ES_OS as ES/OS Search Engine

    Client->>ColumnAggregator: aggregateColumns(request) [tags/glossaryTerms set]
    ColumnAggregator->>ColumnAggregator: buildTagFilterQuery()
    ColumnAggregator->>ES_OS: "SearchRequest (size=10000, _source.filter.includes=TAG_SOURCE_FETCH_INCLUDES)"
    Note over ColumnAggregator,ES_OS: Before fix: full _source (~25 MB per 10k docs)<br/>After fix: lean _source (~4 MB per 10k docs)
    ES_OS-->>ColumnAggregator: Hits with filtered _source (13 fields only)
    loop For each hit
        ColumnAggregator->>ColumnAggregator: "extractMatchingColumnsFromHit()<br/>reads: fullyQualifiedName, entityType, displayName,<br/>service.name, database.name, databaseSchema.name,<br/>columns.*, columns.tags, columns.children"
    end
    ColumnAggregator-->>Client: ColumnGridResponse (paginated tagged columns)
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Client
    participant ColumnAggregator
    participant ES_OS as ES/OS Search Engine

    Client->>ColumnAggregator: aggregateColumns(request) [tags/glossaryTerms set]
    ColumnAggregator->>ColumnAggregator: buildTagFilterQuery()
    ColumnAggregator->>ES_OS: "SearchRequest (size=10000, _source.filter.includes=TAG_SOURCE_FETCH_INCLUDES)"
    Note over ColumnAggregator,ES_OS: Before fix: full _source (~25 MB per 10k docs)<br/>After fix: lean _source (~4 MB per 10k docs)
    ES_OS-->>ColumnAggregator: Hits with filtered _source (13 fields only)
    loop For each hit
        ColumnAggregator->>ColumnAggregator: "extractMatchingColumnsFromHit()<br/>reads: fullyQualifiedName, entityType, displayName,<br/>service.name, database.name, databaseSchema.name,<br/>columns.*, columns.tags, columns.children"
    end
    ColumnAggregator-->>Client: ColumnGridResponse (paginated tagged columns)
Loading

Reviews (2): Last reviewed commit: "Merge branch 'main' into fix/column-aggr..." | Re-trigger Greptile

…serving-time OOM

The column tag/glossary search (OpenSearch/ElasticSearchColumnAggregator
.fetchColumnsWithTagsFromSource) fetched up to 10,000 data-asset documents with
their full _source to scan column tags in Java (flat ES mapping can't filter
"column X has tag Y" at query time). Full _source pulls table-level descriptions,
sample data, profiles and every column sub-field, so a single fetch can be tens of
MB. Buffering + Jackson-parsing that produces multi-MB (G1 humongous) allocations;
under concurrent load this drives Full-GC churn and stop-the-world stalls that can
leave liveness probes unanswered and get the pod SIGKILLed.

Restrict the fetch to the fields the extractor actually reads via a shared
TAG_SOURCE_FETCH_INCLUDES list (no duplication across OS/ES). Measured on a real
~20k-entity dataset the fetch drops from 25.1 MB to 4.1 MB (6.2x), and far more on
data with large descriptions, while keeping behavior unchanged.

Adds a regression test asserting the include list covers every extractor-read field
and never re-broadens to full _source.

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

Copy link
Copy Markdown
Contributor

❌ PR checklist incomplete

This PR cannot be merged until the following are addressed on its linked issue:

The fields live on the linked issue in the Shipping project (open the issue → right sidebar → Projects). After you set them, re-run this check (or push a commit) — issue/project changes do not re-trigger it automatically.

Maintainers can bypass this check by adding the skip-pr-checks label.

@github-actions github-actions Bot added backend safe to test Add this label to run secure Github workflows on PRs labels Jun 26, 2026
Comment on lines +114 to +128
@Test
void tagSourceFetchIncludes_coverFieldsTheExtractorReads() {
// The tag/glossary column search reads _source in Java to locate tagged columns. The fix
// restricts _source to TAG_SOURCE_FETCH_INCLUDES to avoid fetching multi-MB documents (full
// _source caused G1 humongous allocations and Full-GC churn under concurrent load). This list
// must cover every field the extractor and parseColumn read, or filtering would silently drop
// data the feature needs.
List<String> includes = ColumnAggregator.TAG_SOURCE_FETCH_INCLUDES;
assertTrue(
includes.containsAll(
List.of(
"fullyQualifiedName",
"entityType",
"displayName",
"service.name",

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: Coverage test duplicates the constant rather than verifying extractor reads

tagSourceFetchIncludes_coverFieldsTheExtractorReads asserts that TAG_SOURCE_FETCH_INCLUDES contains a hardcoded list of field names that is an exact copy of the constant's own definition. This makes the assertion effectively tautological: it guards against the constant being shrunk, but it does NOT actually verify the list covers "every field the extractor and parseColumn read" as the comment claims. If a future change adds a new _source read in extractMatchingColumnsFromHit/parseColumn (e.g. a new column sub-field) and forgets to add it to the include list, this test will still pass and the field will be silently dropped from results — exactly the failure mode the test purports to prevent.

I confirmed via the source that the current include list does cover all fields read by both ES and OS extractors (fullyQualifiedName, entityType, displayName, service.name, database.name, databaseSchema.name, columns.name/displayName/description/dataType/fullyQualifiedName/tags/children), so the fix itself is correct today. The concern is purely the durability of the regression guard.

Consider strengthening the test so it derives the required set from actual reads (or at minimum add a comment that the list must be manually kept in sync, and keep a single source of truth). A lightweight improvement is to assert the include list is non-empty and that each entry is a known extractor field, but the strongest form would scan the extractor for .get("...") literals. At minimum, the test name/comment overstates the guarantee.

Was this helpful? React with 👍 / 👎

Comment on lines +48 to +62
List<String> TAG_SOURCE_FETCH_INCLUDES =
List.of(
"fullyQualifiedName",
"entityType",
"displayName",
"service.name",
"database.name",
"databaseSchema.name",
"columns.name",
"columns.displayName",
"columns.description",
"columns.dataType",
"columns.fullyQualifiedName",
"columns.tags",
"columns.children");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Missing column-field paths for non-columns entity types in ES aggregator

TAG_SOURCE_FETCH_INCLUDES only covers the columns.* field path, but ElasticSearchColumnAggregator.INDEX_CONFIGS maps three additional entity types to different root paths: topicmessageSchema.schemaFields, searchIndexfields, and containerdataModel.columns. With the source filter applied, getNestedJsonNode(sourceNode, columnFieldPath) returns null for those paths and silently produces zero tag-matched columns for those entity types. This is a regression versus the previous full-_source fetch, which returned the correct data for all entity types. The missing paths should be added: messageSchema.schemaFields, fields, and dataModel.columns (or their individual sub-fields).

@github-actions

Copy link
Copy Markdown
Contributor

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 62%
62.46% (66819/106964) 44.38% (37493/84463) 45.54% (11232/24660)

@sonarqubecloud

Copy link
Copy Markdown

@github-actions

github-actions Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

🔴 Playwright Results — 9 failure(s), 55 flaky

✅ 4419 passed · ❌ 9 failed · 🟡 55 flaky · ⏭️ 38 skipped

Shard Passed Failed Flaky Skipped
🔴 Shard 1 371 8 7 11
🟡 Shard 2 808 0 8 9
🟡 Shard 3 815 0 5 7
🔴 Shard 4 807 1 5 10
🟡 Shard 5 844 0 20 0
🟡 Shard 6 774 0 10 1

Genuine Failures (failed on all attempts)

Pages/Lineage/LineageInteraction.spec.ts › Verify edge click opens edge drawer (shard 1)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoBeVisible�[2m(�[22m�[2m)�[22m failed

Locator: getByTestId('edge-pw-database-service-91796bb1.pw-database-4e5852a0.pw-database-schema-98e266fc.pw-table-b9596786-5102-4301-abe4-96195dd59b82-undefined')
Expected: visible
Timeout: 15000ms
Error: element(s) not found

Call log:
�[2m  - Expect "toBeVisible" with timeout 15000ms�[22m
�[2m  - waiting for getByTestId('edge-pw-database-service-91796bb1.pw-database-4e5852a0.pw-database-schema-98e266fc.pw-table-b9596786-5102-4301-abe4-96195dd59b82-undefined')�[22m

Pages/Lineage/LineageInteraction.spec.ts › Verify edge delete button in drawer (shard 1)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoBeVisible�[2m(�[22m�[2m)�[22m failed

Locator: getByTestId('edge-pw-database-service-6165c993.pw-database-e4002175.pw-database-schema-9952e70a.pw-table-9e4cd94c-a15e-4d48-a93d-335d5b0a14c1-undefined')
Expected: visible
Timeout: 15000ms
Error: element(s) not found

Call log:
�[2m  - Expect "toBeVisible" with timeout 15000ms�[22m
�[2m  - waiting for getByTestId('edge-pw-database-service-6165c993.pw-database-e4002175.pw-database-schema-9952e70a.pw-table-9e4cd94c-a15e-4d48-a93d-335d5b0a14c1-undefined')�[22m

Pages/Lineage/LineageInteraction.spec.ts › Verify node panel opens on click (shard 1)
�[31mTest timeout of 60000ms exceeded.�[39m
Pages/Lineage/LineageInteraction.spec.ts › Verify edit mode with edge operations (shard 1)
Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoBeVisible�[2m(�[22m�[2m)�[22m failed

Locator: getByTestId('edge-pw-database-service-3312c876.pw-database-d15087f3.pw-database-schema-1d3ee82f.pw-table-d5471b31-a0f6-4a36-8a8a-b98dd0f6d805-undefined')
Expected: visible
Timeout: 15000ms
Error: element(s) not found

Call log:
�[2m  - Expect "toBeVisible" with timeout 15000ms�[22m
�[2m  - waiting for getByTestId('edge-pw-database-service-3312c876.pw-database-d15087f3.pw-database-schema-1d3ee82f.pw-table-d5471b31-a0f6-4a36-8a8a-b98dd0f6d805-undefined')�[22m

Pages/Lineage/PlatformLineage.spec.ts › Verify table search with special characters as handled (shard 1)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"
Pages/Lineage/PlatformLineage.spec.ts › Verify service platform view (shard 1)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"
Pages/Lineage/PlatformLineage.spec.ts › Verify domain platform view (shard 1)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"
Pages/Lineage/PlatformLineage.spec.ts › Verify platform view switching (shard 1)
TimeoutError: page.waitForResponse: Timeout 30000ms exceeded while waiting for event "response"
Flow/PlatformLineage.spec.ts › Verify Platform Lineage View (shard 4)
�[31mTest timeout of 60000ms exceeded.�[39m
🟡 55 flaky test(s) (passed on retry)
  • Features/DataAssetRulesEnabled.spec.ts › Verify the Store Procedure Entity Action items after rules is Enabled (shard 1, 1 retry)
  • Features/DataAssetRulesEnabled.spec.ts › Verify the Pipeline Entity Action items after rules is Enabled (shard 1, 1 retry)
  • Features/DataAssetRulesDisabled.spec.ts › Verify the ApiEndpoint entity item action after rules disabled (shard 1, 2 retries)
  • Features/DescriptionSuggestion.spec.ts › should add and accept a requested topic schema field description (shard 1, 1 retry)
  • Features/Glossary/GlossaryPagination.spec.ts › should check for nested glossary term search (shard 1, 1 retry)
  • Features/Glossary/GlossaryPagination.spec.ts › should filter by InReview status (shard 1, 1 retry)
  • Flow/SearchRBAC.spec.ts › a fully denied user sees neither asset type when browsing (shard 1, 2 retries)
  • Features/BulkEditEntity.spec.ts › Glossary (shard 2, 2 retries)
  • Features/BulkImport.spec.ts › Database service (shard 2, 1 retry)
  • Features/BulkImport.spec.ts › Database Schema (shard 2, 1 retry)
  • Features/Container.spec.ts › expand / collapse should not appear after updating nested fields for container (shard 2, 1 retry)
  • Features/Container.spec.ts › Copy column link button should copy the column URL to clipboard (shard 2, 1 retry)
  • Features/Container.spec.ts › Copy column link should have valid URL format (shard 2, 1 retry)
  • Features/ContextCenter.spec.ts › clicking a memory row opens the view-only modal (shard 2, 1 retry)
  • Features/ContextCenter.spec.ts › delete button inside the modal deletes the memory (shard 2, 1 retry)
  • Features/Permissions/EntityPermissions.spec.ts › SearchIndex deny entity-specific permission operations (shard 3, 1 retry)
  • Features/RecentlyViewed.spec.ts › Check DashboardDataModel in recently viewed (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)
  • Flow/ExploreDiscovery.spec.ts › Should display domain and owner of deleted asset in suggestions when showDeleted is on (shard 4, 1 retry)
  • Flow/NestedChildrenUpdates.spec.ts › should update nested column description immediately without page refresh (shard 4, 1 retry)
  • Flow/NestedChildrenUpdates.spec.ts › should add and remove tags to nested column immediately without refresh (shard 4, 1 retry)
  • Flow/NestedChildrenUpdates.spec.ts › should update nested column description immediately without page refresh (shard 4, 1 retry)
  • Flow/PersonaFlow.spec.ts › Set default persona for team should work properly (shard 4, 1 retry)
  • Pages/Entity.spec.ts › User as Owner with unsorted list (shard 5, 1 retry)
  • Pages/Entity.spec.ts › User should be denied access to edit description when deny policy rule is applied on an entity (shard 5, 1 retry)
  • Pages/Entity.spec.ts › Glossary Term Add, Update and Remove (shard 5, 1 retry)
  • Pages/Entity.spec.ts › User should be denied access to edit description when deny policy rule is applied on an entity (shard 5, 1 retry)
  • Pages/Entity.spec.ts › Team as Owner Add, Update and Remove (shard 5, 1 retry)
  • ... and 25 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

@gitar-bot

gitar-bot Bot commented Jun 30, 2026

Copy link
Copy Markdown
Code Review 👍 Approved with suggestions 0 resolved / 1 findings

Restricts _source fields in the OpenSearch column aggregator to reduce memory pressure and prevent OOM-related pod restarts. Consider refactoring the regression test to dynamically verify field coverage instead of duplicating the constant definition.

💡 Quality: Coverage test duplicates the constant rather than verifying extractor reads

📄 openmetadata-service/src/test/java/org/openmetadata/service/search/ColumnAggregatorTest.java:114-128 📄 openmetadata-service/src/main/java/org/openmetadata/service/search/ColumnAggregator.java:48-62

tagSourceFetchIncludes_coverFieldsTheExtractorReads asserts that TAG_SOURCE_FETCH_INCLUDES contains a hardcoded list of field names that is an exact copy of the constant's own definition. This makes the assertion effectively tautological: it guards against the constant being shrunk, but it does NOT actually verify the list covers "every field the extractor and parseColumn read" as the comment claims. If a future change adds a new _source read in extractMatchingColumnsFromHit/parseColumn (e.g. a new column sub-field) and forgets to add it to the include list, this test will still pass and the field will be silently dropped from results — exactly the failure mode the test purports to prevent.

I confirmed via the source that the current include list does cover all fields read by both ES and OS extractors (fullyQualifiedName, entityType, displayName, service.name, database.name, databaseSchema.name, columns.name/displayName/description/dataType/fullyQualifiedName/tags/children), so the fix itself is correct today. The concern is purely the durability of the regression guard.

Consider strengthening the test so it derives the required set from actual reads (or at minimum add a comment that the list must be manually kept in sync, and keep a single source of truth). A lightweight improvement is to assert the include list is non-empty and that each entry is a known extractor field, but the strongest form would scan the extractor for .get("...") literals. At minimum, the test name/comment overstates the guarantee.

🤖 Prompt for agents
Code Review: Restricts _source fields in the OpenSearch column aggregator to reduce memory pressure and prevent OOM-related pod restarts. Consider refactoring the regression test to dynamically verify field coverage instead of duplicating the constant definition.

1. 💡 Quality: Coverage test duplicates the constant rather than verifying extractor reads
   Files: openmetadata-service/src/test/java/org/openmetadata/service/search/ColumnAggregatorTest.java:114-128, openmetadata-service/src/main/java/org/openmetadata/service/search/ColumnAggregator.java:48-62

   `tagSourceFetchIncludes_coverFieldsTheExtractorReads` asserts that `TAG_SOURCE_FETCH_INCLUDES` contains a hardcoded list of field names that is an exact copy of the constant's own definition. This makes the assertion effectively tautological: it guards against the constant being shrunk, but it does NOT actually verify the list covers "every field the extractor and parseColumn read" as the comment claims. If a future change adds a new `_source` read in `extractMatchingColumnsFromHit`/`parseColumn` (e.g. a new column sub-field) and forgets to add it to the include list, this test will still pass and the field will be silently dropped from results — exactly the failure mode the test purports to prevent.
   
   I confirmed via the source that the current include list does cover all fields read by both ES and OS extractors (fullyQualifiedName, entityType, displayName, service.name, database.name, databaseSchema.name, columns.name/displayName/description/dataType/fullyQualifiedName/tags/children), so the fix itself is correct today. The concern is purely the durability of the regression guard.
   
   Consider strengthening the test so it derives the required set from actual reads (or at minimum add a comment that the list must be manually kept in sync, and keep a single source of truth). A lightweight improvement is to assert the include list is non-empty and that each entry is a known extractor field, but the strongest form would scan the extractor for `.get("...")` literals. At minimum, the test name/comment overstates the guarantee.

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

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.

Column tag/glossary search OOMs the server: full-_source fetch of up to 10k docs

1 participant