summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2021-02-08 11:00:00 +0000
committerGeir Storli <geirst@verizonmedia.com>2021-02-08 11:00:00 +0000
commit69d91455d41b70d9a417c491a468a5e8ee426fd0 (patch)
tree3151543ac64b951ffa79c795097183a694b9a503
parent6a6d1dd303c60bc96b7020ff2c6b2334dea540d5 (diff)
Nodes above limit should only count each node once.
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStats.java11
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java7
2 files changed, 16 insertions, 2 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStats.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStats.java
index c02397cb043..aef5b1be468 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStats.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStats.java
@@ -63,10 +63,9 @@ public class ResourceUsageStats {
maxMemoryUsage = Double.max(maxMemoryUsage, resourceUsageOf(memoryResource, node));
}
}
- int nodesAboveLimit = (feedBlock.isPresent() ? feedBlock.get().getConcreteExhaustions().size() : 0);
return new ResourceUsageStats(maxDiskUsage / limitOf(diskResource, feedBlockLimits),
maxMemoryUsage / limitOf(memoryResource, feedBlockLimits),
- nodesAboveLimit);
+ calculateNodesAboveLimit(feedBlock));
}
private static double resourceUsageOf(String type, ContentNode node) {
@@ -74,6 +73,14 @@ public class ResourceUsageStats {
return result.isPresent() ? result.get().getUsage() : 0.0;
}
+ private static int calculateNodesAboveLimit(Optional<ClusterStateBundle.FeedBlock> feedBlock) {
+ if (!feedBlock.isPresent()) {
+ return 0;
+ }
+ var exhaustions = feedBlock.get().getConcreteExhaustions();
+ return (int) exhaustions.stream().map(resource -> resource.node).distinct().count();
+ }
+
private static double limitOf(String type, Map<String, Double> limits) {
var result = limits.get(type);
return (result != null) ? result : 1.0;
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java
index 0f5d27d46e3..9eeb36265e0 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java
@@ -54,6 +54,13 @@ public class ResourceUsageStatsTest {
assertEquals(2, stats.getNodesAboveLimit());
}
+ @Test
+ public void nodes_above_limit_counts_each_node_only_once() {
+ var stats = ResourceUsageStats.calculateFrom(Collections.emptyList(), Collections.emptyMap(),
+ createFeedBlock(exhaustion(1, "disk"), exhaustion(1, "memory")));
+ assertEquals(1, stats.getNodesAboveLimit());
+ }
+
private static Collection<NodeInfo> createNodeInfo(FeedBlockUtil.NodeAndUsages... nodeAndUsages) {
return createFixtureWithReportedUsages(nodeAndUsages).cluster().getNodeInfo();
}