Skip to content

Optimize remote store refresh performance by avoiding unnecessary metadata uploads when index state is unchanged#20192

Draft
sjs004 wants to merge 15 commits into
opensearch-project:mainfrom
sjs004:pr-19198
Draft

Optimize remote store refresh performance by avoiding unnecessary metadata uploads when index state is unchanged#20192
sjs004 wants to merge 15 commits into
opensearch-project:mainfrom
sjs004:pr-19198

Conversation

@sjs004
Copy link
Copy Markdown
Contributor

@sjs004 sjs004 commented Dec 8, 2025

Description

Optimizes remote store refresh performance by avoiding unnecessary metadata uploads when index state is unchanged

Related Issues

Resolves #17530

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.

Summary by CodeRabbit

  • Changed
    • Metadata uploads during remote-store refreshes are now skipped when no new segments require uploading, avoiding redundant transfers.
    • The system now tracks last-uploaded state to detect unchanged conditions and prevent repeated uploads.
    • Deduplicated refresh behavior reduces logging noise and unnecessary work, improving efficiency and resource usage.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 8, 2025

Walkthrough

Caches last-uploaded metadata identifiers (primary term, segmentInfos generation, checkpoint version) in RemoteStoreRefreshListener (initialized to -1) and skips remote metadata upload during refresh when current values match the cached ones; precomputes translog file generation, reuses it for the upload call, and updates the caches after a successful remote metadata upload.

Changes

Cohort / File(s) Summary
Changelog
CHANGELOG.md
Added entry: metadata upload is skipped for remote store clusters when no new segments require uploading during refresh.
Remote store listener
server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java
Adds volatile cached fields lastUploadedPrimaryTerm, lastUploadedLuceneGeneration, lastUploadedCheckpointVersion (init -1L); fetches and null-checks translog generation early and computes translogFileGeneration; short-circuits upload when current primary term, lucene generation, and checkpoint version equal cached values; reuses precomputed translogFileGeneration in the upload call; updates caches after successful remoteDirectory.uploadMetadata.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Inspect thread-safety and visibility semantics of the three volatile fields.
  • Verify correctness and atomicity of the deduplication condition to avoid skipping necessary uploads.
  • Confirm translog generation retrieval, null-check, and computed translogFileGeneration are correct and used consistently.
  • Ensure caches are only updated after a confirmed successful remoteDirectory.uploadMetadata and that error paths don't corrupt state.

Poem

🐇 I watched my terms and gens beneath the moon,
I counted checkpoints softly, hummed a tune,
If all aligned, I kept my packet tight,
No clumsy upload broke the quiet night,
🥕 A nimble hop, a cached and tidy byte.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.33% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Description check ❓ Inconclusive The PR description is minimal and somewhat vague. While it mentions the optimization objective, it lacks specific details about the implementation approach and current state. Expand the description to explain: (1) the deduplication mechanism using lastUploaded fields, (2) how it avoids unnecessary metadata uploads, (3) current test failures and their status, and (4) whether this PR is ready for merge or still in development.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately describes the main change: optimizing remote store refresh by skipping unnecessary metadata uploads when index state is unchanged, which aligns with the CHANGELOG entry and code modifications.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 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.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
server/src/test/java/org/opensearch/index/shard/RemoteStoreRefreshListenerTests.java (2)

404-405: Relaxed successLatch counts align with reduced engine calls, but only assert “at least once”

Lowering the latch from 3 to 1 in the success‑on‑first/second/third‑attempt tests matches the expectation that IndexShard.getEngine() is now invoked fewer times in the success path. Note that with CountDownLatch this still only enforces “called at least once”, not “exactly once”; if you ever need to pin down the exact call count, a mock/spy verification or an AtomicLong assertion would be more precise.

Also applies to: 426-427, 499-500


875-888: verifyUploadedSegments now tolerates missing metadata entries

Allowing files to be absent from uploadedSegments and only validating metadata when present makes the helper compatible with runs where metadata upload may have been legitimately skipped. However, this also weakens the check: it no longer guarantees that every non‑excluded local file has corresponding remote metadata, only that any present entries are sane and that a local segments_N file exists.

If the intent is to keep strong guarantees for cases where uploads are expected (e.g., the various testAfter* flows), consider optionally asserting that at least one non‑excluded file appears in uploadedSegments or adding a dedicated assertion in those tests while leaving this helper looser for optimization cases.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 99695fe and 6b48ac9.

📒 Files selected for processing (3)
  • CHANGELOG.md (1 hunks)
  • server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java (1 hunks)
  • server/src/test/java/org/opensearch/index/shard/RemoteStoreRefreshListenerTests.java (4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (210)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
  • GitHub Check: gradle-check
  • GitHub Check: Mend Security Check
  • GitHub Check: detect-breaking-change
  • GitHub Check: precommit (25, macos-15)
  • GitHub Check: precommit (25, ubuntu-latest)
  • GitHub Check: precommit (25, macos-15-intel)
  • GitHub Check: precommit (21, windows-2025, true)
  • GitHub Check: precommit (21, ubuntu-latest)
  • GitHub Check: precommit (25, windows-latest)
  • GitHub Check: precommit (21, macos-15)
  • GitHub Check: precommit (21, windows-latest)
  • GitHub Check: Analyze (java)
  • GitHub Check: precommit (21, ubuntu-24.04-arm)
  • GitHub Check: precommit (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (25, ubuntu-latest)
  • GitHub Check: assemble (25, windows-latest)
  • GitHub Check: precommit (21, macos-15-intel)
  • GitHub Check: assemble (21, windows-latest)
  • GitHub Check: assemble (25, ubuntu-24.04-arm)
  • GitHub Check: assemble (21, ubuntu-latest)
  • GitHub Check: assemble (21, ubuntu-24.04-arm)
🔇 Additional comments (3)
CHANGELOG.md (1)

27-27: Changelog entry accurately reflects behavior change

Description and PR link look correct and match the implementation in RemoteStoreRefreshListener. No further changes needed.

server/src/main/java/org/opensearch/index/shard/RemoteStoreRefreshListener.java (1)

270-276: Metadata upload is now correctly gated on “any new segments”

Reusing skipUpload to decide whether all post‑refresh files are already present remotely is consistent with the existing upload filter and isRemoteSegmentStoreInSync(). Given containsFile is keyed off remote metadata, this preserves the invariant that metadata is uploaded whenever new segments exist, and skipped only when the remote store is already in sync. Looks good.

server/src/test/java/org/opensearch/index/shard/RemoteStoreRefreshListenerTests.java (1)

908-927: testUploadsWhenNewSegmentsPresent correctly guards against regressions in segment uploads

This integration test validates that adding a new document leads to additional uploaded segments, using assertBusy to accommodate async behavior. It’s a good complement to the optimization: ensures we didn’t inadvertently suppress uploads when new segments are present.

Comment on lines +890 to +907
public void testSkipsMetadataUploadWhenNoNewSegments() throws IOException {
setup(true, 2);

indexShard.refresh("initial-upload");

try (Store remoteStore = indexShard.remoteStore()) {
RemoteSegmentStoreDirectory remoteSegmentStoreDirectory =
(RemoteSegmentStoreDirectory) ((FilterDirectory) ((FilterDirectory) remoteStore.directory()).getDelegate()).getDelegate();

final int initialCount = remoteSegmentStoreDirectory.getSegmentsUploadedToRemoteStore().size();

indexShard.refresh("test-optimization");

int afterOptimizationCount = remoteSegmentStoreDirectory.getSegmentsUploadedToRemoteStore().size();
assertEquals("No new segments should be uploaded when optimization kicks in", initialCount, afterOptimizationCount);
}
}

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.

⚠️ Potential issue | 🟡 Minor

testSkipsMetadataUploadWhenNoNewSegments doesn’t currently prove metadata uploads are skipped

This test asserts that the number of entries in getSegmentsUploadedToRemoteStore() is unchanged across two refreshes with no new docs. That condition should already hold even without the new optimization, since no additional segment blobs are uploaded when there are no new segments.

If you want this test to specifically guard the “skip metadata upload” behavior, you may want to instrument or spy on the remote directory (e.g., verify uploadMetadata is not called on the second refresh) instead of or in addition to checking the segment count.

🤖 Prompt for AI Agents
In
server/src/test/java/org/opensearch/index/shard/RemoteStoreRefreshListenerTests.java
around lines 890 to 907, the test only checks segment count which does not prove
metadata upload was skipped; replace or augment the test to instrument/spy the
remote directory and assert that its metadata-upload method is not invoked on
the second refresh. Specifically, obtain a spy or mock of the
RemoteSegmentStoreDirectory (or the remote directory wrapper), run the first
refresh and verify uploadMetadata was called once, run the second refresh and
verify uploadMetadata was NOT called (or that its invocation count did not
increase); use your test framework’s mocking utilities (e.g., Mockito
spy/verify) to assert the expected call counts and keep the existing
segment-count assertion if desired.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 9, 2025

❌ Gradle check result for 7d7e4f1: 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?

@sjs004
Copy link
Copy Markdown
Contributor Author

sjs004 commented Dec 9, 2025

@sandeshkr419

I tried to fix Test failures for this PR but I believe changes maybe incomplete. Snapshot State post this change is coming as PARTIAL instead of SUCCESS. I believe it should be SUCCESS even if metadata upload is skipped in some scenarios. PARTIAL is not the right terminal state. I tried to bypass this check to see more issues & got more assertion failure as snapshotInfo.failedShards() was greater than zero. So handling for SnapshotInfo in this scenario should be changed IMO. I will continue to dig deeper

REPRODUCE WITH: ./gradlew ':server:test' --tests 'org.opensearch.repositories.blobstore.BlobStoreRepositoryRemoteIndexTests.testRetrieveShallowCopySnapshotCase2' -Dtests.seed=127D06CE3CE0581A -Dtests.security.manager=true -Dtests.jvm.argline="-XX:TieredStopAtLevel=1 -XX:ReservedCodeCacheSize=64m" -Dtests.locale=sr-Latn -Dtests.timezone=America/Anguilla -Druntime.java=24

BlobStoreRepositoryRemoteIndexTests > testRetrieveShallowCopySnapshotCase2 FAILED
    java.lang.AssertionError: 
    Expected: is <SUCCESS>
         but: was <PARTIAL>
        at __randomizedtesting.SeedInfo.seed([127D06CE3CE0581A:5B161C4239EDE0D3]:0)
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:18)
        at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:6)
        at org.apache.lucene.tests.util.LuceneTestCase.assertThat(LuceneTestCase.java:2104)
        at org.opensearch.repositories.blobstore.BlobStoreRepositoryHelperTests.createSnapshot(BlobStoreRepositoryHelperTests.java:141)
        at org.opensearch.repositories.blobstore.BlobStoreRepositoryRemoteIndexTests.testRetrieveShallowCopySnapshotCase2(BlobStoreRepositoryRemoteIndexTests.java:309)

Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
…WhenNewSegmentsPresent

Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
Signed-off-by: Hyunsang Han <gustkd3@gmail.com>
@github-actions github-actions Bot added enhancement Enhancement or improvement to existing feature or request good first issue Good for newcomers Storage:Remote labels Dec 10, 2025
@sjs004 sjs004 marked this pull request as draft December 10, 2025 18:24
@sjs004 sjs004 changed the title Optimizes remote store refresh performance by avoiding unnecessary metadata uploads when index state is unchanged Optimize remote store refresh performance by avoiding unnecessary metadata uploads when index state is unchanged Dec 11, 2025
@opensearch-trigger-bot
Copy link
Copy Markdown
Contributor

This PR is stalled because it has been open for 30 days with no activity.

@opensearch-trigger-bot opensearch-trigger-bot Bot added the stalled Issues that have stalled label Jan 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement Enhancement or improvement to existing feature or request good first issue Good for newcomers stalled Issues that have stalled Storage:Remote

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

Skip metadata upload if no new segment files to upload during refresh for remote store clusters

2 participants