Skip to content

[Pull-based Ingestion] Remove experimental tag for pull-based ingestion#20704

Merged
andrross merged 2 commits intoopensearch-project:mainfrom
varunbharadwaj:pull-based-ga
Feb 26, 2026
Merged

[Pull-based Ingestion] Remove experimental tag for pull-based ingestion#20704
andrross merged 2 commits intoopensearch-project:mainfrom
varunbharadwaj:pull-based-ga

Conversation

@varunbharadwaj
Copy link
Contributor

@varunbharadwaj varunbharadwaj commented Feb 22, 2026

Description

Remove experimental tag for pull-based ingestion and mark it as public API since 3.6.0.

BroadcastRequest is also marked as publicAPI as its implementations are public from the beginning. Without this change, the breaking changes check fails, for newly added public classes implementing BroadcastRequest interface.

Related Issues

NA

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.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 22, 2026

PR Reviewer Guide 🔍

(Review updated until commit 4fdc076)

Here are some key observations to aid the review process:

🧪 No relevant tests
🔒 No security concerns identified
✅ No TODO sections
🔀 No multiple PR themes
⚡ Recommended focus areas for review

API Stability Concern

BroadcastRequest is being changed from @opensearch.internal to @PublicApi(since = "3.6.0"). This is a base class used internally by many broadcast operations. Making it public API creates a long-term maintenance burden and may expose internal implementation details that should remain flexible. Consider if this class truly needs to be part of the public API surface.

import org.opensearch.common.annotation.PublicApi;
import org.opensearch.common.unit.TimeValue;
import org.opensearch.core.common.io.stream.StreamInput;
import org.opensearch.core.common.io.stream.StreamOutput;

import java.io.IOException;

/**
 * Transport request for broadcast operations
 *
 * @opensearch.api
 */
@PublicApi(since = "3.6.0")
public class BroadcastRequest<Request extends BroadcastRequest<Request>> extends ActionRequest implements IndicesRequest.Replaceable {
Inconsistent Annotation

This service class is marked as @opensearch.internal in the new code, but the PR description states the goal is to remove experimental tags and mark as public API. Verify if this internal annotation is intentional or if it should also be marked as @PublicApi.

* @opensearch.internal
*/

@github-actions
Copy link
Contributor

github-actions bot commented Feb 22, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Reconsider making base class public API

The BroadcastRequest class is being changed from @opensearch.internal to
@opensearch.api with @PublicApi(since = "3.6.0"). This is a base class used by other
internal components and making it public API creates a stability commitment that may
be difficult to maintain. Consider whether this class truly needs to be part of the
public API or if only the specific ingestion-related subclasses should be marked as
public.

server/src/main/java/org/opensearch/action/support/broadcast/BroadcastRequest.java [46-52]

 /**
  * Transport request for broadcast operations
  *
- * @opensearch.api
+ * @opensearch.internal
  */
-@PublicApi(since = "3.6.0")
 public class BroadcastRequest<Request extends BroadcastRequest<Request>> extends ActionRequest implements IndicesRequest.Replaceable {
Suggestion importance[1-10]: 7

__

Why: The suggestion raises a valid concern about making BroadcastRequest a public API. This is a base class that may be used internally, and marking it as public creates a stability commitment. However, the PR appears to be intentionally promoting ingestion-related classes to public API, and this class is used by public ingestion request classes like GetIngestionStateRequest and UpdateIngestionStateRequest. The concern is legitimate but may be an intentional design decision.

Medium
Clarify internal service usage boundaries

The javadoc comment states this is for internal use (@opensearch.internal), but the
PR is removing experimental tags to make ingestion APIs public. Verify that this
service should remain internal and is not accidentally exposed through the public
API surface. If it's truly internal, ensure no public API classes directly expose or
return instances of this service.

server/src/main/java/org/opensearch/cluster/metadata/MetadataStreamingIngestionStateService.java [28-33]

 /**
  * Service responsible for submitting metadata updates (for example, ingestion pause/resume state change updates).
+ * This is an internal service and should not be used directly by plugins or external code.
  *
  * @opensearch.internal
  */
 public class MetadataStreamingIngestionStateService {
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that MetadataStreamingIngestionStateService is marked as @opensearch.internal while other ingestion classes are being promoted to public API. The recommendation to clarify the internal nature is reasonable, though the improved code only adds a comment without changing functionality. The service appears to be correctly kept internal as it's not directly exposed through public APIs.

Low

@github-actions
Copy link
Contributor

Persistent review updated to latest commit 1e5ae1a

@github-actions
Copy link
Contributor

github-actions bot commented Feb 22, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Reconsider making base class public API

The BroadcastRequest class is being changed from @opensearch.internal to
@opensearch.api with @PublicApi(since = "3.6.0"). This is a base class used by other
internal components and making it public API creates a stability commitment that may
be difficult to maintain. Consider whether this class truly needs to be part of the
public API or if only the specific ingestion-related subclasses should be marked as
public.

server/src/main/java/org/opensearch/action/support/broadcast/BroadcastRequest.java [46-52]

 /**
  * Transport request for broadcast operations
  *
- * @opensearch.api
+ * @opensearch.internal
  */
-@PublicApi(since = "3.6.0")
 public class BroadcastRequest<Request extends BroadcastRequest<Request>> extends ActionRequest implements IndicesRequest.Replaceable {
Suggestion importance[1-10]: 7

__

Why: The suggestion raises a valid concern about making BroadcastRequest a public API. This is a base class that may be used internally, and marking it as public creates a stability commitment. However, the PR appears to be intentionally promoting ingestion-related classes to public API, and this class is used by public ingestion request classes like GetIngestionStateRequest and UpdateIngestionStateRequest. The concern is legitimate but may be an intentional design decision.

Medium
Clarify internal service usage boundaries

The javadoc comment states this is for internal use (@opensearch.internal), but the
PR is removing experimental tags to make ingestion APIs public. Verify that this
service should remain internal and is not accidentally exposed through the public
API surface. If it's truly internal, ensure no public API classes directly expose or
return instances of this service.

server/src/main/java/org/opensearch/cluster/metadata/MetadataStreamingIngestionStateService.java [28-33]

 /**
  * Service responsible for submitting metadata updates (for example, ingestion pause/resume state change updates).
+ * This is an internal service and should not be used directly by plugins or external code.
  *
  * @opensearch.internal
  */
 public class MetadataStreamingIngestionStateService {
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that MetadataStreamingIngestionStateService is marked as @opensearch.internal while other ingestion classes are being promoted to public API. The recommendation to clarify the internal nature is reasonable, though the improved code only adds a comment without changing functionality. The service appears to be correctly kept internal as it's not directly exposed through public APIs.

Low

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
@github-actions
Copy link
Contributor

Persistent review updated to latest commit c615591

@github-actions
Copy link
Contributor

github-actions bot commented Feb 22, 2026

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Reconsider making base class public API

The BroadcastRequest class is being changed from @opensearch.internal to
@opensearch.api with @PublicApi(since = "3.6.0"). This is a base class used by other
internal components and making it public API creates a stability commitment that may
be difficult to maintain. Consider whether this class truly needs to be part of the
public API or if only the specific ingestion-related subclasses should be marked as
public.

server/src/main/java/org/opensearch/action/support/broadcast/BroadcastRequest.java [46-52]

 /**
  * Transport request for broadcast operations
  *
- * @opensearch.api
+ * @opensearch.internal
  */
-@PublicApi(since = "3.6.0")
 public class BroadcastRequest<Request extends BroadcastRequest<Request>> extends ActionRequest implements IndicesRequest.Replaceable {
Suggestion importance[1-10]: 7

__

Why: The suggestion raises a valid concern about making BroadcastRequest a public API. This is a base class that may be used internally, and marking it as public creates a stability commitment. However, the PR appears to be intentionally promoting ingestion-related classes to public API, and this class is used by public ingestion request classes like GetIngestionStateRequest and UpdateIngestionStateRequest. The concern is legitimate but may be an intentional design decision.

Medium
Clarify internal service usage boundaries

The javadoc comment states this is for internal use (@opensearch.internal), but the
PR is removing experimental tags to make ingestion APIs public. Verify that this
service should remain internal and is not accidentally exposed through the public
API surface. If it's truly internal, ensure no public API classes directly expose or
return instances of this service.

server/src/main/java/org/opensearch/cluster/metadata/MetadataStreamingIngestionStateService.java [28-33]

 /**
  * Service responsible for submitting metadata updates (for example, ingestion pause/resume state change updates).
+ * This is an internal service and should not be used directly by plugins or external code.
  *
  * @opensearch.internal
  */
 public class MetadataStreamingIngestionStateService {
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that MetadataStreamingIngestionStateService is marked as @opensearch.internal while other ingestion classes are being promoted to public API. The recommendation to clarify the internal nature is reasonable, though the improved code only adds a comment without changing functionality. The service appears to be correctly kept internal as it's not directly exposed through public APIs.

Low

@github-actions
Copy link
Contributor

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

@github-actions
Copy link
Contributor

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

@github-actions
Copy link
Contributor

✅ Gradle check result for c615591: SUCCESS

@codecov
Copy link

codecov bot commented Feb 25, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 73.23%. Comparing base (4377c1c) to head (4fdc076).
⚠️ Report is 14 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##               main   #20704      +/-   ##
============================================
+ Coverage     73.22%   73.23%   +0.01%     
- Complexity    71979    72008      +29     
============================================
  Files          5782     5782              
  Lines        329425   329425              
  Branches      47533    47533              
============================================
+ Hits         241222   241264      +42     
- Misses        68841    68896      +55     
+ Partials      19362    19265      -97     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
@github-actions
Copy link
Contributor

Persistent review updated to latest commit 4fdc076

@github-actions
Copy link
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
Reconsider making base class public API

The BroadcastRequest class is being changed from @opensearch.internal to
@opensearch.api with @PublicApi(since = "3.6.0"). This is a base class used by other
internal components and making it public API creates a stability commitment that may
be difficult to maintain. Consider whether this class truly needs to be part of the
public API or if only the specific ingestion-related subclasses should be marked as
public.

server/src/main/java/org/opensearch/action/support/broadcast/BroadcastRequest.java [46-52]

 /**
  * Transport request for broadcast operations
  *
- * @opensearch.api
+ * @opensearch.internal
  */
-@PublicApi(since = "3.6.0")
 public class BroadcastRequest<Request extends BroadcastRequest<Request>> extends ActionRequest implements IndicesRequest.Replaceable {
Suggestion importance[1-10]: 7

__

Why: The suggestion raises a valid concern about making BroadcastRequest a public API. This is a base class that may be used internally, and marking it as public creates a stability commitment. However, the PR appears to be intentionally promoting ingestion-related classes to public API, and this class is used by public ingestion request classes like GetIngestionStateRequest and UpdateIngestionStateRequest. The concern is legitimate but may be an intentional design decision.

Medium
Clarify internal service usage boundaries

The javadoc comment states this is for internal use (@opensearch.internal), but the
PR is removing experimental tags to make ingestion APIs public. Verify that this
service should remain internal and is not accidentally exposed through the public
API surface. If it's truly internal, ensure no public API classes directly expose or
return instances of this service.

server/src/main/java/org/opensearch/cluster/metadata/MetadataStreamingIngestionStateService.java [28-33]

 /**
  * Service responsible for submitting metadata updates (for example, ingestion pause/resume state change updates).
+ * This is an internal service and should not be used directly by plugins or external code.
  *
  * @opensearch.internal
  */
 public class MetadataStreamingIngestionStateService {
Suggestion importance[1-10]: 5

__

Why: The suggestion correctly identifies that MetadataStreamingIngestionStateService is marked as @opensearch.internal while other ingestion classes are being promoted to public API. The recommendation to clarify the internal nature is reasonable, though the improved code only adds a comment without changing functionality. The service appears to be correctly kept internal as it's not directly exposed through public APIs.

Low

@github-actions
Copy link
Contributor

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

@github-actions
Copy link
Contributor

✅ Gradle check result for 4fdc076: SUCCESS

@andrross andrross merged commit a70e67e into opensearch-project:main Feb 26, 2026
39 of 41 checks passed
imRishN pushed a commit to imRishN/OpenSearch that referenced this pull request Mar 1, 2026
…on (opensearch-project#20704)

* remove experimental tag for pull-based ingestion

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>

* update BroadcastRequest to be marked as public API

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>

---------

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>
varunbharadwaj added a commit that referenced this pull request Mar 2, 2026
…#20729)

* Implement FieldMappingIngestionMessageMapper for pull-based ingestion

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Add changelog

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Address bot comment

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Address comments

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Address comments

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Remove affiliation column for emeritus maintainers (#20725)

Emeritus maintainers are not active in the project, therefore I don't
see a lot of value in tracking their affiliation.

Signed-off-by: Andrew Ross <andrross@amazon.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Add bitmap64 query support (#20606)

---------

Signed-off-by: Divya <DIVYA2@ibm.com>
Signed-off-by: Divya <divyaruhil999@gmail.com>
Co-authored-by: Divya <DIVYA2@ibm.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* fix stream transport TLS cert hot-reload by using live SSLContext from SecureTransportSettingsProvider (#20734)

Signed-off-by: Rishabh Maurya <rishabhmaurya05@gmail.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Bump OpenTelemetry to 1.59.0 and OpenTelemetry Semconv to 1.40.0 (#20737)

Signed-off-by: Andriy Redko <drreta@gmail.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* [Pull-based Ingestion] Remove experimental tag for pull-based ingestion (#20704)

* remove experimental tag for pull-based ingestion

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>

* update BroadcastRequest to be marked as public API

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>

---------

Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Bump Apache Lucene from 10.3.2 to 10.4.0 (#20735)

Signed-off-by: Ankit Jain <jainankitk@apache.org>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Minor

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Fix spotless check

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Address bot comment

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Make id mandatory when id field provided

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Fix spotless check

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Introducing indexing & deletion strategy planner interfaces (#20585)

Signed-off-by: Shashank Gowri <shnkgo@amazon.com>
Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Add changelog

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Refactor

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Fix spotless check

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Empty commit

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Remove duplicate changelog

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

* Empty commit

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>

---------

Signed-off-by: Rishab Nahata <rishabnahata07@gmail.com>
Signed-off-by: Andrew Ross <andrross@amazon.com>
Signed-off-by: Divya <DIVYA2@ibm.com>
Signed-off-by: Divya <divyaruhil999@gmail.com>
Signed-off-by: Rishabh Maurya <rishabhmaurya05@gmail.com>
Signed-off-by: Andriy Redko <drreta@gmail.com>
Signed-off-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
Signed-off-by: Ankit Jain <jainankitk@apache.org>
Signed-off-by: Shashank Gowri <shnkgo@amazon.com>
Co-authored-by: Andrew Ross <andrross@amazon.com>
Co-authored-by: Divya <117009486+divyaruhil@users.noreply.github.com>
Co-authored-by: Divya <DIVYA2@ibm.com>
Co-authored-by: Rishabh Maurya <rishabhmaurya05@gmail.com>
Co-authored-by: Andriy Redko <drreta@gmail.com>
Co-authored-by: Varun Bharadwaj <varunbharadwaj1995@gmail.com>
Co-authored-by: Ankit Jain <jainankitk@apache.org>
Co-authored-by: Shashank Gowri <shashankgowri@gmail.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