From 4ab033c52ecc316e67246c9b07e1fb1d4e6f6c91 Mon Sep 17 00:00:00 2001 From: guojialiang Date: Thu, 10 Apr 2025 17:33:17 +0800 Subject: [PATCH 1/8] support merged segment warmer Signed-off-by: guojialiang --- .../org/opensearch/index/IndexService.java | 7 +- .../opensearch/index/engine/EngineConfig.java | 18 +++++ .../index/engine/EngineConfigFactory.java | 5 +- .../index/engine/InternalEngine.java | 3 + .../engine/LocalMergedSegmentWarmer.java | 63 +++++++++++++++++ .../engine/MergedSegmentWarmerFactory.java | 67 +++++++++++++++++++ .../RemoteStoreMergedSegmentWarmer.java | 67 +++++++++++++++++++ .../opensearch/index/shard/IndexShard.java | 9 ++- .../opensearch/indices/IndicesService.java | 7 +- .../cluster/IndicesClusterStateService.java | 19 ++++-- .../main/java/org/opensearch/node/Node.java | 5 ++ ...ClusterStateServiceRandomUpdatesTests.java | 1 + 12 files changed, 259 insertions(+), 12 deletions(-) create mode 100644 server/src/main/java/org/opensearch/index/engine/LocalMergedSegmentWarmer.java create mode 100644 server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java create mode 100644 server/src/main/java/org/opensearch/index/engine/RemoteStoreMergedSegmentWarmer.java diff --git a/server/src/main/java/org/opensearch/index/IndexService.java b/server/src/main/java/org/opensearch/index/IndexService.java index de269f1676f1c..837f49e1e128f 100644 --- a/server/src/main/java/org/opensearch/index/IndexService.java +++ b/server/src/main/java/org/opensearch/index/IndexService.java @@ -76,6 +76,7 @@ import org.opensearch.index.engine.Engine; import org.opensearch.index.engine.EngineConfigFactory; import org.opensearch.index.engine.EngineFactory; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.fielddata.IndexFieldDataCache; import org.opensearch.index.fielddata.IndexFieldDataService; import org.opensearch.index.mapper.MapperService; @@ -577,7 +578,8 @@ public synchronized IndexShard createShard( final RepositoriesService repositoriesService, final DiscoveryNode targetNode, @Nullable DiscoveryNode sourceNode, - DiscoveryNodes discoveryNodes + DiscoveryNodes discoveryNodes, + MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) throws IOException { Objects.requireNonNull(retentionLeaseSyncer); /* @@ -704,7 +706,8 @@ protected void closeInternal() { remoteStoreSettings, seedRemote, discoveryNodes, - segmentReplicationStatsProvider + segmentReplicationStatsProvider, + mergedSegmentWarmerFactory ); eventListener.indexShardStateChanged(indexShard, null, indexShard.state(), "shard created"); eventListener.afterIndexShardCreated(indexShard); diff --git a/server/src/main/java/org/opensearch/index/engine/EngineConfig.java b/server/src/main/java/org/opensearch/index/engine/EngineConfig.java index 6540e69e7dfcd..f2facbd0dffa9 100644 --- a/server/src/main/java/org/opensearch/index/engine/EngineConfig.java +++ b/server/src/main/java/org/opensearch/index/engine/EngineConfig.java @@ -33,6 +33,7 @@ import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.codecs.Codec; +import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.MergePolicy; import org.apache.lucene.search.QueryCache; @@ -248,6 +249,8 @@ private static void doValidateCodecSettings(final String codec) { private final TranslogFactory translogFactory; + private final IndexWriter.IndexReaderWarmer indexReaderWarmer; + /** * Creates a new {@link org.opensearch.index.engine.EngineConfig} */ @@ -299,6 +302,7 @@ private EngineConfig(Builder builder) { this.translogFactory = builder.translogFactory; this.leafSorter = builder.leafSorter; this.documentMapperForTypeSupplier = builder.documentMapperForTypeSupplier; + this.indexReaderWarmer = builder.indexReaderWarmer; } /** @@ -523,6 +527,14 @@ public TranslogFactory getTranslogFactory() { return translogFactory; } + /** + * Returns the underlying indexReaderWarmer + * @return the indexReaderWarmer + */ + public IndexWriter.IndexReaderWarmer getIndexReaderWarmer() { + return indexReaderWarmer; + } + /** * A supplier supplies tombstone documents which will be used in soft-update methods. * The returned document consists only _uid, _seqno, _term and _version fields; other metadata fields are excluded. @@ -598,6 +610,7 @@ public static class Builder { private TranslogFactory translogFactory = new InternalTranslogFactory(); private Supplier documentMapperForTypeSupplier; Comparator leafSorter; + private IndexWriter.IndexReaderWarmer indexReaderWarmer; public Builder shardId(ShardId shardId) { this.shardId = shardId; @@ -739,6 +752,11 @@ public Builder leafSorter(Comparator leafSorter) { return this; } + public Builder indexReaderWarmer(IndexWriter.IndexReaderWarmer indexReaderWarmer) { + this.indexReaderWarmer = indexReaderWarmer; + return this; + } + public EngineConfig build() { return new EngineConfig(this); } diff --git a/server/src/main/java/org/opensearch/index/engine/EngineConfigFactory.java b/server/src/main/java/org/opensearch/index/engine/EngineConfigFactory.java index d892d6e95346c..81fa90dfdd78f 100644 --- a/server/src/main/java/org/opensearch/index/engine/EngineConfigFactory.java +++ b/server/src/main/java/org/opensearch/index/engine/EngineConfigFactory.java @@ -10,6 +10,7 @@ import org.apache.logging.log4j.Logger; import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.LeafReader; import org.apache.lucene.index.MergePolicy; import org.apache.lucene.search.QueryCache; @@ -156,7 +157,8 @@ public EngineConfig newEngineConfig( BooleanSupplier startedPrimarySupplier, TranslogFactory translogFactory, Comparator leafSorter, - Supplier documentMapperForTypeSupplier + Supplier documentMapperForTypeSupplier, + IndexWriter.IndexReaderWarmer indexReaderWarmer ) { CodecService codecServiceToUse = codecService; if (codecService == null && this.codecServiceFactory != null) { @@ -191,6 +193,7 @@ public EngineConfig newEngineConfig( .translogFactory(translogFactory) .leafSorter(leafSorter) .documentMapperForTypeSupplier(documentMapperForTypeSupplier) + .indexReaderWarmer(indexReaderWarmer) .build(); } diff --git a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java index 7e171e3f1714c..1fa13e8ed28ca 100644 --- a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java +++ b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java @@ -2382,6 +2382,9 @@ private IndexWriterConfig getIndexWriterConfig() { if (config().getLeafSorter() != null) { iwc.setLeafSorter(config().getLeafSorter()); // The default segment search order } + if (config().getIndexSettings().isSegRepEnabledOrRemoteNode()) { + iwc.setMergedSegmentWarmer(config().getIndexReaderWarmer()); + } return iwc; } diff --git a/server/src/main/java/org/opensearch/index/engine/LocalMergedSegmentWarmer.java b/server/src/main/java/org/opensearch/index/engine/LocalMergedSegmentWarmer.java new file mode 100644 index 0000000000000..4eabd9399eadf --- /dev/null +++ b/server/src/main/java/org/opensearch/index/engine/LocalMergedSegmentWarmer.java @@ -0,0 +1,63 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Modifications Copyright OpenSearch Contributors. See + * GitHub history for details. + */ + +package org.opensearch.index.engine; + +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.LeafReader; +import org.opensearch.cluster.service.ClusterService; +import org.opensearch.indices.recovery.RecoverySettings; +import org.opensearch.transport.TransportService; + +import java.io.IOException; + +/** + * Implementation of a {@link IndexWriter.IndexReaderWarmer} when local on-disk segment replication is enabled. + * + * @opensearch.internal + */ +public class LocalMergedSegmentWarmer implements IndexWriter.IndexReaderWarmer { + private final TransportService transportService; + private final RecoverySettings recoverySettings; + private final ClusterService clusterService; + + public LocalMergedSegmentWarmer(TransportService transportService, RecoverySettings recoverySettings, ClusterService clusterService) { + this.transportService = transportService; + this.recoverySettings = recoverySettings; + this.clusterService = clusterService; + } + + @Override + public void warm(LeafReader leafReader) throws IOException { + // TODO: node-node segment replication merged segment warmer + } +} diff --git a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java new file mode 100644 index 0000000000000..1530f816b3eec --- /dev/null +++ b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Modifications Copyright OpenSearch Contributors. See + * GitHub history for details. + */ + +package org.opensearch.index.engine; + +import org.apache.lucene.index.IndexWriter; +import org.opensearch.cluster.service.ClusterService; +import org.opensearch.common.annotation.ExperimentalApi; +import org.opensearch.index.shard.IndexShard; +import org.opensearch.indices.recovery.RecoverySettings; +import org.opensearch.transport.TransportService; + +/** + * MergedSegmentWarmerFactory to enable creation of various local on-disk + * and remote store flavors of {@link IndexWriter.IndexReaderWarmer} + * + * @opensearch.internal + */ +@ExperimentalApi +public class MergedSegmentWarmerFactory { + private final TransportService transportService; + private final RecoverySettings recoverySettings; + private final ClusterService clusterService; + + public MergedSegmentWarmerFactory(TransportService transportService, RecoverySettings recoverySettings, ClusterService clusterService) { + this.transportService = transportService; + this.recoverySettings = recoverySettings; + this.clusterService = clusterService; + } + + public IndexWriter.IndexReaderWarmer get(IndexShard shard) { + if (shard.indexSettings().isAssignedOnRemoteNode()) { + return new RemoteStoreMergedSegmentWarmer(transportService, recoverySettings, clusterService); + } else { + return new LocalMergedSegmentWarmer(transportService, recoverySettings, clusterService); + } + } +} diff --git a/server/src/main/java/org/opensearch/index/engine/RemoteStoreMergedSegmentWarmer.java b/server/src/main/java/org/opensearch/index/engine/RemoteStoreMergedSegmentWarmer.java new file mode 100644 index 0000000000000..f3d5f8a4cc93b --- /dev/null +++ b/server/src/main/java/org/opensearch/index/engine/RemoteStoreMergedSegmentWarmer.java @@ -0,0 +1,67 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * Modifications Copyright OpenSearch Contributors. See + * GitHub history for details. + */ + +package org.opensearch.index.engine; + +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.LeafReader; +import org.opensearch.cluster.service.ClusterService; +import org.opensearch.indices.recovery.RecoverySettings; +import org.opensearch.transport.TransportService; + +import java.io.IOException; + +/** + * Implementation of a {@link IndexWriter.IndexReaderWarmer} when remote store is enabled. + * + * @opensearch.internal + */ +public class RemoteStoreMergedSegmentWarmer implements IndexWriter.IndexReaderWarmer { + private final TransportService transportService; + private final RecoverySettings recoverySettings; + private final ClusterService clusterService; + + public RemoteStoreMergedSegmentWarmer( + TransportService transportService, + RecoverySettings recoverySettings, + ClusterService clusterService + ) { + this.transportService = transportService; + this.recoverySettings = recoverySettings; + this.clusterService = clusterService; + } + + @Override + public void warm(LeafReader leafReader) throws IOException { + // TODO: remote store merged segment warmer + } +} diff --git a/server/src/main/java/org/opensearch/index/shard/IndexShard.java b/server/src/main/java/org/opensearch/index/shard/IndexShard.java index b0a5212b1d330..e38f6408b9b17 100644 --- a/server/src/main/java/org/opensearch/index/shard/IndexShard.java +++ b/server/src/main/java/org/opensearch/index/shard/IndexShard.java @@ -129,6 +129,7 @@ import org.opensearch.index.engine.EngineException; import org.opensearch.index.engine.EngineFactory; import org.opensearch.index.engine.IngestionEngine; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.engine.NRTReplicationEngine; import org.opensearch.index.engine.ReadOnlyEngine; import org.opensearch.index.engine.RefreshFailedEngineException; @@ -367,6 +368,7 @@ Runnable getGlobalCheckpointSyncer() { private final ShardMigrationState shardMigrationState; private DiscoveryNodes discoveryNodes; private final Function segmentReplicationStatsProvider; + private final MergedSegmentWarmerFactory mergedSegmentWarmerFactory; public IndexShard( final ShardRouting shardRouting, @@ -398,7 +400,8 @@ public IndexShard( final RemoteStoreSettings remoteStoreSettings, boolean seedRemote, final DiscoveryNodes discoveryNodes, - final Function segmentReplicationStatsProvider + final Function segmentReplicationStatsProvider, + final MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) throws IOException { super(shardRouting.shardId(), indexSettings); assert shardRouting.initializing(); @@ -501,6 +504,7 @@ public boolean shouldCache(Query query) { this.shardMigrationState = getShardMigrationState(indexSettings, seedRemote); this.discoveryNodes = discoveryNodes; this.segmentReplicationStatsProvider = segmentReplicationStatsProvider; + this.mergedSegmentWarmerFactory = mergedSegmentWarmerFactory; } /** @@ -4096,7 +4100,8 @@ private EngineConfig newEngineConfig(LongSupplier globalCheckpointSupplier) thro translogFactorySupplier.apply(indexSettings, shardRouting), isTimeSeriesDescSortOptimizationEnabled() ? DataStream.TIMESERIES_LEAF_SORTER : null, // DESC @timestamp default order for // timeseries - () -> docMapper() + () -> docMapper(), + mergedSegmentWarmerFactory.get(this) ); } diff --git a/server/src/main/java/org/opensearch/indices/IndicesService.java b/server/src/main/java/org/opensearch/indices/IndicesService.java index ec60fa61d0c99..a24db145e5421 100644 --- a/server/src/main/java/org/opensearch/indices/IndicesService.java +++ b/server/src/main/java/org/opensearch/indices/IndicesService.java @@ -114,6 +114,7 @@ import org.opensearch.index.engine.EngineConfigFactory; import org.opensearch.index.engine.EngineFactory; import org.opensearch.index.engine.InternalEngineFactory; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.engine.NRTReplicationEngineFactory; import org.opensearch.index.engine.NoOpEngine; import org.opensearch.index.engine.ReadOnlyEngine; @@ -1166,7 +1167,8 @@ public IndexShard createShard( final DiscoveryNode targetNode, final DiscoveryNode sourceNode, final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory, - final DiscoveryNodes discoveryNodes + final DiscoveryNodes discoveryNodes, + final MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) throws IOException { Objects.requireNonNull(retentionLeaseSyncer); ensureChangesAllowed(); @@ -1182,7 +1184,8 @@ public IndexShard createShard( repositoriesService, targetNode, sourceNode, - discoveryNodes + discoveryNodes, + mergedSegmentWarmerFactory ); indexShard.addShardFailureCallback(onShardFailure); indexShard.startRecovery(recoveryState, recoveryTargetService, recoveryListener, repositoriesService, mapping -> { diff --git a/server/src/main/java/org/opensearch/indices/cluster/IndicesClusterStateService.java b/server/src/main/java/org/opensearch/indices/cluster/IndicesClusterStateService.java index d35ae46442fa3..f7ac53db126b5 100644 --- a/server/src/main/java/org/opensearch/indices/cluster/IndicesClusterStateService.java +++ b/server/src/main/java/org/opensearch/indices/cluster/IndicesClusterStateService.java @@ -66,6 +66,7 @@ import org.opensearch.index.IndexComponent; import org.opensearch.index.IndexService; import org.opensearch.index.IndexSettings; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.remote.RemoteStoreStatsTrackerFactory; import org.opensearch.index.seqno.GlobalCheckpointSyncAction; import org.opensearch.index.seqno.ReplicationTracker; @@ -151,6 +152,8 @@ public class IndicesClusterStateService extends AbstractLifecycleComponent imple private final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory; + private final MergedSegmentWarmerFactory mergedSegmentWarmerFactory; + @Inject public IndicesClusterStateService( final Settings settings, @@ -170,7 +173,8 @@ public IndicesClusterStateService( final GlobalCheckpointSyncAction globalCheckpointSyncAction, final RetentionLeaseSyncer retentionLeaseSyncer, final SegmentReplicationCheckpointPublisher checkpointPublisher, - final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory + final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory, + final MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) { this( settings, @@ -190,7 +194,8 @@ public IndicesClusterStateService( primaryReplicaSyncer, globalCheckpointSyncAction::updateGlobalCheckpointForShard, retentionLeaseSyncer, - remoteStoreStatsTrackerFactory + remoteStoreStatsTrackerFactory, + mergedSegmentWarmerFactory ); } @@ -213,7 +218,8 @@ public IndicesClusterStateService( final PrimaryReplicaSyncer primaryReplicaSyncer, final Consumer globalCheckpointSyncer, final RetentionLeaseSyncer retentionLeaseSyncer, - final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory + final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory, + final MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) { this.settings = settings; this.checkpointPublisher = checkpointPublisher; @@ -238,6 +244,7 @@ public IndicesClusterStateService( this.retentionLeaseSyncer = Objects.requireNonNull(retentionLeaseSyncer); this.sendRefreshMapping = settings.getAsBoolean("indices.cluster.send_refresh_mapping", true); this.remoteStoreStatsTrackerFactory = remoteStoreStatsTrackerFactory; + this.mergedSegmentWarmerFactory = mergedSegmentWarmerFactory; } @Override @@ -681,7 +688,8 @@ private void createShard(DiscoveryNodes nodes, RoutingTable routingTable, ShardR nodes.getLocalNode(), sourceNode, remoteStoreStatsTrackerFactory, - nodes + nodes, + mergedSegmentWarmerFactory ); } catch (Exception e) { failAndRemoveShard(shardRouting, true, "failed to create shard", e, state); @@ -1062,7 +1070,8 @@ T createShard( DiscoveryNode targetNode, @Nullable DiscoveryNode sourceNode, RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory, - DiscoveryNodes discoveryNodes + DiscoveryNodes discoveryNodes, + MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) throws IOException; /** diff --git a/server/src/main/java/org/opensearch/node/Node.java b/server/src/main/java/org/opensearch/node/Node.java index 8037f90653d89..4074d06ffac2b 100644 --- a/server/src/main/java/org/opensearch/node/Node.java +++ b/server/src/main/java/org/opensearch/node/Node.java @@ -153,6 +153,7 @@ import org.opensearch.index.analysis.AnalysisRegistry; import org.opensearch.index.compositeindex.CompositeIndexSettings; import org.opensearch.index.engine.EngineFactory; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.recovery.RemoteStoreRestoreService; import org.opensearch.index.remote.RemoteIndexPathUploader; import org.opensearch.index.remote.RemoteStoreStatsTrackerFactory; @@ -449,6 +450,7 @@ public static class DiscoverySettings { private final AtomicReference runnableTaskListener; private FileCache fileCache; private final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory; + private final MergedSegmentWarmerFactory mergedSegmentWarmerFactory; public Node(Environment environment) { this(environment, Collections.emptyList(), true); @@ -1433,6 +1435,8 @@ protected Node( resourcesToClose.add(persistentTasksClusterService); final PersistentTasksService persistentTasksService = new PersistentTasksService(clusterService, threadPool, client); + mergedSegmentWarmerFactory = new MergedSegmentWarmerFactory(transportService, recoverySettings, clusterService); + modules.add(b -> { b.bind(Node.class).toInstance(this); b.bind(NodeService.class).toInstance(nodeService); @@ -1534,6 +1538,7 @@ protected Node( b.bind(SegmentReplicationStatsTracker.class).toInstance(segmentReplicationStatsTracker); b.bind(SearchRequestOperationsCompositeListenerFactory.class).toInstance(searchRequestOperationsCompositeListenerFactory); b.bind(SegmentReplicator.class).toInstance(segmentReplicator); + b.bind(MergedSegmentWarmerFactory.class).toInstance(mergedSegmentWarmerFactory); taskManagerClientOptional.ifPresent(value -> b.bind(TaskManagerClient.class).toInstance(value)); }); diff --git a/server/src/test/java/org/opensearch/indices/cluster/IndicesClusterStateServiceRandomUpdatesTests.java b/server/src/test/java/org/opensearch/indices/cluster/IndicesClusterStateServiceRandomUpdatesTests.java index 22bf337b05598..7cc59aaaa9347 100644 --- a/server/src/test/java/org/opensearch/indices/cluster/IndicesClusterStateServiceRandomUpdatesTests.java +++ b/server/src/test/java/org/opensearch/indices/cluster/IndicesClusterStateServiceRandomUpdatesTests.java @@ -584,6 +584,7 @@ private IndicesClusterStateService createIndicesClusterStateService( primaryReplicaSyncer, s -> {}, RetentionLeaseSyncer.EMPTY, + null, null ); } From e012362e1ed49f5cbe6ac6f76ce1758c1d469fb2 Mon Sep 17 00:00:00 2001 From: guojialiang Date: Thu, 10 Apr 2025 20:19:00 +0800 Subject: [PATCH 2/8] Introduce MergedSegmentWarmerFactory for Local/Remote merged segment pre copy Signed-off-by: guojialiang --- .../java/org/opensearch/index/shard/IndexShardIT.java | 4 +++- .../opensearch/index/engine/MergedSegmentWarmerFactory.java | 4 +++- .../org/opensearch/index/engine/EngineConfigFactoryTests.java | 2 ++ .../indices/IndicesLifecycleListenerSingleNodeTests.java | 4 +++- .../java/org/opensearch/indices/IndicesRequestCacheTests.java | 4 +++- .../cluster/AbstractIndicesClusterStateServiceTestCase.java | 4 +++- .../org/opensearch/snapshots/SnapshotResiliencyTests.java | 4 +++- .../java/org/opensearch/index/shard/IndexShardTestCase.java | 4 +++- 8 files changed, 23 insertions(+), 7 deletions(-) diff --git a/server/src/internalClusterTest/java/org/opensearch/index/shard/IndexShardIT.java b/server/src/internalClusterTest/java/org/opensearch/index/shard/IndexShardIT.java index 2d0918ff6e89a..37e6d23f22fcb 100644 --- a/server/src/internalClusterTest/java/org/opensearch/index/shard/IndexShardIT.java +++ b/server/src/internalClusterTest/java/org/opensearch/index/shard/IndexShardIT.java @@ -74,6 +74,7 @@ import org.opensearch.index.VersionType; import org.opensearch.index.engine.CommitStats; import org.opensearch.index.engine.Engine; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.engine.NoOpEngine; import org.opensearch.index.flush.FlushStats; import org.opensearch.index.mapper.MapperService; @@ -719,7 +720,8 @@ public static final IndexShard newIndexShard( DefaultRemoteStoreSettings.INSTANCE, false, IndexShardTestUtils.getFakeDiscoveryNodes(initializingShardRouting), - mock(Function.class) + mock(Function.class), + new MergedSegmentWarmerFactory(null, null, null) ); } diff --git a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java index 1530f816b3eec..6c4a6e1891bd1 100644 --- a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java +++ b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java @@ -60,8 +60,10 @@ public MergedSegmentWarmerFactory(TransportService transportService, RecoverySet public IndexWriter.IndexReaderWarmer get(IndexShard shard) { if (shard.indexSettings().isAssignedOnRemoteNode()) { return new RemoteStoreMergedSegmentWarmer(transportService, recoverySettings, clusterService); - } else { + } else if (shard.indexSettings().isSegRepLocalEnabled()) { return new LocalMergedSegmentWarmer(transportService, recoverySettings, clusterService); + } else { + return null; } } } diff --git a/server/src/test/java/org/opensearch/index/engine/EngineConfigFactoryTests.java b/server/src/test/java/org/opensearch/index/engine/EngineConfigFactoryTests.java index f8ed68eb2e0a3..acb55c33a3265 100644 --- a/server/src/test/java/org/opensearch/index/engine/EngineConfigFactoryTests.java +++ b/server/src/test/java/org/opensearch/index/engine/EngineConfigFactoryTests.java @@ -71,6 +71,7 @@ public void testCreateEngineConfigFromFactory() { () -> Boolean.TRUE, new InternalTranslogFactory(), null, + null, null ); @@ -152,6 +153,7 @@ public void testCreateCodecServiceFromFactory() { () -> Boolean.TRUE, new InternalTranslogFactory(), null, + null, null ); assertNotNull(config.getCodec()); diff --git a/server/src/test/java/org/opensearch/indices/IndicesLifecycleListenerSingleNodeTests.java b/server/src/test/java/org/opensearch/indices/IndicesLifecycleListenerSingleNodeTests.java index 0428bdf0655b0..0d41230f7a20b 100644 --- a/server/src/test/java/org/opensearch/indices/IndicesLifecycleListenerSingleNodeTests.java +++ b/server/src/test/java/org/opensearch/indices/IndicesLifecycleListenerSingleNodeTests.java @@ -44,6 +44,7 @@ import org.opensearch.core.index.shard.ShardId; import org.opensearch.index.IndexService; import org.opensearch.index.IndexSettings; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.seqno.RetentionLeaseSyncer; import org.opensearch.index.shard.IndexEventListener; import org.opensearch.index.shard.IndexShard; @@ -166,7 +167,8 @@ public void afterIndexRemoved(Index index, IndexSettings indexSettings, IndexRem null, localNode, null, - DiscoveryNodes.builder().add(localNode).build() + DiscoveryNodes.builder().add(localNode).build(), + new MergedSegmentWarmerFactory(null, null, null) ); IndexShardTestCase.updateRoutingEntry(shard, newRouting); assertEquals(5, counter.get()); diff --git a/server/src/test/java/org/opensearch/indices/IndicesRequestCacheTests.java b/server/src/test/java/org/opensearch/indices/IndicesRequestCacheTests.java index a60e9b381a8d3..0ba97f1d5db09 100644 --- a/server/src/test/java/org/opensearch/indices/IndicesRequestCacheTests.java +++ b/server/src/test/java/org/opensearch/indices/IndicesRequestCacheTests.java @@ -81,6 +81,7 @@ import org.opensearch.index.IndexService; import org.opensearch.index.cache.request.RequestCacheStats; import org.opensearch.index.cache.request.ShardRequestCache; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.query.TermQueryBuilder; import org.opensearch.index.seqno.RetentionLeaseSyncer; import org.opensearch.index.shard.IndexShard; @@ -1420,7 +1421,8 @@ public void testDeleteAndCreateIndexShardOnSameNodeAndVerifyStats() throws Excep null, localNode, null, - DiscoveryNodes.builder().add(localNode).build() + DiscoveryNodes.builder().add(localNode).build(), + new MergedSegmentWarmerFactory(null, null, null) ); // Verify that the new shard requestStats entries are empty. diff --git a/server/src/test/java/org/opensearch/indices/cluster/AbstractIndicesClusterStateServiceTestCase.java b/server/src/test/java/org/opensearch/indices/cluster/AbstractIndicesClusterStateServiceTestCase.java index 0490228a5cc16..9cd8bee123dca 100644 --- a/server/src/test/java/org/opensearch/indices/cluster/AbstractIndicesClusterStateServiceTestCase.java +++ b/server/src/test/java/org/opensearch/indices/cluster/AbstractIndicesClusterStateServiceTestCase.java @@ -47,6 +47,7 @@ import org.opensearch.core.index.shard.ShardId; import org.opensearch.index.IndexService; import org.opensearch.index.IndexSettings; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.remote.RemoteStoreStatsTrackerFactory; import org.opensearch.index.seqno.RetentionLeaseSyncer; import org.opensearch.index.shard.IndexEventListener; @@ -266,7 +267,8 @@ public MockIndexShard createShard( final DiscoveryNode targetNode, final DiscoveryNode sourceNode, final RemoteStoreStatsTrackerFactory remoteStoreStatsTrackerFactory, - final DiscoveryNodes discoveryNodes + final DiscoveryNodes discoveryNodes, + final MergedSegmentWarmerFactory mergedSegmentWarmerFactory ) throws IOException { failRandomly(); RecoveryState recoveryState = new RecoveryState(shardRouting, targetNode, sourceNode); diff --git a/server/src/test/java/org/opensearch/snapshots/SnapshotResiliencyTests.java b/server/src/test/java/org/opensearch/snapshots/SnapshotResiliencyTests.java index 580b507292ea8..d987871eaca7d 100644 --- a/server/src/test/java/org/opensearch/snapshots/SnapshotResiliencyTests.java +++ b/server/src/test/java/org/opensearch/snapshots/SnapshotResiliencyTests.java @@ -187,6 +187,7 @@ import org.opensearch.index.SegmentReplicationPressureService; import org.opensearch.index.SegmentReplicationStatsTracker; import org.opensearch.index.analysis.AnalysisRegistry; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.remote.RemoteStorePressureService; import org.opensearch.index.remote.RemoteStoreStatsTrackerFactory; import org.opensearch.index.seqno.GlobalCheckpointSyncAction; @@ -2171,7 +2172,8 @@ public void onFailure(final Exception e) { ), RetentionLeaseSyncer.EMPTY, SegmentReplicationCheckpointPublisher.EMPTY, - mock(RemoteStoreStatsTrackerFactory.class) + mock(RemoteStoreStatsTrackerFactory.class), + new MergedSegmentWarmerFactory(null, null, null) ); final SystemIndices systemIndices = new SystemIndices(emptyMap()); diff --git a/test/framework/src/main/java/org/opensearch/index/shard/IndexShardTestCase.java b/test/framework/src/main/java/org/opensearch/index/shard/IndexShardTestCase.java index bdd4b40e398d5..75004f0b404d7 100644 --- a/test/framework/src/main/java/org/opensearch/index/shard/IndexShardTestCase.java +++ b/test/framework/src/main/java/org/opensearch/index/shard/IndexShardTestCase.java @@ -96,6 +96,7 @@ import org.opensearch.index.engine.EngineFactory; import org.opensearch.index.engine.EngineTestCase; import org.opensearch.index.engine.InternalEngineFactory; +import org.opensearch.index.engine.MergedSegmentWarmerFactory; import org.opensearch.index.engine.NRTReplicationEngineFactory; import org.opensearch.index.mapper.MapperService; import org.opensearch.index.mapper.SourceToParse; @@ -722,7 +723,8 @@ protected IndexShard newShard( DefaultRemoteStoreSettings.INSTANCE, false, discoveryNodes, - mockReplicationStatsProvider + mockReplicationStatsProvider, + new MergedSegmentWarmerFactory(null, null, null) ); indexShard.addShardFailureCallback(DEFAULT_SHARD_FAILURE_HANDLER); if (remoteStoreStatsTrackerFactory != null) { From 281b4e34d314ed4b5322820b281401aab49e2b5c Mon Sep 17 00:00:00 2001 From: guojialiang Date: Fri, 11 Apr 2025 16:10:26 +0800 Subject: [PATCH 3/8] add FeatureFlags.MERGED_SEGMENT_WARMER_EXPERIMENTAL_FLAG Signed-off-by: guojialiang --- .../common/settings/FeatureFlagSettings.java | 3 ++- .../org/opensearch/common/util/FeatureFlags.java | 13 +++++++++++++ .../org/opensearch/index/engine/InternalEngine.java | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/opensearch/common/settings/FeatureFlagSettings.java b/server/src/main/java/org/opensearch/common/settings/FeatureFlagSettings.java index ba35a8bd1133a..ee214f470ef5e 100644 --- a/server/src/main/java/org/opensearch/common/settings/FeatureFlagSettings.java +++ b/server/src/main/java/org/opensearch/common/settings/FeatureFlagSettings.java @@ -39,6 +39,7 @@ protected FeatureFlagSettings( FeatureFlags.APPLICATION_BASED_CONFIGURATION_TEMPLATES_SETTING, FeatureFlags.READER_WRITER_SPLIT_EXPERIMENTAL_SETTING, FeatureFlags.TERM_VERSION_PRECOMMIT_ENABLE_SETTING, - FeatureFlags.ARROW_STREAMS_SETTING + FeatureFlags.ARROW_STREAMS_SETTING, + FeatureFlags.MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING ); } diff --git a/server/src/main/java/org/opensearch/common/util/FeatureFlags.java b/server/src/main/java/org/opensearch/common/util/FeatureFlags.java index 70461e711679e..8a94740588233 100644 --- a/server/src/main/java/org/opensearch/common/util/FeatureFlags.java +++ b/server/src/main/java/org/opensearch/common/util/FeatureFlags.java @@ -77,6 +77,12 @@ public class FeatureFlags { public static final String READER_WRITER_SPLIT_EXPERIMENTAL = FEATURE_FLAG_PREFIX + "read.write.split.enabled"; + /** + * Gates the functionality of merged segment warmer in local/remote segment replication. + * Once the feature is ready for release, this feature flag can be removed. + */ + public static final String MERGED_SEGMENT_WARMER_EXPERIMENTAL_FLAG = "opensearch.experimental.feature.merged_segment_warmer.enabled"; + public static final Setting REMOTE_STORE_MIGRATION_EXPERIMENTAL_SETTING = Setting.boolSetting( REMOTE_STORE_MIGRATION_EXPERIMENTAL, false, @@ -105,6 +111,12 @@ public class FeatureFlags { Property.NodeScope ); + public static final Setting MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING = Setting.boolSetting( + MERGED_SEGMENT_WARMER_EXPERIMENTAL_FLAG, + false, + Property.NodeScope + ); + /** * Gates the functionality of star tree index, which improves the performance of search * aggregations. @@ -162,6 +174,7 @@ static class FeatureFlagsImpl { SEARCHABLE_SNAPSHOT_EXTENDED_COMPATIBILITY_SETTING, SEARCHABLE_SNAPSHOT_EXTENDED_COMPATIBILITY_SETTING.getDefault(Settings.EMPTY) ); + put(MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING, MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING.getDefault(Settings.EMPTY)); } }; diff --git a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java index 1fa13e8ed28ca..7608bc8447f7b 100644 --- a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java +++ b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java @@ -81,6 +81,7 @@ import org.opensearch.common.lucene.uid.VersionsAndSeqNoResolver.DocIdAndSeqNo; import org.opensearch.common.metrics.CounterMetric; import org.opensearch.common.unit.TimeValue; +import org.opensearch.common.util.FeatureFlags; import org.opensearch.common.util.concurrent.AbstractRunnable; import org.opensearch.common.util.concurrent.KeyedLock; import org.opensearch.common.util.concurrent.ReleasableLock; @@ -2382,7 +2383,8 @@ private IndexWriterConfig getIndexWriterConfig() { if (config().getLeafSorter() != null) { iwc.setLeafSorter(config().getLeafSorter()); // The default segment search order } - if (config().getIndexSettings().isSegRepEnabledOrRemoteNode()) { + if (FeatureFlags.isEnabled(FeatureFlags.MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING) + && config().getIndexSettings().isSegRepEnabledOrRemoteNode()) { iwc.setMergedSegmentWarmer(config().getIndexReaderWarmer()); } return iwc; From fc880366501098d78a82d4eb7e979ecb9d5b6131 Mon Sep 17 00:00:00 2001 From: guojialiang Date: Fri, 11 Apr 2025 17:32:30 +0800 Subject: [PATCH 4/8] add an entry in CHANGELOG Signed-off-by: guojialiang --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 402a030430edb..3c39007bd5932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add update and delete support in pull-based ingestion ([#17822](https://github.com/opensearch-project/OpenSearch/pull/17822)) - Allow maxPollSize and pollTimeout in IngestionSource to be configurable ([#17863](https://github.com/opensearch-project/OpenSearch/pull/17863)) - [Star Tree] [Search] Add query changes to support unsigned-long in star tree ([#17275](https://github.com/opensearch-project/OpenSearch/pull/17275)) +- Introduce MergedSegmentWarmerFactory for Local/Remote merged segment pre copy ([#17881](https://github.com/opensearch-project/OpenSearch/pull/17881)) ### Changed - Migrate BC libs to their FIPS counterparts ([#14912](https://github.com/opensearch-project/OpenSearch/pull/14912)) From 0fd7f2fbb60e5f9f0861e6a4f2e71ceace3759f3 Mon Sep 17 00:00:00 2001 From: guojialiang Date: Mon, 14 Apr 2025 19:49:19 +0800 Subject: [PATCH 5/8] add validation Signed-off-by: guojialiang --- .../java/org/opensearch/index/engine/InternalEngine.java | 1 + .../opensearch/index/engine/MergedSegmentWarmerFactory.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java index 7608bc8447f7b..3ea3a6e9b9761 100644 --- a/server/src/main/java/org/opensearch/index/engine/InternalEngine.java +++ b/server/src/main/java/org/opensearch/index/engine/InternalEngine.java @@ -2385,6 +2385,7 @@ private IndexWriterConfig getIndexWriterConfig() { } if (FeatureFlags.isEnabled(FeatureFlags.MERGED_SEGMENT_WARMER_EXPERIMENTAL_SETTING) && config().getIndexSettings().isSegRepEnabledOrRemoteNode()) { + assert null != config().getIndexReaderWarmer(); iwc.setMergedSegmentWarmer(config().getIndexReaderWarmer()); } return iwc; diff --git a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java index 6c4a6e1891bd1..84669958625af 100644 --- a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java +++ b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java @@ -62,8 +62,9 @@ public IndexWriter.IndexReaderWarmer get(IndexShard shard) { return new RemoteStoreMergedSegmentWarmer(transportService, recoverySettings, clusterService); } else if (shard.indexSettings().isSegRepLocalEnabled()) { return new LocalMergedSegmentWarmer(transportService, recoverySettings, clusterService); - } else { - return null; } + // If a caller calls MergedSegmentWarmerFactory#get, then we know that they are expecting a non-null value to be returned. We just + // handle known cases and throw exception at the last. This will allow predictability on the IndexReaderWarmer behaviour. + throw new IllegalStateException(shard.shardId() + " can't determine IndexReaderWarmer"); } } From ae894cb7e07df7d51356d67a5d60c1e9a540df92 Mon Sep 17 00:00:00 2001 From: guojialiang Date: Mon, 14 Apr 2025 20:00:29 +0800 Subject: [PATCH 6/8] modify changelog entry Signed-off-by: guojialiang --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f98144dc068e0..325bb2ae59dd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), - Add TermsQuery support to Search GRPC endpoint ([#17888](https://github.com/opensearch-project/OpenSearch/pull/17888)) - Support sub agg in filter rewrite optimization ([#17447](https://github.com/opensearch-project/OpenSearch/pull/17447) - Disable scoring of keyword term search by default, fallback logic with new use_similarity:true parameter ([#17889](https://github.com/opensearch-project/OpenSearch/pull/17889)) +- Introducing MergedSegmentWarmerFactory to support the extension of IndexWriter.IndexReaderWarmer ([#17881](https://github.com/opensearch-project/OpenSearch/pull/17881)) ### Changed - Migrate BC libs to their FIPS counterparts ([#14912](https://github.com/opensearch-project/OpenSearch/pull/14912)) From 009fa6c471fb74a48f43ecc5ead540e13eed55fd Mon Sep 17 00:00:00 2001 From: guojialiang Date: Mon, 14 Apr 2025 21:26:57 +0800 Subject: [PATCH 7/8] add comment Signed-off-by: guojialiang --- server/src/main/java/org/opensearch/index/IndexSettings.java | 4 ++++ .../opensearch/index/engine/MergedSegmentWarmerFactory.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/server/src/main/java/org/opensearch/index/IndexSettings.java b/server/src/main/java/org/opensearch/index/IndexSettings.java index 38604ffd8bf8f..ae35a2593cc56 100644 --- a/server/src/main/java/org/opensearch/index/IndexSettings.java +++ b/server/src/main/java/org/opensearch/index/IndexSettings.java @@ -1340,6 +1340,10 @@ public boolean isSegRepLocalEnabled() { return ReplicationType.SEGMENT.equals(replicationType) && !isRemoteStoreEnabled(); } + public boolean isDocumentReplication() { + return ReplicationType.DOCUMENT.equals(replicationType); + } + /** * Returns if remote store is enabled for this index. */ diff --git a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java index 84669958625af..39ddd349f552a 100644 --- a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java +++ b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java @@ -62,6 +62,10 @@ public IndexWriter.IndexReaderWarmer get(IndexShard shard) { return new RemoteStoreMergedSegmentWarmer(transportService, recoverySettings, clusterService); } else if (shard.indexSettings().isSegRepLocalEnabled()) { return new LocalMergedSegmentWarmer(transportService, recoverySettings, clusterService); + } else if (shard.indexSettings().isDocumentReplication()) { + // MergedSegmentWarmerFactory#get is called when IndexShard is initialized. In scenario document replication, + // IndexWriter.IndexReaderWarmer should be null. + return null; } // If a caller calls MergedSegmentWarmerFactory#get, then we know that they are expecting a non-null value to be returned. We just // handle known cases and throw exception at the last. This will allow predictability on the IndexReaderWarmer behaviour. From a6157f00c0878d99cc80a2b8e1d707dd5312bc6b Mon Sep 17 00:00:00 2001 From: guojialiang Date: Mon, 14 Apr 2025 21:29:05 +0800 Subject: [PATCH 8/8] add comment Signed-off-by: guojialiang --- .../opensearch/index/engine/MergedSegmentWarmerFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java index 39ddd349f552a..fd6a9851167fc 100644 --- a/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java +++ b/server/src/main/java/org/opensearch/index/engine/MergedSegmentWarmerFactory.java @@ -67,8 +67,7 @@ public IndexWriter.IndexReaderWarmer get(IndexShard shard) { // IndexWriter.IndexReaderWarmer should be null. return null; } - // If a caller calls MergedSegmentWarmerFactory#get, then we know that they are expecting a non-null value to be returned. We just - // handle known cases and throw exception at the last. This will allow predictability on the IndexReaderWarmer behaviour. + // We just handle known cases and throw exception at the last. This will allow predictability on the IndexReaderWarmer behaviour. throw new IllegalStateException(shard.shardId() + " can't determine IndexReaderWarmer"); } }