From bc88825a3dd67c68e7259a6241dad3f290962cc4 Mon Sep 17 00:00:00 2001 From: Vinay Krishna Pudyodu Date: Wed, 22 Jan 2025 14:25:57 -0800 Subject: [PATCH 1/4] Updated the validation for search only replica settings Signed-off-by: Vinay Krishna Pudyodu --- .../metadata/MetadataCreateIndexService.java | 15 ++-- .../MetadataCreateIndexServiceTests.java | 86 ++++++++++++++++--- 2 files changed, 79 insertions(+), 22 deletions(-) diff --git a/server/src/main/java/org/opensearch/cluster/metadata/MetadataCreateIndexService.java b/server/src/main/java/org/opensearch/cluster/metadata/MetadataCreateIndexService.java index b5b2b71f977fa..30481b90b0f9f 100644 --- a/server/src/main/java/org/opensearch/cluster/metadata/MetadataCreateIndexService.java +++ b/server/src/main/java/org/opensearch/cluster/metadata/MetadataCreateIndexService.java @@ -1051,9 +1051,6 @@ static Settings aggregateIndexSettings( updateReplicationStrategy(indexSettingsBuilder, request.settings(), settings, combinedTemplateSettings, clusterSettings); updateRemoteStoreSettings(indexSettingsBuilder, currentState, clusterSettings, settings, request.index()); - if (FeatureFlags.isEnabled(FeatureFlags.READER_WRITER_SPLIT_EXPERIMENTAL_SETTING)) { - updateSearchOnlyReplicas(request.settings(), indexSettingsBuilder); - } if (sourceMetadata != null) { assert request.resizeType() != null; @@ -1090,18 +1087,20 @@ static Settings aggregateIndexSettings( validateRefreshIntervalSettings(request.settings(), clusterSettings); validateTranslogFlushIntervalSettingsForCompositeIndex(request.settings(), clusterSettings); validateTranslogDurabilitySettings(request.settings(), clusterSettings, settings); + if (FeatureFlags.isEnabled(FeatureFlags.READER_WRITER_SPLIT_EXPERIMENTAL_SETTING)) { + validateSearchOnlyReplicasSettings(indexSettings); + } return indexSettings; } - private static void updateSearchOnlyReplicas(Settings requestSettings, Settings.Builder builder) { - if (INDEX_NUMBER_OF_SEARCH_REPLICAS_SETTING.exists(builder) && builder.get(SETTING_NUMBER_OF_SEARCH_REPLICAS) != null) { - if (INDEX_NUMBER_OF_SEARCH_REPLICAS_SETTING.get(requestSettings) > 0 - && Boolean.parseBoolean(builder.get(SETTING_REMOTE_STORE_ENABLED)) == false) { + private static void validateSearchOnlyReplicasSettings(Settings indexSettings) { + if (INDEX_NUMBER_OF_SEARCH_REPLICAS_SETTING.exists(indexSettings) && indexSettings.get(SETTING_NUMBER_OF_SEARCH_REPLICAS) != null) { + if (INDEX_NUMBER_OF_SEARCH_REPLICAS_SETTING.get(indexSettings) > 0 + && Boolean.parseBoolean(indexSettings.get(SETTING_REMOTE_STORE_ENABLED)) == false) { throw new IllegalArgumentException( "To set " + SETTING_NUMBER_OF_SEARCH_REPLICAS + ", " + SETTING_REMOTE_STORE_ENABLED + " must be set to true" ); } - builder.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, INDEX_NUMBER_OF_SEARCH_REPLICAS_SETTING.get(requestSettings)); } } diff --git a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java index 0bb9ec28a1efc..cd18343d20adf 100644 --- a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java +++ b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java @@ -32,6 +32,9 @@ package org.opensearch.cluster.metadata; +import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Before; import org.opensearch.ExceptionsHelper; import org.opensearch.ResourceAlreadyExistsException; import org.opensearch.Version; @@ -98,14 +101,12 @@ import org.opensearch.repositories.blobstore.BlobStoreRepository; import org.opensearch.snapshots.EmptySnapshotsInfoService; import org.opensearch.test.ClusterServiceUtils; +import org.opensearch.test.FeatureFlagSetter; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.test.VersionUtils; import org.opensearch.test.gateway.TestGatewayAllocator; import org.opensearch.threadpool.TestThreadPool; import org.opensearch.threadpool.ThreadPool; -import org.hamcrest.Matchers; -import org.junit.After; -import org.junit.Before; import java.io.IOException; import java.util.ArrayList; @@ -136,12 +137,24 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.hasValue; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_REPLICAS_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_SHARDS_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_READ_ONLY_BLOCK; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_REPLICATION_TYPE_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_REPLICAS; +import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_SEARCH_REPLICAS; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_SHARDS; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_READ_ONLY; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_REMOTE_SEGMENT_STORE_REPOSITORY; @@ -155,6 +168,7 @@ import static org.opensearch.cluster.metadata.MetadataCreateIndexService.getIndexNumberOfRoutingShards; import static org.opensearch.cluster.metadata.MetadataCreateIndexService.parseV1Mappings; import static org.opensearch.cluster.metadata.MetadataCreateIndexService.resolveAndValidateAliases; +import static org.opensearch.common.util.FeatureFlags.READER_WRITER_SPLIT_EXPERIMENTAL; import static org.opensearch.common.util.FeatureFlags.REMOTE_STORE_MIGRATION_EXPERIMENTAL; import static org.opensearch.index.IndexModule.INDEX_STORE_TYPE_SETTING; import static org.opensearch.index.IndexSettings.INDEX_MERGE_POLICY; @@ -175,17 +189,6 @@ import static org.opensearch.node.remotestore.RemoteStoreNodeAttribute.getRemoteStoreTranslogRepo; import static org.opensearch.node.remotestore.RemoteStoreNodeService.MIGRATION_DIRECTION_SETTING; import static org.opensearch.node.remotestore.RemoteStoreNodeService.REMOTE_STORE_COMPATIBILITY_MODE_SETTING; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasKey; -import static org.hamcrest.Matchers.hasValue; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.Matchers.startsWith; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; public class MetadataCreateIndexServiceTests extends OpenSearchTestCase { @@ -1963,6 +1966,61 @@ public void testValidateTranslogRetentionSettings() { ); } + public void testValidateSearchOnlySettingsWhenRemoteRepoNotConfiguredThrowsException() { + FeatureFlagSetter.set(READER_WRITER_SPLIT_EXPERIMENTAL); + request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); + final Settings.Builder requestSettings = Settings.builder(); + requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); + requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); + request.settings(requestSettings.build()); + + IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, ()-> + aggregateIndexSettings( + ClusterState.EMPTY_STATE, + request, + Settings.EMPTY, + null, + Settings.EMPTY, + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, + randomShardLimitService(), + Collections.emptySet(), + clusterSettings + )); + + assertEquals("To set index.number_of_search_only_replicas, " + + "index.remote_store.enabled must be set to true", + exception.getMessage() + ); + } + + public void testValidateSearchOnlySettingsWhenRemoteRepoConfigured() { + FeatureFlagSetter.set(READER_WRITER_SPLIT_EXPERIMENTAL); + ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) + .nodes(DiscoveryNodes.builder().add(getRemoteNode()).build()) + .build(); + Settings settings = Settings.builder().put(translogRepositoryNameAttributeKey, "my-translog-repo-1").build(); + + request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); + final Settings.Builder requestSettings = Settings.builder(); + requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); + requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); + request.settings(requestSettings.build()); + + Settings aggregatedIndexSettings = aggregateIndexSettings( + clusterState, + request, + Settings.EMPTY, + null, + settings, + IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, + randomShardLimitService(), + Collections.emptySet(), + clusterSettings + ); + + assertEquals("1", aggregatedIndexSettings.get(SETTING_NUMBER_OF_SEARCH_REPLICAS)); + } + public void testIndexLifecycleNameSetting() { // see: https://github.com/opensearch-project/OpenSearch/issues/1019 final Settings ilnSetting = Settings.builder().put("index.lifecycle.name", "dummy").build(); From f91ad85cd46b5ef4c9850eeefeddfa91255496fa Mon Sep 17 00:00:00 2001 From: Vinay Krishna Pudyodu Date: Wed, 22 Jan 2025 14:43:01 -0800 Subject: [PATCH 2/4] Added Changelog and fixed style issues Signed-off-by: Vinay Krishna Pudyodu --- CHANGELOG.md | 2 +- .../MetadataCreateIndexServiceTests.java | 44 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bc7a246fd2b1..c7005295e31e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Added a new `time` field to replace the deprecated `getTime` field in `GetStats`. ([#17009](https://github.com/opensearch-project/OpenSearch/pull/17009)) - Improve flat_object field parsing performance by reducing two passes to a single pass ([#16297](https://github.com/opensearch-project/OpenSearch/pull/16297)) - Improve performance of the bitmap filtering([#16936](https://github.com/opensearch-project/OpenSearch/pull/16936/)) - +- Updated the validation for search only replica settings([#17093](https://github.com/opensearch-project/OpenSearch/pull/17093/)) ### Dependencies - Bump `com.google.cloud:google-cloud-core-http` from 2.23.0 to 2.47.0 ([#16504](https://github.com/opensearch-project/OpenSearch/pull/16504)) - Bump `google-auth-library-oauth2-http` from 1.7.0 to 1.29.0 in /plugins/repository-gcs ([#16520](https://github.com/opensearch-project/OpenSearch/pull/16520)) diff --git a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java index cd18343d20adf..54499939c0672 100644 --- a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java +++ b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java @@ -32,9 +32,6 @@ package org.opensearch.cluster.metadata; -import org.hamcrest.Matchers; -import org.junit.After; -import org.junit.Before; import org.opensearch.ExceptionsHelper; import org.opensearch.ResourceAlreadyExistsException; import org.opensearch.Version; @@ -107,6 +104,9 @@ import org.opensearch.test.gateway.TestGatewayAllocator; import org.opensearch.threadpool.TestThreadPool; import org.opensearch.threadpool.ThreadPool; +import org.hamcrest.Matchers; +import org.junit.After; +import org.junit.Before; import java.io.IOException; import java.util.ArrayList; @@ -137,17 +137,6 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.endsWith; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasKey; -import static org.hamcrest.Matchers.hasValue; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; -import static org.hamcrest.Matchers.startsWith; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_REPLICAS_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_ROUTING_SHARDS_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_NUMBER_OF_SHARDS_SETTING; @@ -189,6 +178,17 @@ import static org.opensearch.node.remotestore.RemoteStoreNodeAttribute.getRemoteStoreTranslogRepo; import static org.opensearch.node.remotestore.RemoteStoreNodeService.MIGRATION_DIRECTION_SETTING; import static org.opensearch.node.remotestore.RemoteStoreNodeService.REMOTE_STORE_COMPATIBILITY_MODE_SETTING; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.endsWith; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasKey; +import static org.hamcrest.Matchers.hasValue; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class MetadataCreateIndexServiceTests extends OpenSearchTestCase { @@ -1971,11 +1971,12 @@ public void testValidateSearchOnlySettingsWhenRemoteRepoNotConfiguredThrowsExcep request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); final Settings.Builder requestSettings = Settings.builder(); requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); - requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); + requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); request.settings(requestSettings.build()); - IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, ()-> - aggregateIndexSettings( + IllegalArgumentException exception = assertThrows( + IllegalArgumentException.class, + () -> aggregateIndexSettings( ClusterState.EMPTY_STATE, request, Settings.EMPTY, @@ -1985,10 +1986,11 @@ public void testValidateSearchOnlySettingsWhenRemoteRepoNotConfiguredThrowsExcep randomShardLimitService(), Collections.emptySet(), clusterSettings - )); + ) + ); - assertEquals("To set index.number_of_search_only_replicas, " + - "index.remote_store.enabled must be set to true", + assertEquals( + "To set index.number_of_search_only_replicas, " + "index.remote_store.enabled must be set to true", exception.getMessage() ); } @@ -2003,7 +2005,7 @@ public void testValidateSearchOnlySettingsWhenRemoteRepoConfigured() { request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); final Settings.Builder requestSettings = Settings.builder(); requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); - requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); + requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); request.settings(requestSettings.build()); Settings aggregatedIndexSettings = aggregateIndexSettings( From 5ffbe1ebec50aa37989ddb2306d646e4ea4b5a77 Mon Sep 17 00:00:00 2001 From: Vinay Krishna Pudyodu Date: Mon, 27 Jan 2025 17:26:15 -0800 Subject: [PATCH 3/4] Removed the tests as its already covered in SearchOnlyReplicaTests Signed-off-by: Vinay Krishna Pudyodu --- .../MetadataCreateIndexServiceTests.java | 60 ------------------- 1 file changed, 60 deletions(-) diff --git a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java index 54499939c0672..0bb9ec28a1efc 100644 --- a/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java +++ b/server/src/test/java/org/opensearch/cluster/metadata/MetadataCreateIndexServiceTests.java @@ -98,7 +98,6 @@ import org.opensearch.repositories.blobstore.BlobStoreRepository; import org.opensearch.snapshots.EmptySnapshotsInfoService; import org.opensearch.test.ClusterServiceUtils; -import org.opensearch.test.FeatureFlagSetter; import org.opensearch.test.OpenSearchTestCase; import org.opensearch.test.VersionUtils; import org.opensearch.test.gateway.TestGatewayAllocator; @@ -143,7 +142,6 @@ import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_READ_ONLY_BLOCK; import static org.opensearch.cluster.metadata.IndexMetadata.INDEX_REPLICATION_TYPE_SETTING; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_REPLICAS; -import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_SEARCH_REPLICAS; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_NUMBER_OF_SHARDS; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_READ_ONLY; import static org.opensearch.cluster.metadata.IndexMetadata.SETTING_REMOTE_SEGMENT_STORE_REPOSITORY; @@ -157,7 +155,6 @@ import static org.opensearch.cluster.metadata.MetadataCreateIndexService.getIndexNumberOfRoutingShards; import static org.opensearch.cluster.metadata.MetadataCreateIndexService.parseV1Mappings; import static org.opensearch.cluster.metadata.MetadataCreateIndexService.resolveAndValidateAliases; -import static org.opensearch.common.util.FeatureFlags.READER_WRITER_SPLIT_EXPERIMENTAL; import static org.opensearch.common.util.FeatureFlags.REMOTE_STORE_MIGRATION_EXPERIMENTAL; import static org.opensearch.index.IndexModule.INDEX_STORE_TYPE_SETTING; import static org.opensearch.index.IndexSettings.INDEX_MERGE_POLICY; @@ -1966,63 +1963,6 @@ public void testValidateTranslogRetentionSettings() { ); } - public void testValidateSearchOnlySettingsWhenRemoteRepoNotConfiguredThrowsException() { - FeatureFlagSetter.set(READER_WRITER_SPLIT_EXPERIMENTAL); - request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); - final Settings.Builder requestSettings = Settings.builder(); - requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); - requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); - request.settings(requestSettings.build()); - - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> aggregateIndexSettings( - ClusterState.EMPTY_STATE, - request, - Settings.EMPTY, - null, - Settings.EMPTY, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, - randomShardLimitService(), - Collections.emptySet(), - clusterSettings - ) - ); - - assertEquals( - "To set index.number_of_search_only_replicas, " + "index.remote_store.enabled must be set to true", - exception.getMessage() - ); - } - - public void testValidateSearchOnlySettingsWhenRemoteRepoConfigured() { - FeatureFlagSetter.set(READER_WRITER_SPLIT_EXPERIMENTAL); - ClusterState clusterState = ClusterState.builder(ClusterName.DEFAULT) - .nodes(DiscoveryNodes.builder().add(getRemoteNode()).build()) - .build(); - Settings settings = Settings.builder().put(translogRepositoryNameAttributeKey, "my-translog-repo-1").build(); - - request = new CreateIndexClusterStateUpdateRequest("create index", "test", "test"); - final Settings.Builder requestSettings = Settings.builder(); - requestSettings.put(SETTING_NUMBER_OF_SEARCH_REPLICAS, "1"); - requestSettings.put(IndexMetadata.SETTING_REPLICATION_TYPE, ReplicationType.SEGMENT); - request.settings(requestSettings.build()); - - Settings aggregatedIndexSettings = aggregateIndexSettings( - clusterState, - request, - Settings.EMPTY, - null, - settings, - IndexScopedSettings.DEFAULT_SCOPED_SETTINGS, - randomShardLimitService(), - Collections.emptySet(), - clusterSettings - ); - - assertEquals("1", aggregatedIndexSettings.get(SETTING_NUMBER_OF_SEARCH_REPLICAS)); - } - public void testIndexLifecycleNameSetting() { // see: https://github.com/opensearch-project/OpenSearch/issues/1019 final Settings ilnSetting = Settings.builder().put("index.lifecycle.name", "dummy").build(); From cd9c6bc3a1d6a52a52a5e3d45f5b54c5e0e8ed58 Mon Sep 17 00:00:00 2001 From: Vinay Krishna Pudyodu Date: Mon, 3 Feb 2025 16:31:54 -0800 Subject: [PATCH 4/4] Removed the changelog entry as there is not userfacing changes Signed-off-by: Vinay Krishna Pudyodu --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 848a2f655d549..9d1f544f2f03a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,7 +41,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Propagate the sourceIncludes and excludes fields from fetchSourceContext to FieldsVisitor. ([#17080](https://github.com/opensearch-project/OpenSearch/pull/17080)) - [Star Tree] [Search] Resolving Date histogram with metric aggregation using star-tree ([#16674](https://github.com/opensearch-project/OpenSearch/pull/16674)) - [Star Tree] [Search] Extensible design to support different query and field types ([#17137](https://github.com/opensearch-project/OpenSearch/pull/17137)) -- Updated the validation for search only replica settings([#17093](https://github.com/opensearch-project/OpenSearch/pull/17093/)) ### Dependencies - Bump `com.google.cloud:google-cloud-core-http` from 2.23.0 to 2.47.0 ([#16504](https://github.com/opensearch-project/OpenSearch/pull/16504))