Skip to content

Commit d6c20bd

Browse files
Create a Builder for TaskTrackingConfig (elastic#130961)
1 parent 43db8d8 commit d6c20bd

File tree

4 files changed

+77
-23
lines changed

4 files changed

+77
-23
lines changed

server/src/main/java/org/elasticsearch/common/util/concurrent/EsExecutors.java

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,7 @@ public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) {
577577
}
578578

579579
public static class TaskTrackingConfig {
580+
// This is a random starting point alpha.
580581
public static final double DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST = 0.3;
581582

582583
private final boolean trackExecutionTime;
@@ -597,17 +598,6 @@ public static class TaskTrackingConfig {
597598
DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST
598599
);
599600

600-
public TaskTrackingConfig(boolean trackOngoingTasks, double executionTimeEWMAAlpha) {
601-
this(true, trackOngoingTasks, false, executionTimeEWMAAlpha);
602-
}
603-
604-
/**
605-
* Execution tracking enabled constructor, with extra options to enable further specialized tracking.
606-
*/
607-
public TaskTrackingConfig(boolean trackOngoingTasks, boolean trackMaxQueueLatency, double executionTimeEwmaAlpha) {
608-
this(true, trackOngoingTasks, trackMaxQueueLatency, executionTimeEwmaAlpha);
609-
}
610-
611601
/**
612602
* @param trackExecutionTime Whether to track execution stats
613603
* @param trackOngoingTasks Whether to track ongoing task execution time, not just finished tasks
@@ -641,6 +631,39 @@ public boolean trackMaxQueueLatency() {
641631
public double getExecutionTimeEwmaAlpha() {
642632
return executionTimeEwmaAlpha;
643633
}
634+
635+
public static Builder builder() {
636+
return new Builder();
637+
}
638+
639+
public static class Builder {
640+
private boolean trackExecutionTime = false;
641+
private boolean trackOngoingTasks = false;
642+
private boolean trackMaxQueueLatency = false;
643+
private double ewmaAlpha = DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST;
644+
645+
public Builder() {}
646+
647+
public Builder trackExecutionTime(double alpha) {
648+
trackExecutionTime = true;
649+
ewmaAlpha = alpha;
650+
return this;
651+
}
652+
653+
public Builder trackOngoingTasks() {
654+
trackOngoingTasks = true;
655+
return this;
656+
}
657+
658+
public Builder trackMaxQueueLatency() {
659+
trackMaxQueueLatency = true;
660+
return this;
661+
}
662+
663+
public TaskTrackingConfig build() {
664+
return new TaskTrackingConfig(trackExecutionTime, trackOngoingTasks, trackMaxQueueLatency, ewmaAlpha);
665+
}
666+
}
644667
}
645668

646669
}

server/src/main/java/org/elasticsearch/threadpool/DefaultBuiltInExecutorBuilders.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,11 @@ public Map<String, ExecutorBuilder> getBuilders(Settings settings, int allocated
5656
allocatedProcessors,
5757
// 10,000 for all nodes with 8 cores or fewer. Scale up once we have more than 8 cores.
5858
Math.max(allocatedProcessors * 750, 10000),
59-
new EsExecutors.TaskTrackingConfig(true, true, indexAutoscalingEWMA)
59+
EsExecutors.TaskTrackingConfig.builder()
60+
.trackOngoingTasks()
61+
.trackMaxQueueLatency()
62+
.trackExecutionTime(indexAutoscalingEWMA)
63+
.build()
6064
)
6165
);
6266
int searchOrGetThreadPoolSize = ThreadPool.searchOrGetThreadPoolSize(allocatedProcessors);
@@ -81,7 +85,7 @@ public Map<String, ExecutorBuilder> getBuilders(Settings settings, int allocated
8185
ThreadPool.Names.SEARCH,
8286
searchOrGetThreadPoolSize,
8387
searchOrGetThreadPoolSize * 1000,
84-
new EsExecutors.TaskTrackingConfig(true, searchAutoscalingEWMA)
88+
EsExecutors.TaskTrackingConfig.builder().trackOngoingTasks().trackExecutionTime(searchAutoscalingEWMA).build()
8589
)
8690
);
8791
result.put(
@@ -91,7 +95,7 @@ public Map<String, ExecutorBuilder> getBuilders(Settings settings, int allocated
9195
ThreadPool.Names.SEARCH_COORDINATION,
9296
halfProc,
9397
1000,
94-
new EsExecutors.TaskTrackingConfig(true, searchAutoscalingEWMA)
98+
EsExecutors.TaskTrackingConfig.builder().trackOngoingTasks().trackExecutionTime(searchAutoscalingEWMA).build()
9599
)
96100
);
97101
result.put(
@@ -195,7 +199,7 @@ public Map<String, ExecutorBuilder> getBuilders(Settings settings, int allocated
195199
ThreadPool.Names.SYSTEM_WRITE,
196200
halfProcMaxAt5,
197201
1000,
198-
new EsExecutors.TaskTrackingConfig(true, indexAutoscalingEWMA),
202+
EsExecutors.TaskTrackingConfig.builder().trackOngoingTasks().trackExecutionTime(indexAutoscalingEWMA).build(),
199203
true
200204
)
201205
);
@@ -228,7 +232,7 @@ public Map<String, ExecutorBuilder> getBuilders(Settings settings, int allocated
228232
ThreadPool.Names.SYSTEM_CRITICAL_WRITE,
229233
halfProcMaxAt5,
230234
1500,
231-
new EsExecutors.TaskTrackingConfig(true, indexAutoscalingEWMA),
235+
EsExecutors.TaskTrackingConfig.builder().trackOngoingTasks().trackExecutionTime(indexAutoscalingEWMA).build(),
232236
true
233237
)
234238
);

server/src/test/java/org/elasticsearch/common/util/concurrent/EsExecutorsTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,7 @@ public void testScalingWithTaskTimeTracking() {
675675
final int max = between(min + 1, 6);
676676

677677
{
678+
var executionTimeEwma = randomDoubleBetween(0.01, 0.1, true);
678679
ThreadPoolExecutor pool = EsExecutors.newScaling(
679680
getClass().getName() + "/" + getTestName(),
680681
min,
@@ -684,7 +685,9 @@ public void testScalingWithTaskTimeTracking() {
684685
randomBoolean(),
685686
EsExecutors.daemonThreadFactory("test"),
686687
threadContext,
687-
new EsExecutors.TaskTrackingConfig(randomBoolean(), randomDoubleBetween(0.01, 0.1, true))
688+
randomBoolean()
689+
? EsExecutors.TaskTrackingConfig.builder().trackOngoingTasks().trackExecutionTime(executionTimeEwma).build()
690+
: EsExecutors.TaskTrackingConfig.builder().trackExecutionTime(executionTimeEwma).build()
688691
);
689692
assertThat(pool, instanceOf(TaskExecutionTimeTrackingEsThreadPoolExecutor.class));
690693
}

server/src/test/java/org/elasticsearch/common/util/concurrent/TaskExecutionTimeTrackingEsThreadPoolExecutorTests.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import org.elasticsearch.common.metrics.ExponentialBucketHistogram;
1313
import org.elasticsearch.common.settings.Settings;
14-
import org.elasticsearch.common.util.concurrent.EsExecutors.TaskTrackingConfig;
1514
import org.elasticsearch.telemetry.InstrumentType;
1615
import org.elasticsearch.telemetry.Measurement;
1716
import org.elasticsearch.telemetry.RecordingMeterRegistry;
@@ -51,7 +50,12 @@ public void testExecutionEWMACalculation() throws Exception {
5150
EsExecutors.daemonThreadFactory("queuetest"),
5251
new EsAbortPolicy(),
5352
context,
54-
new TaskTrackingConfig(randomBoolean(), DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
53+
randomBoolean()
54+
? EsExecutors.TaskTrackingConfig.builder()
55+
.trackOngoingTasks()
56+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
57+
.build()
58+
: EsExecutors.TaskTrackingConfig.builder().trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST).build()
5559
);
5660
executor.prestartAllCoreThreads();
5761
logger.info("--> executor: {}", executor);
@@ -109,7 +113,16 @@ public void testMaxQueueLatency() throws Exception {
109113
EsExecutors.daemonThreadFactory("queue-latency-test"),
110114
new EsAbortPolicy(),
111115
context,
112-
new TaskTrackingConfig(randomBoolean(), true, DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
116+
randomBoolean()
117+
? EsExecutors.TaskTrackingConfig.builder()
118+
.trackOngoingTasks()
119+
.trackMaxQueueLatency()
120+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
121+
.build()
122+
: EsExecutors.TaskTrackingConfig.builder()
123+
.trackMaxQueueLatency()
124+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
125+
.build()
113126
);
114127
try {
115128
executor.prestartAllCoreThreads();
@@ -153,7 +166,12 @@ public void testExceptionThrowingTask() throws Exception {
153166
EsExecutors.daemonThreadFactory("queuetest"),
154167
new EsAbortPolicy(),
155168
context,
156-
new TaskTrackingConfig(randomBoolean(), DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
169+
randomBoolean()
170+
? EsExecutors.TaskTrackingConfig.builder()
171+
.trackOngoingTasks()
172+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
173+
.build()
174+
: EsExecutors.TaskTrackingConfig.builder().trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST).build()
157175
);
158176
executor.prestartAllCoreThreads();
159177
logger.info("--> executor: {}", executor);
@@ -185,7 +203,10 @@ public void testGetOngoingTasks() throws Exception {
185203
EsExecutors.daemonThreadFactory("queuetest"),
186204
new EsAbortPolicy(),
187205
context,
188-
new TaskTrackingConfig(true, DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
206+
EsExecutors.TaskTrackingConfig.builder()
207+
.trackOngoingTasks()
208+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
209+
.build()
189210
);
190211
var taskRunningLatch = new CountDownLatch(1);
191212
var exitTaskLatch = new CountDownLatch(1);
@@ -220,7 +241,10 @@ public void testQueueLatencyHistogramMetrics() {
220241
EsExecutors.daemonThreadFactory("queuetest"),
221242
new EsAbortPolicy(),
222243
new ThreadContext(Settings.EMPTY),
223-
new TaskTrackingConfig(true, DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
244+
EsExecutors.TaskTrackingConfig.builder()
245+
.trackOngoingTasks()
246+
.trackExecutionTime(DEFAULT_EXECUTION_TIME_EWMA_ALPHA_FOR_TEST)
247+
.build()
224248
);
225249
executor.setupMetrics(meterRegistry, threadPoolName);
226250

0 commit comments

Comments
 (0)