Skip to content

Commit 68079d9

Browse files
Throttling ?
1 parent 6c21654 commit 68079d9

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

server/src/main/java/org/elasticsearch/index/engine/InternalEngine.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,29 +2826,19 @@ LiveIndexWriterConfig getCurrentIndexWriterConfig() {
28262826
protected ElasticsearchMergeScheduler createMergeScheduler(ShardId shardId, IndexSettings indexSettings) {
28272827
// return new EngineMergeScheduler(shardId, indexSettings);
28282828
return new ThreadPoolMergeScheduler(shardId, indexSettings, engineConfig.getThreadPool()) {
2829-
private final AtomicInteger numMergesInFlight = new AtomicInteger(0);
2830-
private final AtomicBoolean isThrottling = new AtomicBoolean();
28312829

28322830
@Override
2833-
public synchronized void beforeMerge(OnGoingMerge merge) {
2834-
int maxNumMerges = getMaxMergeCount();
2835-
if (numMergesInFlight.incrementAndGet() > maxNumMerges) {
2836-
if (isThrottling.getAndSet(true) == false) {
2837-
logger.info("now throttling indexing: numMergesInFlight={}, maxNumMerges={}", numMergesInFlight, maxNumMerges);
2838-
activateThrottling();
2839-
}
2840-
}
2831+
protected synchronized void activateThrottling(int numActiveMerges) {
2832+
InternalEngine.this.activateThrottling();
2833+
}
2834+
2835+
@Override
2836+
protected synchronized void deactivateThrottling(int numActiveMerges) {
2837+
InternalEngine.this.deactivateThrottling();
28412838
}
28422839

28432840
@Override
28442841
public synchronized void afterMerge(OnGoingMerge merge) {
2845-
int maxNumMerges = getMaxMergeCount();
2846-
if (numMergesInFlight.decrementAndGet() < maxNumMerges) {
2847-
if (isThrottling.getAndSet(false)) {
2848-
logger.info("stop throttling indexing: numMergesInFlight={}, maxNumMerges={}", numMergesInFlight, maxNumMerges);
2849-
deactivateThrottling();
2850-
}
2851-
}
28522842
if (indexWriter.hasPendingMerges() == false
28532843
&& System.nanoTime() - lastWriteNanos >= engineConfig.getFlushMergesAfter().nanos()) {
28542844
// NEVER do this on a merge thread since we acquire some locks blocking here and if we concurrently rollback the writer

server/src/main/java/org/elasticsearch/index/engine/ThreadPoolMergeScheduler.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import java.util.Set;
4141
import java.util.concurrent.ExecutorService;
4242
import java.util.concurrent.TimeUnit;
43+
import java.util.concurrent.atomic.AtomicBoolean;
4344

4445
public class ThreadPoolMergeScheduler extends MergeScheduler implements ElasticsearchMergeScheduler {
4546
/**
@@ -72,6 +73,7 @@ public class ThreadPoolMergeScheduler extends MergeScheduler implements Elastics
7273
private final ThreadLocal<MergeRateLimiter> onGoingMergeRateLimiter = new ThreadLocal<>();
7374
private final PriorityQueue<MergeTask> activeMergeTasksLocalSchedulerQueue = new PriorityQueue<>();
7475
private final List<MergeTask> activeMergeTasksExecutingOnLocalSchedulerList = new ArrayList<>();
76+
private final AtomicBoolean isThrottling = new AtomicBoolean();
7577

7678
public ThreadPoolMergeScheduler(ShardId shardId, IndexSettings indexSettings, ThreadPool threadPool) {
7779
this.config = indexSettings.getMergeSchedulerConfig();
@@ -120,6 +122,10 @@ protected void beforeMerge(OnGoingMerge merge) {}
120122
*/
121123
protected void afterMerge(OnGoingMerge merge) {}
122124

125+
protected void activateThrottling(int numActiveMerges) {}
126+
127+
protected void deactivateThrottling(int numActiveMerges) {}
128+
123129
public int getMaxMergeCount() {
124130
return config.getMaxMergeCount();
125131
}
@@ -144,13 +150,15 @@ private void submitNewMergeTask(MergeSource mergeSource, MergePolicy.OneMerge me
144150
activeMergeTasksLocalSchedulerQueue.add(mergeTask);
145151
}
146152
maybeExecuteNextMerge();
153+
maybeActivateThrottling();
147154
}
148155

149156
private void mergeDone(MergeTask mergeTask) {
150157
synchronized (this) {
151158
activeMergeTasksExecutingOnLocalSchedulerList.remove(mergeTask);
152159
}
153160
maybeExecuteNextMerge();
161+
maybeDeactivateThrottling();
154162
}
155163

156164
private void maybeExecuteNextMerge() {
@@ -169,6 +177,20 @@ private void maybeExecuteNextMerge() {
169177
executorService.execute(mergeTask);
170178
}
171179

180+
private void maybeActivateThrottling() {
181+
int numActiveMerges = activeMergeTasksExecutingOnLocalSchedulerList.size();
182+
if (numActiveMerges > config.getMaxMergeCount() && isThrottling.getAndSet(true) == false) {
183+
activateThrottling(numActiveMerges);
184+
}
185+
}
186+
187+
private void maybeDeactivateThrottling() {
188+
int numActiveMerges = activeMergeTasksExecutingOnLocalSchedulerList.size();
189+
if (numActiveMerges <= config.getMaxMergeCount() && isThrottling.getAndSet(false) == true) {
190+
deactivateThrottling(numActiveMerges);
191+
}
192+
}
193+
172194
private static double maybeUpdateTargetMBPerSec(int poolSize) {
173195
if (activeThrottledMergeTasksAcrossSchedulersSet.size() < poolSize * 2 && targetMBPerSec > MIN_MERGE_MB_PER_SEC) {
174196
return Math.max(MIN_MERGE_MB_PER_SEC, targetMBPerSec / 1.1);

0 commit comments

Comments
 (0)