diff options
author | Geir Storli <geirst@oath.com> | 2018-02-23 13:54:24 +0100 |
---|---|---|
committer | Geir Storli <geirst@oath.com> | 2018-02-27 09:37:08 +0100 |
commit | c23d4254fbeb47d110814046c70a08a4e2afcd12 (patch) | |
tree | 3fbd66bc7494aa147b29392fa60b9333d3e56fbf | |
parent | e6e2aeb2cb91ea389ccc4bb4c3eefad41e28f8b7 (diff) |
Track whether BucketSpaceStats is valid or not.
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()); + } +} |