Skip to content

Commit 0853c8e

Browse files
committed
Fix simulator for new cluster info
1 parent 09f8bcb commit 0853c8e

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

server/src/main/java/org/elasticsearch/cluster/routing/ShardMovementWriteLoadSimulator.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import org.elasticsearch.index.shard.ShardId;
1919
import org.elasticsearch.threadpool.ThreadPool;
2020

21+
import java.util.ArrayList;
2122
import java.util.Collections;
23+
import java.util.List;
2224
import java.util.Map;
2325

2426
/**
@@ -86,13 +88,17 @@ private static NodeUsageStatsForThreadPools.ThreadPoolUsageStats replaceWritePoo
8688
) {
8789
final NodeUsageStatsForThreadPools.ThreadPoolUsageStats writeThreadPoolStats = value.threadPoolUsageStatsMap()
8890
.get(ThreadPool.Names.WRITE);
89-
return new NodeUsageStatsForThreadPools.ThreadPoolUsageStats(
90-
writeThreadPoolStats.totalThreadPoolThreads(),
91-
(float) Math.max(
92-
(writeThreadPoolStats.averageThreadPoolUtilization() + (writeLoadDelta / writeThreadPoolStats.totalThreadPoolThreads())),
93-
0.0
94-
),
95-
writeThreadPoolStats.averageThreadPoolQueueLatencyMillis()
91+
final float newWritePoolUtilization = (float) Math.max(
92+
(writeThreadPoolStats.utilizationSamples().getLast().utilization() + (writeLoadDelta / writeThreadPoolStats.numberOfThreads())),
93+
0.0
9694
);
95+
final List<NodeUsageStatsForThreadPools.UtilizationSample> newUtilizationSamples = new ArrayList<>(
96+
writeThreadPoolStats.utilizationSamples()
97+
);
98+
final NodeUsageStatsForThreadPools.UtilizationSample previousUtilization = newUtilizationSamples.removeLast();
99+
newUtilizationSamples.add(
100+
new NodeUsageStatsForThreadPools.UtilizationSample(previousUtilization.instant(), newWritePoolUtilization)
101+
);
102+
return new NodeUsageStatsForThreadPools.ThreadPoolUsageStats(writeThreadPoolStats.numberOfThreads(), newUtilizationSamples);
97103
}
98104
}

server/src/test/java/org/elasticsearch/cluster/routing/ShardMovementWriteLoadSimulatorTests.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.test.ESTestCase;
2222
import org.hamcrest.Matchers;
2323

24+
import java.time.Instant;
2425
import java.util.Arrays;
2526
import java.util.HashMap;
2627
import java.util.HashSet;
@@ -87,16 +88,16 @@ public void testMovementOfAShardWillMoveThreadPoolUtilisation() {
8788
assertThat(calculatedNodeUsageStats, Matchers.aMapWithSize(2));
8889

8990
final var shardWriteLoad = allocation.clusterInfo().getShardWriteLoads().get(randomShard.shardId());
90-
final var expectedUtilisationReductionAtSource = shardWriteLoad / originalNode0ThreadPoolStats.totalThreadPoolThreads();
91-
final var expectedUtilisationIncreaseAtDestination = shardWriteLoad / originalNode1ThreadPoolStats.totalThreadPoolThreads();
91+
final var expectedUtilisationReductionAtSource = shardWriteLoad / originalNode0ThreadPoolStats.numberOfThreads();
92+
final var expectedUtilisationIncreaseAtDestination = shardWriteLoad / originalNode1ThreadPoolStats.numberOfThreads();
9293

9394
// Some node_0 utilization should have been moved to node_1
94-
if (expectedUtilisationReductionAtSource > originalNode0ThreadPoolStats.averageThreadPoolUtilization()) {
95+
if (expectedUtilisationReductionAtSource > originalNode0ThreadPoolStats.utilizationSamples().getLast().utilization()) {
9596
// We don't return utilization less than zero because that makes no sense
9697
assertThat(getAverageWritePoolUtilization(shardMovementWriteLoadSimulator, "node_0"), equalTo(0.0f));
9798
} else {
9899
assertThat(
99-
(double) originalNode0ThreadPoolStats.averageThreadPoolUtilization() - getAverageWritePoolUtilization(
100+
(double) originalNode0ThreadPoolStats.utilizationSamples().getLast().utilization() - getAverageWritePoolUtilization(
100101
shardMovementWriteLoadSimulator,
101102
"node_0"
102103
),
@@ -105,7 +106,9 @@ public void testMovementOfAShardWillMoveThreadPoolUtilisation() {
105106
}
106107
assertThat(
107108
(double) getAverageWritePoolUtilization(shardMovementWriteLoadSimulator, "node_1") - originalNode1ThreadPoolStats
108-
.averageThreadPoolUtilization(),
109+
.utilizationSamples()
110+
.getLast()
111+
.utilization(),
109112
closeTo(expectedUtilisationIncreaseAtDestination, 0.001f)
110113
);
111114

@@ -117,11 +120,11 @@ public void testMovementOfAShardWillMoveThreadPoolUtilisation() {
117120
// The utilization numbers should return to their original values
118121
assertThat(
119122
getAverageWritePoolUtilization(shardMovementWriteLoadSimulator, "node_0"),
120-
equalTo(originalNode0ThreadPoolStats.averageThreadPoolUtilization())
123+
equalTo(originalNode0ThreadPoolStats.utilizationSamples().getLast().utilization())
121124
);
122125
assertThat(
123126
getAverageWritePoolUtilization(shardMovementWriteLoadSimulator, "node_1"),
124-
equalTo(originalNode1ThreadPoolStats.averageThreadPoolUtilization())
127+
equalTo(originalNode1ThreadPoolStats.utilizationSamples().getLast().utilization())
125128
);
126129
}
127130

@@ -150,14 +153,18 @@ public void testMovementBetweenNodesWithNoThreadPoolAndWriteLoadStats() {
150153
private float getAverageWritePoolUtilization(ShardMovementWriteLoadSimulator shardMovementWriteLoadSimulator, String nodeId) {
151154
final var generatedNodeUsageStates = shardMovementWriteLoadSimulator.simulatedNodeUsageStatsForThreadPools();
152155
final var node0WritePoolStats = generatedNodeUsageStates.get(nodeId).threadPoolUsageStatsMap().get("write");
153-
return node0WritePoolStats.averageThreadPoolUtilization();
156+
return node0WritePoolStats.utilizationSamples().getLast().utilization();
154157
}
155158

156159
private NodeUsageStatsForThreadPools.ThreadPoolUsageStats randomThreadPoolUsageStats() {
157160
return new NodeUsageStatsForThreadPools.ThreadPoolUsageStats(
158161
randomIntBetween(4, 16),
159-
randomBoolean() ? 0.0f : randomFloatBetween(0.1f, 1.0f, true),
160-
randomLongBetween(0, 60_000)
162+
List.of(
163+
new NodeUsageStatsForThreadPools.UtilizationSample(
164+
randomInstantBetween(Instant.MIN, Instant.MAX),
165+
randomBoolean() ? 0.0f : randomFloatBetween(0.1f, 1.0f, true)
166+
)
167+
)
161168
);
162169
}
163170

0 commit comments

Comments
 (0)