From cc7302afc8499e83262ba2ceaa96451681f0609d Mon Sep 17 00:00:00 2001 From: Albert Zaharovits Date: Wed, 18 Jun 2025 16:51:06 +0300 Subject: [PATCH] Deprecate indices.merge.scheduler.use_thread_pool setting (#129464) (#129629) This deprecates the `indices.merge.scheduler.use_thread_pool` setting that was introduced in https://github.com/elastic/elasticsearch/pull/120869 because this setting should not normally be used, unless instructed so by engineering to get around temporary issues with the new threadpool-based merge scheduler. --- docs/changelog/129464.yaml | 10 ++++++ ...ElasticsearchConcurrentMergeScheduler.java | 4 +++ .../engine/ThreadPoolMergeScheduler.java | 14 +++++++- ...ReplicationAllPermitsAcquisitionTests.java | 4 +++ ...oolMergeExecutorServiceDiskSpaceTests.java | 34 ++++++++++++++++++- .../ThreadPoolMergeExecutorServiceTests.java | 24 +++++++++++++ .../IndexLevelReplicationTests.java | 4 +++ .../index/shard/RefreshListenersTests.java | 4 +++ .../CcrRestoreSourceServiceTests.java | 9 +++++ 9 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/129464.yaml diff --git a/docs/changelog/129464.yaml b/docs/changelog/129464.yaml new file mode 100644 index 000000000000..c4724242454d --- /dev/null +++ b/docs/changelog/129464.yaml @@ -0,0 +1,10 @@ +pr: 129464 +summary: Deprecate `indices.merge.scheduler.use_thread_pool` setting +area: Engine +type: deprecation +issues: [] +deprecation: + title: Deprecate `indices.merge.scheduler.use_thread_pool` setting + area: Ingest + details: This deprecates the `indices.merge.scheduler.use_thread_pool` node setting that was introduced in #120869. This setting should not normally be used, unless instructed so by engineering to get around temporary issues with the new threadpool-based merge scheduler. + impact: There should be no impact to users since the setting was not released before its deprecation here (and is not documented). diff --git a/server/src/main/java/org/elasticsearch/index/engine/ElasticsearchConcurrentMergeScheduler.java b/server/src/main/java/org/elasticsearch/index/engine/ElasticsearchConcurrentMergeScheduler.java index 90f8e6adab73..0603308ff52b 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/ElasticsearchConcurrentMergeScheduler.java +++ b/server/src/main/java/org/elasticsearch/index/engine/ElasticsearchConcurrentMergeScheduler.java @@ -31,7 +31,11 @@ import java.util.concurrent.Executor; /** * An extension to the {@link ConcurrentMergeScheduler} that provides tracking on merge times, total * and current merges. + * @deprecated Replaced by {@link org.elasticsearch.index.engine.ThreadPoolMergeScheduler}. This merge scheduler + * implementation should only be used to get around unexpected issues with the {@link ThreadPoolMergeScheduler}, + * which is the default one. */ +@Deprecated public class ElasticsearchConcurrentMergeScheduler extends ConcurrentMergeScheduler implements ElasticsearchMergeScheduler { protected final Logger logger; diff --git a/server/src/main/java/org/elasticsearch/index/engine/ThreadPoolMergeScheduler.java b/server/src/main/java/org/elasticsearch/index/engine/ThreadPoolMergeScheduler.java index 78a9695bea54..a73d19181a57 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/ThreadPoolMergeScheduler.java +++ b/server/src/main/java/org/elasticsearch/index/engine/ThreadPoolMergeScheduler.java @@ -43,10 +43,22 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; public class ThreadPoolMergeScheduler extends MergeScheduler implements ElasticsearchMergeScheduler { + /** + * This setting switches between the original {@link ElasticsearchConcurrentMergeScheduler} + * and the new {@link ThreadPoolMergeScheduler} merge scheduler implementations (the latter is switched ON by default). + * This setting is purposefully undocumented, because we expect that only the new {@link ThreadPoolMergeScheduler} implementation + * (which is enabled by default) be used from now on. Our users should not touch this setting in their deployments, + * unless consulting with engineering, because the original implementation should only be used (by setting this to {@code false}) + * to get around unexpected issues with the new one. + * The setting is also deprecated in the hope that any unexpected issues with the new merge scheduler implementation are + * promptly resolved, such that, in the near future, there's never a need to switch to the original implementation, + * which will then be removed together with this setting. + */ public static final Setting USE_THREAD_POOL_MERGE_SCHEDULER_SETTING = Setting.boolSetting( "indices.merge.scheduler.use_thread_pool", true, - Setting.Property.NodeScope + Setting.Property.NodeScope, + Setting.Property.Deprecated ); private final ShardId shardId; private final MergeSchedulerConfig config; diff --git a/server/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationAllPermitsAcquisitionTests.java b/server/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationAllPermitsAcquisitionTests.java index 7e0d7063c417..ca524bfd7735 100644 --- a/server/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationAllPermitsAcquisitionTests.java +++ b/server/src/test/java/org/elasticsearch/action/support/replication/TransportReplicationAllPermitsAcquisitionTests.java @@ -391,6 +391,10 @@ public class TransportReplicationAllPermitsAcquisitionTests extends IndexShardTe } } } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } private void assertSuccessfulOperation(final TestAction action, final Response response) { diff --git a/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceDiskSpaceTests.java b/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceDiskSpaceTests.java index 97943101758f..d5df3b9e9560 100644 --- a/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceDiskSpaceTests.java +++ b/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceDiskSpaceTests.java @@ -67,6 +67,7 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { private static Settings settings; private static TestCapturingThreadPool testThreadPool; private static NodeEnvironment nodeEnvironment; + private static boolean setThreadPoolMergeSchedulerSetting; @BeforeClass public static void installMockUsableSpaceFS() throws Exception { @@ -86,7 +87,8 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { // the default of "5s" slows down testing .put(ThreadPoolMergeExecutorService.INDICES_MERGE_DISK_CHECK_INTERVAL_SETTING.getKey(), "50ms") .put(EsExecutors.NODE_PROCESSORS_SETTING.getKey(), mergeExecutorThreadCount); - if (randomBoolean()) { + setThreadPoolMergeSchedulerSetting = randomBoolean(); + if (setThreadPoolMergeSchedulerSetting) { settingsBuilder.put(ThreadPoolMergeScheduler.USE_THREAD_POOL_MERGE_SCHEDULER_SETTING.getKey(), true); } settings = settingsBuilder.build(); @@ -520,6 +522,12 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { } }, 5, TimeUnit.SECONDS); } + if (setThreadPoolMergeSchedulerSetting) { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch " + + "and will be removed in a future release. See the breaking changes documentation for the next major version." + ); + } } public void testAbortingOrRunningMergeTaskHoldsUpBudget() throws Exception { @@ -593,6 +601,12 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { assertThat(threadPoolMergeExecutorService.allDone(), is(true)); }); } + if (setThreadPoolMergeSchedulerSetting) { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch " + + "and will be removed in a future release. See the breaking changes documentation for the next major version." + ); + } } public void testBackloggedMergeTasksDoNotHoldUpBudget() throws Exception { @@ -731,6 +745,12 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { assertThat(threadPoolMergeExecutorService.allDone(), is(true)); }); } + if (setThreadPoolMergeSchedulerSetting) { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch " + + "and will be removed in a future release. See the breaking changes documentation for the next major version." + ); + } } public void testUnavailableBudgetBlocksNewMergeTasksFromStartingExecution() throws Exception { @@ -868,6 +888,12 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { assertThat(threadPoolMergeExecutorService.allDone(), is(true)); }); } + if (setThreadPoolMergeSchedulerSetting) { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch " + + "and will be removed in a future release. See the breaking changes documentation for the next major version." + ); + } } public void testMergeTasksAreUnblockedWhenMoreDiskSpaceBecomesAvailable() throws Exception { @@ -1019,5 +1045,11 @@ public class ThreadPoolMergeExecutorServiceDiskSpaceTests extends ESTestCase { ); }); } + if (setThreadPoolMergeSchedulerSetting) { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch " + + "and will be removed in a future release. See the breaking changes documentation for the next major version." + ); + } } } diff --git a/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceTests.java b/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceTests.java index 7a3df11e6c7a..cec52af12cad 100644 --- a/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceTests.java +++ b/server/src/test/java/org/elasticsearch/index/engine/ThreadPoolMergeExecutorServiceTests.java @@ -211,6 +211,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { }); assertThat(countingListener.aborted.get() + countingListener.completed.get(), equalTo(doneMergesCount.get())); assertThat(countingListener.aborted.get(), equalTo(abortedMergesCount.get())); + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testTargetIORateChangesWhenSubmittingMergeTasks() throws Exception { @@ -298,6 +302,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { } assertBusy(() -> assertTrue(threadPoolMergeExecutorService.allDone())); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testIORateIsAdjustedForAllRunningMergeTasks() throws Exception { @@ -386,6 +394,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { } assertBusy(() -> assertTrue(threadPoolMergeExecutorService.allDone())); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testIORateAdjustedForSubmittedTasksWhenExecutionRateIsSpeedy() throws IOException { @@ -567,6 +579,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { } assertBusy(() -> assertTrue(threadPoolMergeExecutorService.allDone())); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testThreadPoolStatsWithBackloggedMergeTasks() throws Exception { @@ -626,6 +642,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { assertTrue(threadPoolMergeExecutorService.allDone()); }); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testBackloggedMergeTasksExecuteExactlyOnce() throws Exception { @@ -697,6 +717,10 @@ public class ThreadPoolMergeExecutorServiceTests extends ESTestCase { assertTrue(threadPoolMergeExecutorService.allDone()); }); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } public void testMergeTasksExecuteInSizeOrder() throws IOException { diff --git a/server/src/test/java/org/elasticsearch/index/replication/IndexLevelReplicationTests.java b/server/src/test/java/org/elasticsearch/index/replication/IndexLevelReplicationTests.java index 0357d02dbbb9..6c5e69841961 100644 --- a/server/src/test/java/org/elasticsearch/index/replication/IndexLevelReplicationTests.java +++ b/server/src/test/java/org/elasticsearch/index/replication/IndexLevelReplicationTests.java @@ -666,6 +666,10 @@ public class IndexLevelReplicationTests extends ESIndexLevelReplicationTestCase indexOnReplica(indexRequest, shards, replica); // index arrives on replica lately. shards.assertAllEqual(0); } + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); } private void updateGCDeleteCycle(IndexShard shard, TimeValue interval) { diff --git a/server/src/test/java/org/elasticsearch/index/shard/RefreshListenersTests.java b/server/src/test/java/org/elasticsearch/index/shard/RefreshListenersTests.java index 843c7f3f5885..b14b5ad58de8 100644 --- a/server/src/test/java/org/elasticsearch/index/shard/RefreshListenersTests.java +++ b/server/src/test/java/org/elasticsearch/index/shard/RefreshListenersTests.java @@ -185,6 +185,10 @@ public class RefreshListenersTests extends ESTestCase { @After public void tearDownListeners() throws Exception { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); IOUtils.close(engine, store, nodeEnvironment, () -> terminate(threadPool)); } diff --git a/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/repository/CcrRestoreSourceServiceTests.java b/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/repository/CcrRestoreSourceServiceTests.java index f577ccd4e5a4..aa3c8f663d79 100644 --- a/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/repository/CcrRestoreSourceServiceTests.java +++ b/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/repository/CcrRestoreSourceServiceTests.java @@ -24,6 +24,7 @@ import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.store.Store; import org.elasticsearch.index.store.StoreFileMetadata; import org.elasticsearch.xpack.ccr.CcrSettings; +import org.junit.After; import org.junit.Before; import java.io.IOException; @@ -49,6 +50,14 @@ public class CcrRestoreSourceServiceTests extends IndexShardTestCase { restoreSourceService = new CcrRestoreSourceService(taskQueue.getThreadPool(), new CcrSettings(Settings.EMPTY, clusterSettings)); } + @After + public void assertWarnings() { + assertWarnings( + "[indices.merge.scheduler.use_thread_pool] setting was deprecated in Elasticsearch and will be removed in a future release. " + + "See the breaking changes documentation for the next major version." + ); + } + public void testOpenSession() throws IOException { IndexShard indexShard1 = newStartedShard(true); IndexShard indexShard2 = newStartedShard(true);