ACCUMULO-2488 Change criteria for unbalanced servers in concurrent randomwalk
The Concurrent randomwalk test used to consider servers unbalanced if any server's tablet count differed from the cluster average by more than a fifth of the average or by one, whichever was larger. This would cause failures under typical balancings from the default balancer. This commit changes the criterion for an unbalanced server to be double the standard deviation from the cluster average. Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/a4174248 Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/a4174248 Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/a4174248 Branch: refs/heads/master Commit: a4174248a96cadcc79a9de4015c90c6618a96418 Parents: 6df83da Author: Bill Havanki <bhava...@cloudera.com> Authored: Tue Mar 18 09:12:19 2014 -0400 Committer: Bill Havanki <bhava...@cloudera.com> Committed: Tue Mar 18 16:22:22 2014 -0400 ---------------------------------------------------------------------- .../test/randomwalk/concurrent/CheckBalance.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/a4174248/src/server/src/main/java/org/apache/accumulo/server/test/randomwalk/concurrent/CheckBalance.java ---------------------------------------------------------------------- diff --git a/src/server/src/main/java/org/apache/accumulo/server/test/randomwalk/concurrent/CheckBalance.java b/src/server/src/main/java/org/apache/accumulo/server/test/randomwalk/concurrent/CheckBalance.java index d00e2b4..5d0b978 100644 --- a/src/server/src/main/java/org/apache/accumulo/server/test/randomwalk/concurrent/CheckBalance.java +++ b/src/server/src/main/java/org/apache/accumulo/server/test/randomwalk/concurrent/CheckBalance.java @@ -16,6 +16,7 @@ */ package org.apache.accumulo.server.test.randomwalk.concurrent; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -57,9 +58,11 @@ public class CheckBalance extends Test { total += count.longValue(); } final double average = total / counts.size(); - - // Check for even # of tablets on each node - double maxDifference = Math.max(1, average / 5); + final double sd = stddev(counts.values(), average); + log.debug("average " + average + ", standard deviation " + sd); + + // Check for balanced # of tablets on each node + double maxDifference = 2.0 * sd; String unbalancedLocation = null; long lastCount = 0L; boolean balanced = true; @@ -94,4 +97,13 @@ public class CheckBalance extends Test { } } + private static double stddev(Collection<Long> samples, double avg) { + int num = samples.size(); + double sqrtotal = 0.0; + for (Long s : samples) { + double diff = s.doubleValue() - avg; + sqrtotal += diff * diff; + } + return Math.sqrt(sqrtotal / (double) num); + } }