summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeir Storli <geirst@oath.com>2018-02-23 13:54:24 +0100
committerGeir Storli <geirst@oath.com>2018-02-27 09:37:08 +0100
commitc23d4254fbeb47d110814046c70a08a4e2afcd12 (patch)
tree3fbd66bc7494aa147b29392fa60b9333d3e56fbf
parente6e2aeb2cb91ea389ccc4bb4c3eefad41e28f8b7 (diff)
Track whether BucketSpaceStats is valid or not.
-rw-r--r--clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStats.java16
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsAggregatorTest.java2
-rw-r--r--clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStatsTest.java49
3 files changed, 64 insertions, 3 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStats.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStats.java
index cefb3c3c31f..d47ce45216e 100644
--- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStats.java
+++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStats.java
@@ -14,20 +14,23 @@ public class ContentNodeStats {
private Map<String, BucketSpaceStats> bucketSpaces = new HashMap<>();
public static class BucketSpaceStats {
+ private boolean invalid;
private long bucketsTotal;
private long bucketsPending;
private BucketSpaceStats() {
+ this.invalid = true;
this.bucketsTotal = 0;
this.bucketsPending = 0;
}
private BucketSpaceStats(long bucketsTotal, long bucketsPending) {
+ this.invalid = false;
this.bucketsTotal = bucketsTotal;
this.bucketsPending = bucketsPending;
}
- public static BucketSpaceStats empty() {
+ public static BucketSpaceStats invalid() {
return new BucketSpaceStats();
}
@@ -43,7 +46,16 @@ public class ContentNodeStats {
return bucketsPending;
}
+ public boolean mayHaveBucketsPending() {
+ return (bucketsPending > 0) || invalid;
+ }
+
+ public boolean valid() {
+ return !invalid;
+ }
+
public void merge(BucketSpaceStats rhs, int factor) {
+ this.invalid |= rhs.invalid;
this.bucketsTotal += (factor * rhs.bucketsTotal);
this.bucketsPending += (factor * rhs.bucketsPending);
}
@@ -76,7 +88,7 @@ public class ContentNodeStats {
BucketSpaceStats.of(stats.getBucketStats().getTotal(),
stats.getBucketStats().getPending()));
} else {
- this.bucketSpaces.put(stats.getName(), BucketSpaceStats.empty());
+ this.bucketSpaces.put(stats.getName(), BucketSpaceStats.invalid());
}
}
}
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsAggregatorTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsAggregatorTest.java
index c92d414aac8..e132e4d5750 100644
--- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsAggregatorTest.java
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterStatsAggregatorTest.java
@@ -21,7 +21,7 @@ public class ClusterStatsAggregatorTest {
return add(nodeIndex, bucketSpace, ContentNodeStats.BucketSpaceStats.of(bucketsTotal, bucketsPending));
}
public StatsBuilder add(int nodeIndex, String bucketSpace) {
- return add(nodeIndex, bucketSpace, ContentNodeStats.BucketSpaceStats.empty());
+ return add(nodeIndex, bucketSpace, ContentNodeStats.BucketSpaceStats.invalid());
}
public StatsBuilder add(int nodeIndex, String bucketSpace, ContentNodeStats.BucketSpaceStats bucketSpaceStats) {
Map<String, ContentNodeStats.BucketSpaceStats> contentNodeStats = stats.get(nodeIndex);
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStatsTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStatsTest.java
new file mode 100644
index 00000000000..7bd8be73e66
--- /dev/null
+++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ContentNodeStatsTest.java
@@ -0,0 +1,49 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.clustercontroller.core;
+
+import org.junit.Test;
+
+import static com.yahoo.vespa.clustercontroller.core.ContentNodeStats.BucketSpaceStats;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ContentNodeStatsTest {
+
+ @Test
+ public void valid_bucket_space_stats_can_be_invalid_after_merge() {
+ BucketSpaceStats stats = BucketSpaceStats.of(5,1);
+ assertTrue(stats.valid());
+
+ stats.merge(BucketSpaceStats.invalid(), 1);
+ assertFalse(stats.valid());
+ assertEquals(5, stats.getBucketsTotal());
+ assertEquals(1, stats.getBucketsPending());
+ }
+
+ @Test
+ public void invalid_bucket_space_stats_is_still_invalid_after_merge() {
+ BucketSpaceStats stats = BucketSpaceStats.invalid();
+ assertFalse(stats.valid());
+
+ stats.merge(BucketSpaceStats.of(5, 1), 1);
+ assertFalse(stats.valid());
+ assertEquals(5, stats.getBucketsTotal());
+ assertEquals(1, stats.getBucketsPending());
+ }
+
+ @Test
+ public void invalid_bucket_space_stats_may_have_pending_buckets() {
+ assertTrue(BucketSpaceStats.invalid().mayHaveBucketsPending());
+ }
+
+ @Test
+ public void valid_bucket_space_stats_may_have_pending_buckets() {
+ assertTrue(BucketSpaceStats.of(5, 1).mayHaveBucketsPending());
+ }
+
+ @Test
+ public void valid_bucket_space_stats_may_have_no_pending_buckets() {
+ assertFalse(BucketSpaceStats.of(5, 0).mayHaveBucketsPending());
+ }
+}