Skip to content

Add support of IndexWarmer for replica shards with segment replication enabled - #20650

Merged
ashking94 merged 2 commits into
opensearch-project:mainfrom
Kartik031299:add-warmer-refresh-listener-nrt-replication-reader-manager
Mar 9, 2026
Merged

Add support of IndexWarmer for replica shards with segment replication enabled#20650
ashking94 merged 2 commits into
opensearch-project:mainfrom
Kartik031299:add-warmer-refresh-listener-nrt-replication-reader-manager

Conversation

@Kartik031299

Copy link
Copy Markdown
Contributor

Description

Added WarmerRefreshListener to trigger Engine.Warmer on every refresh invoked for NRTReplicationReaderManager whenever segments are updates on replica shards after processing replication checkpoint

  1. This gives advantage of pre-loading global ordinals in field data cache to avoid cold start penalty with replica shards after new refresh

Related Issues

Bug: #20642

Check List

  • Functionality includes testing.
  • API changes companion pull request created, if applicable.
  • Public documentation issue/PR created, if applicable.

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

@coderabbitai

coderabbitai Bot commented Feb 17, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This PR introduces support for warming indexes during segment replication on replica shards by adding a WarmerRefreshListener to NRTReplicationEngine that triggers warmer invocation after refresh operations. The implementation includes core engine changes, comprehensive test coverage, and updates to test infrastructure to support warmer configuration.

Changes

Cohort / File(s) Summary
NRTReplicationEngine Warmer Implementation
server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java, CHANGELOG.md
Introduces WarmerRefreshListener that implements ReferenceManager.RefreshListener to invoke Engine.Warmer on refreshed readers after segment replication. Added as a listener on the reader manager during engine construction.
Test Framework Updates
test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java, server/src/test/java/org/opensearch/index/engine/InternalEngineTests.java
Updated EngineTestCase.config overload signatures to accept Engine.Warmer parameter and propagate it into EngineConfig.Builder. Test call sites adjusted to pass new eventListener and warmer parameters.
NRTReplicationEngine Unit Tests
server/src/test/java/org/opensearch/index/engine/NRTReplicationEngineTests.java
Added unit tests validating Warmer integration: testWarmerIsInvokedOnUpdateSegments verifies warmer invocation on segment updates, and testWarmerExceptionDoesNotPreventUpdateSegments ensures exceptions don't block updates. Extended engine construction with optional Warmer parameter.
Integration Tests
modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java
New integration test class validating index warming behavior during segment replication on NRT replica shards with eager global ordinals, including force merge scenarios and cross-node visibility verification.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

enhancement, Indexing:Replication

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 12.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and accurately describes the main change: adding IndexWarmer support for replica shards with segment replication enabled.
Description check ✅ Passed The description includes the required sections: Description explains the change and its benefit, Related Issues references #20642, and Check List confirms testing is included.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@Kartik031299 Kartik031299 changed the title Add WarmerRefreshListerner to NRTReplicationReaderManager to warm rep… Add support of IndexWarmer for replica shards with segment replication enabled Feb 17, 2026
@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 75086f4 to 57240bf Compare February 17, 2026 19:35
@github-actions

Copy link
Copy Markdown
Contributor

❌ Gradle check result for 57240bf: FAILURE

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 57240bf to 3f98f86 Compare February 17, 2026 20:03
@github-actions

Copy link
Copy Markdown
Contributor

❌ Gradle check result for 3f98f86: null

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 4

🧹 Nitpick comments (3)
test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java (1)

928-944: Pre-existing: maybeRetentionLeasesSupplier parameter is silently overridden.

Not introduced by this PR, but worth noting: the 10-parameter overload receives maybeRetentionLeasesSupplier (line 925) but then passes maybeGlobalCheckpointSupplier == null ? null : () -> RetentionLeases.EMPTY (line 940) instead, ignoring the caller-supplied value. This is a pre-existing issue — the warmer: null addition at line 943 is fine.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java`
around lines 928 - 944, The config(...) call in EngineTestCase.java is
incorrectly overriding the caller-supplied maybeRetentionLeasesSupplier by
passing maybeGlobalCheckpointSupplier == null ? null : () ->
RetentionLeases.EMPTY; change that argument to pass the actual
maybeRetentionLeasesSupplier parameter (the 9th/10th argument) so the method
uses the provided supplier rather than always returning RetentionLeases.EMPTY;
verify the arguments align with config(...)'s parameter order (especially
maybeGlobalCheckpointSupplier and maybeRetentionLeasesSupplier) and keep the
added warmer=null as is.
server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java (1)

577-593: Consider passing Engine.Warmer directly instead of the full EngineConfig.

The WarmerRefreshListener only uses engineConfig.getWarmer() from the config. Passing just the Warmer would make the dependency explicit and the class easier to reason about.

Proposed refactor
-        WarmerRefreshListener(
-            Logger logger,
-            AtomicBoolean isEngineClosed,
-            EngineConfig engineConfig,
-            NRTReplicationReaderManager readerManager
-        ) {
-            this.warmer = engineConfig.getWarmer();
+        WarmerRefreshListener(
+            Logger logger,
+            AtomicBoolean isEngineClosed,
+            Engine.Warmer warmer,
+            NRTReplicationReaderManager readerManager
+        ) {
+            this.warmer = warmer;

And at the call site (line 107):

-            this.readerManager.addListener(new WarmerRefreshListener(logger, isClosed, engineConfig, this.readerManager));
+            this.readerManager.addListener(new WarmerRefreshListener(logger, isClosed, engineConfig.getWarmer(), this.readerManager));
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java`
around lines 577 - 593, WarmerRefreshListener currently receives an EngineConfig
only to call engineConfig.getWarmer(); change its constructor to accept
Engine.Warmer directly and store that in the warmer field, update the
WarmerRefreshListener instantiation sites to pass engineConfig.getWarmer()
instead of the whole EngineConfig, and remove the unused EngineConfig parameter
to make dependencies explicit (adjust the WarmerRefreshListener constructor
signature and any call sites accordingly).
modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java (1)

126-160: Consider reusing getWarmerTotalForShardType() helper to reduce duplication.

The inline accumulation logic on lines 136–148 duplicates the getWarmerTotalForShardType() helper defined at line 303. The second test (testWarmerInvokedOnReplicaAfterForceMerge) already uses the helper.

♻️ Proposed refactor
         assertBusy(() -> {
             IndicesStatsResponse statsResponse = client().admin()
                 .indices()
                 .prepareStats(INDEX_NAME)
                 .clear()
                 .setWarmer(true)
                 .get();

-            ShardStats[] shardStatsArray = statsResponse.getShards();
-
-            long primaryWarmerTotal = 0;
-            long replicaWarmerTotal = 0;
-
-            for (ShardStats shardStats : shardStatsArray) {
-                WarmerStats warmerStats = shardStats.getStats().getWarmer();
-                assertNotNull("Warmer stats should not be null", warmerStats);
-
-                if (shardStats.getShardRouting().primary()) {
-                    primaryWarmerTotal += warmerStats.total();
-                } else {
-                    replicaWarmerTotal += warmerStats.total();
-                }
-            }
+            long primaryWarmerTotal = getWarmerTotalForShardType(statsResponse.getShards(), true);
+            long replicaWarmerTotal = getWarmerTotalForShardType(statsResponse.getShards(), false);

             assertThat(
                 "Warmer should have been invoked on primary shard",
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java`
around lines 126 - 160, The test duplicates logic for summing warmer totals
across shards; replace the inline accumulation in the anonymous assertBusy block
with calls to the existing helper getWarmerTotalForShardType() (use it to get
primary and replica totals) so the test reuses that method and removes the loop
and local primaryWarmerTotal/replicaWarmerTotal variables; keep the same
assertions comparing the totals to greaterThan(0L) but obtain the totals via
getWarmerTotalForShardType() to eliminate duplication.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0bbea60 and 3f98f86.

📒 Files selected for processing (6)
  • CHANGELOG.md
  • modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java
  • server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java
  • server/src/test/java/org/opensearch/index/engine/InternalEngineTests.java
  • server/src/test/java/org/opensearch/index/engine/NRTReplicationEngineTests.java
  • test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-01-13T17:40:27.167Z
Learnt from: reta
Repo: opensearch-project/OpenSearch PR: 20411
File: server/src/main/java/org/opensearch/index/codec/CodecService.java:112-133
Timestamp: 2026-01-13T17:40:27.167Z
Learning: Avoid capturing or evaluating a supplier (e.g., this::defaultCodec) upfront when passing it to a registry during object construction. If registries may replace defaults during iteration (as in EnginePlugin.getAdditionalCodecs), pass the supplier itself and only resolve it at use time. This ensures dynamic behavior is preserved during initialization and prevents premature binding of defaults in codecs/registry setup. This pattern should apply to similar initialization paths in Java server code where registries may mutate defaults during construction.

Applied to files:

  • server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java
🔇 Additional comments (13)
CHANGELOG.md (1)

15-15: LGTM!

Changelog entry is well-placed under the "Added" section and follows the existing format.

server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java (1)

105-107: Verify ordering: WarmerRefreshListener is added after internal refresh listeners.

The warmer listener is registered after the loop that adds engineConfig.getInternalRefreshListener() entries (lines 102-104). This means warming runs after other internal listeners. This mirrors the pattern in InternalEngine where warming also happens after internal listeners, so the ordering is consistent.

One consideration: if this engine is closed before the constructor completes (i.e., success is set to false at line 140), the readerManager is closed in the finally block (line 145), so the listener won't fire on a partially-constructed engine. This is safe.

test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java (2)

862-889: New config overload with Engine.Warmer looks correct.

The overload properly creates default test objects (empty EventListener, NoneCircuitBreakerService) and delegates to the terminal 12-parameter overload. The retention leases supplier logic is consistent with the existing pattern.


947-1022: Terminal config overload correctly wires warmer into EngineConfig.Builder.

The new parameters (eventListener, warmer) are properly threaded through to the builder at lines 1002 and 1008. The rest of the builder chain is unchanged.

server/src/test/java/org/opensearch/index/engine/NRTReplicationEngineTests.java (3)

411-449: Clean overload chain for buildNrtReplicaEngine with optional Warmer.

The delegation chain is straightforward: 2-param → 4-param (null warmer), 3-param → 4-param (null warmer). The 4-param overload correctly passes the warmer through config(...). Existing tests are unaffected since they all go through the null-warmer path.


761-786: Good resilience test — confirms warmer exceptions don't disrupt segment updates.

The test validates an important invariant: a failing warmer must not prevent updateSegments from completing successfully. The assertion at line 784 confirms the engine's segment state is consistent after a warmer failure.


719-759: Good test coverage for warmer invocation on updateSegments.

The test correctly validates that the warmer is invoked once per updateSegments call that results in a refresh with changed segments. The second assertion after force-merge confirms warming also fires on subsequent segment updates. The use of getFirst() on line 748 is consistent with established patterns throughout the OpenSearch codebase.

server/src/test/java/org/opensearch/index/engine/InternalEngineTests.java (5)

3480-3481: LGTM — updated config wiring for cleanup-enabled merge failure test.

The new arguments align with the expanded EngineConfig signature.


3582-3583: LGTM — index-sort cleanup test matches new config signature.

The added parameters look consistent with the new constructor shape.


3677-3678: LGTM — cleanup-disabled test config updated appropriately.

The updated argument list looks correct.


3775-3776: LGTM — failing-directory cleanup test config updated appropriately.

No issues with the updated parameter list.


7223-7234: LGTM — min-retained-seqno test config now passes retention leases + circuit breaker.

This matches the expanded EngineConfig constructor usage in the rest of the tests.

modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java (1)

1-50: Well-structured integration test with good coverage of the warming-on-replica feature.

The test class covers the key scenarios: eager global ordinals on replica after segment replication, warming after force merge, and the case without eager global ordinals. The helper methods (waitForSearchableDocs, getWarmerTotalForShardType) are clean and well-factored. The cluster scope (TEST) with numDataNodes = 0 gives precise control over node startup order, which is appropriate for these tests.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java`:
- Around line 278-289: The current assertions using greaterThanOrEqualTo(0L) for
WarmerStats.total() (variables primaryTotal and replicaTotal) are vacuous; to
actually verify warmers ran change the assertions to assertThat(...,
greaterThan(0L)) for both primaryTotal and replicaTotal (or, if you intended to
allow zero, update the assertion messages to state zero is acceptable and remove
the misleading "should have been invoked" wording); keep waitForSearchableDocs
as-is if you're only verifying segment replication succeeded.
- Around line 202-210: The two separate calls to
client().admin().indices().prepareStats(INDEX_NAME)... create a TOCTOU race
causing replicaWarmerTotalBeforeMerge and primaryWarmerTotalBeforeMerge to be
based on different stats snapshots; replace the two calls with one stats
response variable (call prepareStats once for INDEX_NAME and store its result),
then pass that single stats response's shards to getWarmerTotalForShardType to
compute replicaWarmerTotalBeforeMerge and primaryWarmerTotalBeforeMerge so both
values come from the same snapshot; update the code references to use that
single stats response wherever getWarmerTotalForShardType is invoked.
- Around line 63-66: The `@Before` method setup in class
SegmentReplicationReplicaIndexWarmerIT is declared private which prevents JUnit4
from recognizing it; change the visibility of the setup method (annotated with
`@Before`) from private to public so JUnit can discover and run it and ensure
internalCluster().startClusterManagerOnlyNode() is executed before tests.

In `@server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java`:
- Around line 598-612: Move the call to readerManager.acquire() inside the try
so any IOException or other exception from acquire is caught and treated as
best-effort warming; specifically, in NRTReplicationEngine.afterRefresh(boolean)
wrap readerManager.acquire() and warmer.warm(reader) in the same try/catch and
catch Exception (or IOException) and call logger.warn("failed to warm reader
replica", e) only if isEngineClosed.get() is false; ensure
readerManager.release(reader) is only called in finally when a non-null reader
was successfully acquired.

---

Nitpick comments:
In
`@modules/parent-join/src/internalClusterTest/java/org/opensearch/join/query/SegmentReplicationReplicaIndexWarmerIT.java`:
- Around line 126-160: The test duplicates logic for summing warmer totals
across shards; replace the inline accumulation in the anonymous assertBusy block
with calls to the existing helper getWarmerTotalForShardType() (use it to get
primary and replica totals) so the test reuses that method and removes the loop
and local primaryWarmerTotal/replicaWarmerTotal variables; keep the same
assertions comparing the totals to greaterThan(0L) but obtain the totals via
getWarmerTotalForShardType() to eliminate duplication.

In `@server/src/main/java/org/opensearch/index/engine/NRTReplicationEngine.java`:
- Around line 577-593: WarmerRefreshListener currently receives an EngineConfig
only to call engineConfig.getWarmer(); change its constructor to accept
Engine.Warmer directly and store that in the warmer field, update the
WarmerRefreshListener instantiation sites to pass engineConfig.getWarmer()
instead of the whole EngineConfig, and remove the unused EngineConfig parameter
to make dependencies explicit (adjust the WarmerRefreshListener constructor
signature and any call sites accordingly).

In
`@test/framework/src/main/java/org/opensearch/index/engine/EngineTestCase.java`:
- Around line 928-944: The config(...) call in EngineTestCase.java is
incorrectly overriding the caller-supplied maybeRetentionLeasesSupplier by
passing maybeGlobalCheckpointSupplier == null ? null : () ->
RetentionLeases.EMPTY; change that argument to pass the actual
maybeRetentionLeasesSupplier parameter (the 9th/10th argument) so the method
uses the provided supplier rather than always returning RetentionLeases.EMPTY;
verify the arguments align with config(...)'s parameter order (especially
maybeGlobalCheckpointSupplier and maybeRetentionLeasesSupplier) and keep the
added warmer=null as is.

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch 2 times, most recently from f6f7990 to d3bc827 Compare February 18, 2026 06:40
@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 018dee8 to 1fe4b07 Compare March 6, 2026 17:45
@github-actions

github-actions Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 1fe4b07

@github-actions

github-actions Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

❌ Gradle check result for 1fe4b07: FAILURE

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 1fe4b07 to 70b1f3d Compare March 6, 2026 19:25
@github-actions

github-actions Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 70b1f3d

@github-actions

github-actions Bot commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

❌ Gradle check result for 70b1f3d: null

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 70b1f3d to 223256b Compare March 7, 2026 12:53
@github-actions

github-actions Bot commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 223256b

@github-actions

github-actions Bot commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

❌ Gradle check result for 223256b: null

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 223256b to d4f89d7 Compare March 7, 2026 16:09
@github-actions

github-actions Bot commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit d4f89d7

@github-actions

github-actions Bot commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

❌ Gradle check result for d4f89d7: FAILURE

Please examine the workflow log, locate, and copy-paste the failure(s) below, then iterate to green. Is the failure a flaky test unrelated to your change?

@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from d4f89d7 to 7e22260 Compare March 8, 2026 16:42
@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit 7e22260

@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown
Contributor

❕ Gradle check result for 7e22260: UNSTABLE

Please review all flaky tests that succeeded after retry and create an issue if one does not already exist to track the flaky failure.

…reader-manager

Signed-off-by: Kartik Bansal <kbansal2@atlassian.com>
@Kartik031299
Kartik031299 force-pushed the add-warmer-refresh-listener-nrt-replication-reader-manager branch from 7e22260 to fb51d06 Compare March 9, 2026 05:13
@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

Persistent review updated to latest commit fb51d06

@github-actions

github-actions Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

✅ Gradle check result for fb51d06: SUCCESS

@ashking94
ashking94 merged commit 6a910bd into opensearch-project:main Mar 9, 2026
35 checks passed
Deepti24 pushed a commit to Deepti24/OpenSearch that referenced this pull request Mar 10, 2026
…ards (opensearch-project#20650)

Signed-off-by: Kartik Bansal <kbansal2@atlassian.com>
Co-authored-by: Kartik Bansal <kbansal2@atlassian.com>
Signed-off-by: Deepti24 <chauhan.deepti24@gmail.com>
aparajita31pandey pushed a commit to aparajita31pandey/OpenSearch that referenced this pull request Apr 18, 2026
…ards (opensearch-project#20650)

Signed-off-by: Kartik Bansal <kbansal2@atlassian.com>
Co-authored-by: Kartik Bansal <kbansal2@atlassian.com>
Signed-off-by: Aparajita Pandey <aparajita31pandey@gmail.com>
pradeep-L pushed a commit to pradeep-L/OpenSearch that referenced this pull request Apr 21, 2026
…ards (opensearch-project#20650)

Signed-off-by: Kartik Bansal <kbansal2@atlassian.com>
Co-authored-by: Kartik Bansal <kbansal2@atlassian.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants