-
Notifications
You must be signed in to change notification settings - Fork 25.6k
ES-10264: Bring over merge scheduler features from stateless #128155
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
4640277
59869e4
dcb38c0
b763dd4
30f3c31
b606732
f0b027a
6a0aa1e
0addc02
f26b0d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -75,6 +75,13 @@ public final class MergeSchedulerConfig { | |
| this.autoThrottle = indexSettings.getValue(AUTO_THROTTLE_SETTING); | ||
| } | ||
|
|
||
| MergeSchedulerConfig(boolean autoThrottle, int maxThreadCount, int maxMergeCount) { | ||
| this.autoThrottle = autoThrottle; | ||
|
||
| this.maxThreadCount = maxThreadCount; | ||
| this.maxMergeCount = maxMergeCount; | ||
| setMaxThreadAndMergeCount(maxThreadCount, maxMergeCount); | ||
| } | ||
|
|
||
| /** | ||
| * Returns <code>true</code> iff auto throttle is enabled. | ||
| * | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -41,6 +41,7 @@ | |
| import java.util.concurrent.TimeUnit; | ||
| import java.util.concurrent.atomic.AtomicBoolean; | ||
| import java.util.concurrent.atomic.AtomicLong; | ||
| import java.util.function.BooleanSupplier; | ||
|
|
||
| public class ThreadPoolMergeScheduler extends MergeScheduler implements ElasticsearchMergeScheduler { | ||
| public static final Setting<Boolean> USE_THREAD_POOL_MERGE_SCHEDULER_SETTING = Setting.boolSetting( | ||
|
|
@@ -66,12 +67,24 @@ public class ThreadPoolMergeScheduler extends MergeScheduler implements Elastics | |
| private final CountDownLatch closedWithNoRunningMerges = new CountDownLatch(1); | ||
| private volatile boolean closed = false; | ||
| private final MergeMemoryEstimateProvider mergeMemoryEstimateProvider; | ||
| // if true, scheduled merges will be aborted | ||
| private final BooleanSupplier shouldSkipMerge; | ||
|
|
||
| /** | ||
| * Creates a thread-pool-based merge scheduler that runs merges in a thread pool. | ||
| * | ||
| * @param shardId the shard id associated with this merge scheduler | ||
| * @param indexSettings used to obtain the {@link MergeSchedulerConfig} | ||
| * @param threadPoolMergeExecutorService the executor service used to execute merge tasks from this scheduler | ||
| * @param mergeMemoryEstimateProvider provides an estimate for how much memory a merge will take | ||
| * @param shouldSkipMerge if true, scheduled merges will be skipped i.e. aborted by the executor | ||
| */ | ||
| public ThreadPoolMergeScheduler( | ||
| ShardId shardId, | ||
| IndexSettings indexSettings, | ||
| ThreadPoolMergeExecutorService threadPoolMergeExecutorService, | ||
| MergeMemoryEstimateProvider mergeMemoryEstimateProvider | ||
| MergeMemoryEstimateProvider mergeMemoryEstimateProvider, | ||
| BooleanSupplier shouldSkipMerge | ||
|
||
| ) { | ||
| this.shardId = shardId; | ||
| this.config = indexSettings.getMergeSchedulerConfig(); | ||
|
|
@@ -84,6 +97,7 @@ public ThreadPoolMergeScheduler( | |
| ); | ||
| this.threadPoolMergeExecutorService = threadPoolMergeExecutorService; | ||
| this.mergeMemoryEstimateProvider = mergeMemoryEstimateProvider; | ||
| this.shouldSkipMerge = shouldSkipMerge; | ||
| } | ||
|
|
||
| @Override | ||
|
|
@@ -146,6 +160,16 @@ protected void beforeMerge(OnGoingMerge merge) {} | |
| */ | ||
| protected void afterMerge(OnGoingMerge merge) {} | ||
|
|
||
| /** | ||
| * A callback allowing for custom logic when a merge is queued. | ||
| */ | ||
| protected void mergeQueued(OnGoingMerge merge) {} | ||
|
|
||
| /** | ||
| * A callback allowing for custom logic after a merge is executed or aborted. | ||
| */ | ||
| protected void mergeExecutedOrAborted(OnGoingMerge merge) {} | ||
|
|
||
| /** | ||
| * A callback that's invoked when indexing should throttle down indexing in order to let merging to catch up. | ||
| */ | ||
|
|
@@ -168,6 +192,7 @@ protected void handleMergeException(Throwable t) { | |
| boolean submitNewMergeTask(MergeSource mergeSource, MergePolicy.OneMerge merge, MergeTrigger mergeTrigger) { | ||
| try { | ||
| MergeTask mergeTask = newMergeTask(mergeSource, merge, mergeTrigger); | ||
| mergeQueued(mergeTask.onGoingMerge); | ||
| return threadPoolMergeExecutorService.submitMergeTask(mergeTask); | ||
| } finally { | ||
| checkMergeTaskThrottling(); | ||
|
|
@@ -223,6 +248,11 @@ synchronized Schedule schedule(MergeTask mergeTask) { | |
| if (closed) { | ||
| // do not run or backlog tasks when closing the merge scheduler, instead abort them | ||
| return Schedule.ABORT; | ||
| } else if (shouldSkipMerge.getAsBoolean()) { | ||
| if (verbose()) { | ||
| message(String.format(Locale.ROOT, "skipping merge task %s", mergeTask)); | ||
| } | ||
| return Schedule.ABORT; | ||
| } else if (runningMergeTasks.size() < config.getMaxThreadCount()) { | ||
| boolean added = runningMergeTasks.put(mergeTask.onGoingMerge.getMerge(), mergeTask) == null; | ||
| assert added : "starting merge task [" + mergeTask + "] registered as already running"; | ||
|
|
@@ -243,8 +273,9 @@ synchronized void mergeTaskFinishedRunning(MergeTask mergeTask) { | |
| maybeSignalAllMergesDoneAfterClose(); | ||
| } | ||
|
|
||
| private void mergeTaskDone() { | ||
| private void mergeTaskDone(OnGoingMerge merge) { | ||
| doneMergeTaskCount.incrementAndGet(); | ||
| mergeExecutedOrAborted(merge); | ||
| checkMergeTaskThrottling(); | ||
| } | ||
|
|
||
|
|
@@ -408,7 +439,7 @@ public void run() { | |
| try { | ||
| mergeTaskFinishedRunning(this); | ||
| } finally { | ||
| mergeTaskDone(); | ||
| mergeTaskDone(onGoingMerge); | ||
| } | ||
| try { | ||
| // kick-off any follow-up merge | ||
|
|
@@ -452,7 +483,7 @@ void abort() { | |
| if (verbose()) { | ||
| message(String.format(Locale.ROOT, "merge task %s end abort", this)); | ||
| } | ||
| mergeTaskDone(); | ||
| mergeTaskDone(onGoingMerge); | ||
| } | ||
| } | ||
|
|
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer to avoid this if we can and added suggestions to use a sub-class for the merge scheduler in stateless.