Skip to content

Commit 2b0153b

Browse files
authored
Move individual stats fields to AsyncRefresh (#135052)
Only the overall ClusterInfo is needed at the top level. This PR moves the individual intermediate stats fields onto AsyncRefresh to avoid potential misuses. Relates: #133630 (comment)
1 parent 43741c2 commit 2b0153b

File tree

1 file changed

+33
-46
lines changed

1 file changed

+33
-46
lines changed

server/src/main/java/org/elasticsearch/cluster/InternalClusterInfoService.java

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,6 @@ public class InternalClusterInfoService implements ClusterInfoService, ClusterSt
100100
private volatile TimeValue updateFrequency;
101101
private volatile TimeValue fetchTimeout;
102102

103-
private volatile Map<String, DiskUsage> leastAvailableSpaceUsages;
104-
private volatile Map<String, DiskUsage> mostAvailableSpaceUsages;
105-
private volatile Map<String, ByteSizeValue> maxHeapPerNode;
106-
private volatile Map<String, Long> estimatedHeapUsagePerNode;
107-
private volatile Map<String, NodeUsageStatsForThreadPools> nodeThreadPoolUsageStatsPerNode;
108-
private volatile IndicesStatsSummary indicesStatsSummary;
109-
110103
private final ThreadPool threadPool;
111104
private final Client client;
112105
private final Supplier<ClusterState> clusterStateSupplier;
@@ -131,12 +124,6 @@ public InternalClusterInfoService(
131124
EstimatedHeapUsageCollector estimatedHeapUsageCollector,
132125
NodeUsageStatsForThreadPoolsCollector nodeUsageStatsForThreadPoolsCollector
133126
) {
134-
this.leastAvailableSpaceUsages = Map.of();
135-
this.mostAvailableSpaceUsages = Map.of();
136-
this.maxHeapPerNode = Map.of();
137-
this.estimatedHeapUsagePerNode = Map.of();
138-
this.nodeThreadPoolUsageStatsPerNode = Map.of();
139-
this.indicesStatsSummary = IndicesStatsSummary.EMPTY;
140127
this.threadPool = threadPool;
141128
this.client = client;
142129
this.estimatedHeapUsageCollector = estimatedHeapUsageCollector;
@@ -210,6 +197,13 @@ public void clusterChanged(ClusterChangedEvent event) {
210197

211198
private class AsyncRefresh {
212199

200+
private volatile Map<String, DiskUsage> leastAvailableSpaceUsages;
201+
private volatile Map<String, DiskUsage> mostAvailableSpaceUsages;
202+
private volatile Map<String, ByteSizeValue> maxHeapPerNode;
203+
private volatile Map<String, Long> estimatedHeapUsagePerNode;
204+
private volatile Map<String, NodeUsageStatsForThreadPools> nodeThreadPoolUsageStatsPerNode;
205+
private volatile IndicesStatsSummary indicesStatsSummary;
206+
213207
private final List<ActionListener<ClusterInfo>> thisRefreshListeners;
214208
private final RefCountingRunnable fetchRefs = new RefCountingRunnable(this::callListeners);
215209

@@ -475,6 +469,32 @@ private void callListeners() {
475469
onRefreshComplete(this);
476470
}
477471
}
472+
473+
private ClusterInfo updateAndGetCurrentClusterInfo() {
474+
final IndicesStatsSummary indicesStatsSummary = this.indicesStatsSummary; // single volatile read
475+
final Map<String, EstimatedHeapUsage> estimatedHeapUsages = new HashMap<>();
476+
final var currentMaxHeapPerNode = this.maxHeapPerNode; // Make sure we use a consistent view
477+
currentMaxHeapPerNode.forEach((nodeId, maxHeapSize) -> {
478+
final Long estimatedHeapUsage = estimatedHeapUsagePerNode.get(nodeId);
479+
if (estimatedHeapUsage != null) {
480+
estimatedHeapUsages.put(nodeId, new EstimatedHeapUsage(nodeId, maxHeapSize.getBytes(), estimatedHeapUsage));
481+
}
482+
});
483+
final var newClusterInfo = new ClusterInfo(
484+
leastAvailableSpaceUsages,
485+
mostAvailableSpaceUsages,
486+
indicesStatsSummary.shardSizes,
487+
indicesStatsSummary.shardDataSetSizes,
488+
indicesStatsSummary.dataPath,
489+
indicesStatsSummary.reservedSpace,
490+
estimatedHeapUsages,
491+
nodeThreadPoolUsageStatsPerNode,
492+
indicesStatsSummary.shardWriteLoads(),
493+
currentMaxHeapPerNode
494+
);
495+
currentClusterInfo = newClusterInfo;
496+
return newClusterInfo;
497+
}
478498
}
479499

480500
private void onRefreshComplete(AsyncRefresh completedRefresh) {
@@ -542,39 +562,6 @@ public ClusterInfo getClusterInfo() {
542562
return currentClusterInfo;
543563
}
544564

545-
/**
546-
* Compute and return a new ClusterInfo from the most recently fetched stats and update {@link #currentClusterInfo} to it.
547-
* Note the method is called when a {@link AsyncRefresh} has received all the stats it requested. Since there can only be
548-
* a single AsyncRefresh at a time, the various stats used to compose the final results are guaranteed to be from a single
549-
* refresh cycle for consistency. Note that users of this class must call {@link #getClusterInfo()} to get the latest
550-
* computed and cached ClusterInfo and avoid accessing individual stats directly.
551-
*/
552-
private ClusterInfo updateAndGetCurrentClusterInfo() {
553-
final IndicesStatsSummary indicesStatsSummary = this.indicesStatsSummary; // single volatile read
554-
final Map<String, EstimatedHeapUsage> estimatedHeapUsages = new HashMap<>();
555-
final var currentMaxHeapPerNode = this.maxHeapPerNode; // Make sure we use a consistent view
556-
currentMaxHeapPerNode.forEach((nodeId, maxHeapSize) -> {
557-
final Long estimatedHeapUsage = estimatedHeapUsagePerNode.get(nodeId);
558-
if (estimatedHeapUsage != null) {
559-
estimatedHeapUsages.put(nodeId, new EstimatedHeapUsage(nodeId, maxHeapSize.getBytes(), estimatedHeapUsage));
560-
}
561-
});
562-
final var newClusterInfo = new ClusterInfo(
563-
leastAvailableSpaceUsages,
564-
mostAvailableSpaceUsages,
565-
indicesStatsSummary.shardSizes,
566-
indicesStatsSummary.shardDataSetSizes,
567-
indicesStatsSummary.dataPath,
568-
indicesStatsSummary.reservedSpace,
569-
estimatedHeapUsages,
570-
nodeThreadPoolUsageStatsPerNode,
571-
indicesStatsSummary.shardWriteLoads(),
572-
currentMaxHeapPerNode
573-
);
574-
currentClusterInfo = newClusterInfo;
575-
return newClusterInfo;
576-
}
577-
578565
// allow tests to adjust the node stats on receipt
579566
List<NodeStats> adjustNodesStats(List<NodeStats> nodeStats) {
580567
return nodeStats;

0 commit comments

Comments
 (0)